test: update tests to validate error codes

This commit is contained in:
A-440Hz committed 2022-03-09 15:23:22 -08:00
1 parent 4656760fb8
commit 9e1fb04057
4 files changed
+118 -60

No files matched your search

+9 -5
View File
@@ -74,18 +74,18 @@ func getCatalogSecrets(in *structpb.Struct) (*CatalogSecrets, error) {
var err error
result.AccessKeyId, err = getStringValue(in, constAccessKeyId, true)
if err != nil {
badFields["access_key_id"] = err.Error()
badFields[fmt.Sprintf("secrets.%s", constAccessKeyId)] = err.Error()
}
delete(unknownFields, constAccessKeyId)
result.SecretAccessKey, err = getStringValue(in, constSecretAccessKey, true)
if err != nil {
badFields["secret_access_key"] = err.Error()
badFields[fmt.Sprintf("secrets.%s", constSecretAccessKey)] = err.Error()
}
delete(unknownFields, constSecretAccessKey)
for s := range unknownFields {
badFields[fmt.Sprintf("attributes.%s", s)] = "Unrecognized field"
badFields[fmt.Sprintf("secrets.%s", s)] = "Unrecognized field"
}
if len(badFields) > 0 {
@@ -108,9 +108,13 @@ func getSetAttributes(in *structpb.Struct) (*SetAttributes, error) {
// here for now. Make this more complex if we add more attributes
// to host sets.
unknownFields := structFields(in)
badFields := make(map[string]string)
delete(unknownFields, constDescribeInstancesFilters)
if len(unknownFields) != 0 {
return nil, status.Errorf(codes.InvalidArgument, "unknown set attribute fields provided: %s", keysAsString(unknownFields))
for a := range unknownFields {
badFields[fmt.Sprintf("attributes.%s", a)] = "Unrecognized field"
}
if len(badFields) > 0 {
return nil, invalidArgumentError("Error in the attributes provided", badFields)
}
// Mapstructure complains if it expects a slice as output and sees a scalar
+8 -2
View File
@@ -5,6 +5,8 @@ import (
"time"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/structpb"
)
@@ -68,6 +70,7 @@ func TestGetCatalogAttributes(t *testing.T) {
if tc.expectedErrContains != "" {
require.Error(err)
require.Contains(err.Error(), tc.expectedErrContains)
require.Equal(status.Code(err), codes.InvalidArgument)
return
}
@@ -104,7 +107,7 @@ func TestGetCatalogSecrets(t *testing.T) {
"foo": true,
"bar": true,
}),
expectedErrContains: "attributes.bar: Unrecognized field, attributes.foo: Unrecognized field",
expectedErrContains: "secrets.bar: Unrecognized field, secrets.foo: Unrecognized field",
},
{
name: "good",
@@ -127,6 +130,7 @@ func TestGetCatalogSecrets(t *testing.T) {
if tc.expectedErrContains != "" {
require.Error(err)
require.Contains(err.Error(), tc.expectedErrContains)
require.Equal(status.Code(err), codes.InvalidArgument)
return
}
@@ -170,7 +174,7 @@ func TestGetSetAttributes(t *testing.T) {
"foo": true,
"bar": true,
}),
expectedErrContains: "unknown set attribute fields provided: bar, foo",
expectedErrContains: "attributes.bar: Unrecognized field, attributes.foo: Unrecognized field",
},
{
name: "good",
@@ -194,6 +198,7 @@ func TestGetSetAttributes(t *testing.T) {
if tc.expectedErrContains != "" {
require.Error(err)
require.Contains(err.Error(), tc.expectedErrContains)
require.Equal(status.Code(err), codes.InvalidArgument)
return
}
@@ -414,6 +419,7 @@ func TestValidateRegion(t *testing.T) {
err := validateRegion(tc.in)
if tc.expectedErr != "" {
require.Contains(err.Error(), tc.expectedErr)
require.Equal(status.Code(err), codes.InvalidArgument)
return
}
+11 -11
View File
@@ -70,7 +70,7 @@ func (p *AwsPlugin) OnCreateCatalog(ctx context.Context, req *pb.OnCreateCatalog
withSecretAccessKey(catalogSecrets.SecretAccessKey),
}, p.testStateOpts...)...)
if err != nil {
return nil, fmt.Errorf("error setting up persisted state: %w", err)
return nil, status.Errorf(codes.InvalidArgument, "error setting up persisted state: %s", err)
}
// Try to rotate the credentials if we're not skipping them.
@@ -198,7 +198,7 @@ func (p *AwsPlugin) OnDeleteCatalog(ctx context.Context, req *pb.OnDeleteCatalog
// credentials to ensure that it has the proper permissions to do
// it.
if err := state.DeleteCreds(); err != nil {
return nil, status.Errorf(codes.FailedPrecondition, "error removing rotated credentials during catalog deletion: %s", err)
return nil, status.Errorf(codes.Aborted, "error removing rotated credentials during catalog deletion: %s", err)
}
}
@@ -218,11 +218,11 @@ func (p *AwsPlugin) OnCreateSet(ctx context.Context, req *pb.OnCreateSetRequest)
catalogAttributes, err := getCatalogAttributes(catalogAttrsRaw)
if err != nil {
return nil, fmt.Errorf("integrity error in host catalog attributes: %w", err)
return nil, err
}
if err := validateRegion(catalogAttributes.Region); err != nil {
return nil, fmt.Errorf("integrity error in host catalog attributes: %w", err)
return nil, err
}
state, err := awsCatalogPersistedStateFromProto(req.GetPersisted(), p.testStateOpts...)
@@ -240,7 +240,7 @@ func (p *AwsPlugin) OnCreateSet(ctx context.Context, req *pb.OnCreateSetRequest)
}
setAttrs, err := getSetAttributes(set.GetAttributes())
if err != nil {
return nil, fmt.Errorf("error parsing set attributes: %w", err)
return nil, err
}
ec2Client, err := state.EC2Client(catalogAttributes.Region)
@@ -279,11 +279,11 @@ func (p *AwsPlugin) OnUpdateSet(ctx context.Context, req *pb.OnUpdateSetRequest)
catalogAttributes, err := getCatalogAttributes(catalogAttrsRaw)
if err != nil {
return nil, fmt.Errorf("integrity error in host catalog attributes: %w", err)
return nil, err
}
if err := validateRegion(catalogAttributes.Region); err != nil {
return nil, fmt.Errorf("integrity error in host catalog attributes: %w", err)
return nil, err
}
state, err := awsCatalogPersistedStateFromProto(req.GetPersisted(), p.testStateOpts...)
@@ -303,7 +303,7 @@ func (p *AwsPlugin) OnUpdateSet(ctx context.Context, req *pb.OnUpdateSetRequest)
}
setAttrs, err := getSetAttributes(set.GetAttributes())
if err != nil {
return nil, fmt.Errorf("error parsing set attributes: %w", err)
return nil, err
}
ec2Client, err := state.EC2Client(catalogAttributes.Region)
@@ -348,11 +348,11 @@ func (p *AwsPlugin) ListHosts(ctx context.Context, req *pb.ListHostsRequest) (*p
catalogAttributes, err := getCatalogAttributes(catalogAttrsRaw)
if err != nil {
return nil, fmt.Errorf("integrity error in host catalog attributes: %w", err)
return nil, err
}
if err := validateRegion(catalogAttributes.Region); err != nil {
return nil, fmt.Errorf("integrity error in host catalog attributes: %w", err)
return nil, err
}
state, err := awsCatalogPersistedStateFromProto(req.GetPersisted(), p.testStateOpts...)
@@ -385,7 +385,7 @@ func (p *AwsPlugin) ListHosts(ctx context.Context, req *pb.ListHostsRequest) (*p
}
setAttrs, err := getSetAttributes(set.GetAttributes())
if err != nil {
return nil, fmt.Errorf("error parsing set attributes: %w", err)
return nil, err
}
input, err := buildDescribeInstancesInput(setAttrs, false)
+90 -42
View File
@@ -14,6 +14,8 @@ import (
pb "github.com/hashicorp/boundary/sdk/pbs/plugin"
"github.com/hashicorp/go-secure-stdlib/awsutil"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/structpb"
)
@@ -23,11 +25,13 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
req *pb.OnCreateCatalogRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrCode codes.Code
}{
{
name: "nil catalog",
req: &pb.OnCreateCatalogRequest{},
expectedErrContains: "catalog is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil secrets",
@@ -35,6 +39,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
Catalog: &hostcatalogs.HostCatalog{},
},
expectedErrContains: "secrets are required",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil attributes",
@@ -44,6 +49,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "attributes are required",
expectedErrCode: codes.InvalidArgument,
},
{
name: "error reading attributes",
@@ -54,6 +60,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "missing required value \"region\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "error reading secrets",
@@ -66,6 +73,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "missing required value \"access_key_id\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "invalid region",
@@ -81,6 +89,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "not a valid region: foobar",
expectedErrCode: codes.InvalidArgument,
},
{
name: "persisted state setup error",
@@ -101,6 +110,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
},
},
expectedErrContains: fmt.Sprintf("error setting up persisted state: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "rotation error",
@@ -125,6 +135,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error during credential rotation: error rotating credentials: error calling CreateAccessKey: error calling aws.GetUser: %s", testGetUserErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "validation error",
@@ -150,6 +161,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error during credential validation: error validating credentials: %s", testGetCallerIdentityErr),
expectedErrCode: codes.InvalidArgument,
},
}
@@ -162,6 +174,7 @@ func TestPluginOnCreateCatalogErr(t *testing.T) {
}
_, err := p.OnCreateCatalog(context.Background(), tc.req)
require.Contains(err.Error(), tc.expectedErrContains)
require.Equal(status.Code(err).String(), tc.expectedErrCode.String())
})
}
}
@@ -172,11 +185,13 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
req *pb.OnUpdateCatalogRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrCode codes.Code
}{
{
name: "nil new catalog",
req: &pb.OnUpdateCatalogRequest{},
expectedErrContains: "new catalog is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil new attributes",
@@ -186,6 +201,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "new catalog missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "error reading attributes",
@@ -196,6 +212,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "missing required value \"region\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "invalid region",
@@ -207,6 +224,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "not a valid region: foobar",
expectedErrCode: codes.InvalidArgument,
},
{
name: "persisted state setup error",
@@ -230,6 +248,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
},
},
expectedErrContains: fmt.Sprintf("error loading persisted state: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "cannot disable rotation for already rotated credentials",
@@ -249,6 +268,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "cannot disable rotation for already-rotated credentials",
expectedErrCode: codes.FailedPrecondition,
},
{
name: "error reading secrets",
@@ -268,6 +288,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
},
},
expectedErrContains: "missing required value \"access_key_id\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "updating secrets, replace error",
@@ -300,6 +321,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error attempting to replace credentials: error deleting old access key: %s", testDeleteAccessKeyErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "rotation error",
@@ -326,6 +348,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error during credential rotation: error rotating credentials: error calling CreateAccessKey: error calling aws.GetUser: %s", testGetUserErr),
expectedErrCode: codes.InvalidArgument,
},
}
@@ -338,6 +361,7 @@ func TestPluginOnUpdateCatalogErr(t *testing.T) {
}
_, err := p.OnUpdateCatalog(context.Background(), tc.req)
require.Contains(err.Error(), tc.expectedErrContains)
require.Equal(status.Code(err).String(), tc.expectedErrCode.String())
})
}
}
@@ -348,6 +372,7 @@ func TestPluginOnDeleteCatalogErr(t *testing.T) {
req *pb.OnDeleteCatalogRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrCode codes.Code
}{
{
name: "persisted state setup error",
@@ -371,6 +396,7 @@ func TestPluginOnDeleteCatalogErr(t *testing.T) {
},
},
expectedErrContains: fmt.Sprintf("error loading persisted state: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "delete error",
@@ -398,6 +424,7 @@ func TestPluginOnDeleteCatalogErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error removing rotated credentials during catalog deletion: error deleting old access key: %s", testDeleteAccessKeyErr),
expectedErrCode: codes.Aborted,
},
}
@@ -410,22 +437,24 @@ func TestPluginOnDeleteCatalogErr(t *testing.T) {
}
_, err := p.OnDeleteCatalog(context.Background(), tc.req)
require.Contains(err.Error(), tc.expectedErrContains)
require.Equal(status.Code(err).String(), tc.expectedErrCode.String())
})
}
}
func TestPluginOnCreateSetErr(t *testing.T) {
cases := []struct {
name string
req *pb.OnCreateSetRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrContains2 string
name string
req *pb.OnCreateSetRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrCode codes.Code
}{
{
name: "nil catalog",
req: &pb.OnCreateSetRequest{},
expectedErrContains: "catalog is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil catalog attributes",
@@ -435,6 +464,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
},
},
expectedErrContains: "catalog missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "error reading catalog attributes",
@@ -444,8 +474,8 @@ func TestPluginOnCreateSetErr(t *testing.T) {
Attributes: new(structpb.Struct),
},
},
expectedErrContains: "integrity error in host catalog attributes: ",
expectedErrContains2: "missing required value \"region\"",
expectedErrContains: "missing required value \"region\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "invalid region",
@@ -456,8 +486,8 @@ func TestPluginOnCreateSetErr(t *testing.T) {
}),
},
},
expectedErrContains: "integrity error in host catalog attributes: ",
expectedErrContains2: "not a valid region: foobar",
expectedErrContains: "not a valid region: foobar",
expectedErrCode: codes.InvalidArgument,
},
{
name: "persisted state setup error",
@@ -481,6 +511,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
},
},
expectedErrContains: fmt.Sprintf("error loading persisted state: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil set",
@@ -499,6 +530,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
},
},
expectedErrContains: "set is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil attributes in set",
@@ -518,6 +550,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
Set: &hostsets.HostSet{},
},
expectedErrContains: "set missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "set attribute load error",
@@ -541,8 +574,8 @@ func TestPluginOnCreateSetErr(t *testing.T) {
}),
},
},
expectedErrContains: "error parsing set attributes: ",
expectedErrContains2: "unknown set attribute fields provided: bar, foo",
expectedErrContains: "attributes.bar: Unrecognized field, attributes.foo: Unrecognized field",
expectedErrCode: codes.InvalidArgument,
},
{
name: "client load error",
@@ -571,6 +604,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error getting EC2 client: error getting AWS session: error reading options in NewCredentialsConfig: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "DescribeInstances error",
@@ -600,6 +634,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
)),
},
expectedErrContains: fmt.Sprintf("error performing dry run of DescribeInstances: %s", testDescribeInstancesError),
expectedErrCode: codes.InvalidArgument,
},
{
name: "DescribeInstances non-error array filter",
@@ -628,6 +663,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
)),
},
expectedErrContains: "query error: DescribeInstances DryRun should have returned error, but none was found",
expectedErrCode: codes.FailedPrecondition,
},
{
name: "DescribeInstances non-error string filter",
@@ -656,6 +692,7 @@ func TestPluginOnCreateSetErr(t *testing.T) {
)),
},
expectedErrContains: "query error: DescribeInstances DryRun should have returned error, but none was found",
expectedErrCode: codes.FailedPrecondition,
},
}
@@ -668,25 +705,24 @@ func TestPluginOnCreateSetErr(t *testing.T) {
}
_, err := p.OnCreateSet(context.Background(), tc.req)
require.Contains(err.Error(), tc.expectedErrContains)
if tc.expectedErrContains2 != "" {
require.Contains(err.Error(), tc.expectedErrContains2)
}
require.Equal(status.Code(err).String(), tc.expectedErrCode.String())
})
}
}
func TestPluginOnUpdateSetErr(t *testing.T) {
cases := []struct {
name string
req *pb.OnUpdateSetRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrContains2 string
name string
req *pb.OnUpdateSetRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrCode codes.Code
}{
{
name: "nil catalog",
req: &pb.OnUpdateSetRequest{},
expectedErrContains: "catalog is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil catalog attributes",
@@ -696,6 +732,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
},
},
expectedErrContains: "catalog missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "catalog attribute load error",
@@ -705,8 +742,8 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
Attributes: new(structpb.Struct),
},
},
expectedErrContains: "integrity error in host catalog attributes: ",
expectedErrContains2: "missing required value \"region\"",
expectedErrContains: "missing required value \"region\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "invalid region",
@@ -718,8 +755,8 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
}),
},
},
expectedErrContains: "integrity error in host catalog attributes: ",
expectedErrContains2: "not a valid region: foobar",
expectedErrContains: "not a valid region: foobar",
expectedErrCode: codes.InvalidArgument,
},
{
name: "persisted state setup error",
@@ -743,6 +780,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
},
},
expectedErrContains: fmt.Sprintf("error loading persisted state: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil set",
@@ -761,6 +799,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
},
},
expectedErrContains: "new set is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil attributes in set",
@@ -780,6 +819,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
NewSet: &hostsets.HostSet{},
},
expectedErrContains: "new set missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "set attribute load error",
@@ -803,8 +843,8 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
}),
},
},
expectedErrContains: "error parsing set attributes: ",
expectedErrContains2: "unknown set attribute fields provided: bar, foo",
expectedErrContains: "attributes.bar: Unrecognized field, attributes.foo: Unrecognized field",
expectedErrCode: codes.InvalidArgument,
},
{
name: "client load error",
@@ -833,6 +873,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error getting EC2 client: error getting AWS session: error reading options in NewCredentialsConfig: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "DescribeInstances error",
@@ -862,6 +903,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
)),
},
expectedErrContains: fmt.Sprintf("error performing dry run of DescribeInstances: %s", testDescribeInstancesError),
expectedErrCode: codes.InvalidArgument,
},
{
name: "DescribeInstances non-error",
@@ -890,6 +932,7 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
)),
},
expectedErrContains: "query error: DescribeInstances DryRun should have returned error, but none was found",
expectedErrCode: codes.FailedPrecondition,
},
}
@@ -902,25 +945,24 @@ func TestPluginOnUpdateSetErr(t *testing.T) {
}
_, err := p.OnUpdateSet(context.Background(), tc.req)
require.Contains(err.Error(), tc.expectedErrContains)
if tc.expectedErrContains2 != "" {
require.Contains(err.Error(), tc.expectedErrContains2)
}
require.Equal(status.Code(err).String(), tc.expectedErrCode.String())
})
}
}
func TestPluginListHostsErr(t *testing.T) {
cases := []struct {
name string
req *pb.ListHostsRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrContains2 string
name string
req *pb.ListHostsRequest
opts []awsCatalogPersistedStateOption
expectedErrContains string
expectedErrCode codes.Code
}{
{
name: "nil catalog",
req: &pb.ListHostsRequest{},
expectedErrContains: "catalog is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil catalog attributes",
@@ -930,6 +972,7 @@ func TestPluginListHostsErr(t *testing.T) {
},
},
expectedErrContains: "catalog missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "error reading catalog attributes",
@@ -939,8 +982,8 @@ func TestPluginListHostsErr(t *testing.T) {
Attributes: new(structpb.Struct),
},
},
expectedErrContains: "integrity error in host catalog attributes: ",
expectedErrContains2: "missing required value \"region\"",
expectedErrContains: "attributes.region: missing required value \"region\"",
expectedErrCode: codes.InvalidArgument,
},
{
name: "invalid region",
@@ -952,8 +995,8 @@ func TestPluginListHostsErr(t *testing.T) {
}),
},
},
expectedErrContains: "integrity error in host catalog attributes: ",
expectedErrContains2: "not a valid region: foobar",
expectedErrContains: "not a valid region: ",
expectedErrCode: codes.InvalidArgument,
},
{
name: "persisted state setup error",
@@ -977,6 +1020,7 @@ func TestPluginListHostsErr(t *testing.T) {
},
},
expectedErrContains: fmt.Sprintf("error loading persisted state: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "nil sets",
@@ -995,6 +1039,7 @@ func TestPluginListHostsErr(t *testing.T) {
},
},
expectedErrContains: "sets is nil",
expectedErrCode: codes.InvalidArgument,
},
{
name: "set missing id",
@@ -1014,6 +1059,7 @@ func TestPluginListHostsErr(t *testing.T) {
Sets: []*hostsets.HostSet{&hostsets.HostSet{}},
},
expectedErrContains: "set missing id",
expectedErrCode: codes.InvalidArgument,
},
{
name: "set missing attributes",
@@ -1037,6 +1083,7 @@ func TestPluginListHostsErr(t *testing.T) {
},
},
expectedErrContains: "set missing attributes",
expectedErrCode: codes.InvalidArgument,
},
{
name: "set attribute load error",
@@ -1063,8 +1110,8 @@ func TestPluginListHostsErr(t *testing.T) {
},
},
},
expectedErrContains: "error parsing set attributes: ",
expectedErrContains2: "unknown set attribute fields provided: bar, foo",
expectedErrContains: "attributes.bar: Unrecognized field, attributes.foo: Unrecognized field",
expectedErrCode: codes.InvalidArgument,
},
{
name: "client load error",
@@ -1096,6 +1143,7 @@ func TestPluginListHostsErr(t *testing.T) {
}),
},
expectedErrContains: fmt.Sprintf("error getting EC2 client: error getting AWS session: error reading options in NewCredentialsConfig: %s", testOptionErr),
expectedErrCode: codes.InvalidArgument,
},
{
name: "DescribeInstances error",
@@ -1128,6 +1176,7 @@ func TestPluginListHostsErr(t *testing.T) {
)),
},
expectedErrContains: fmt.Sprintf("error running DescribeInstances for host set id \"foobar\": %s", testDescribeInstancesError),
expectedErrCode: codes.InvalidArgument,
},
{
name: "awsInstanceToHost error",
@@ -1172,6 +1221,7 @@ func TestPluginListHostsErr(t *testing.T) {
)),
},
expectedErrContains: "error processing host results for host set id \"foobar\": response integrity error: missing instance id",
expectedErrCode: codes.InvalidArgument,
},
}
@@ -1184,9 +1234,7 @@ func TestPluginListHostsErr(t *testing.T) {
}
_, err := p.ListHosts(context.Background(), tc.req)
require.Contains(err.Error(), tc.expectedErrContains)
if tc.expectedErrContains2 != "" {
require.Contains(err.Error(), tc.expectedErrContains2)
}
require.Equal(status.Code(err).String(), tc.expectedErrCode.String())
})
}
}