From 3a8accb55c913410d4d2b56be883a2ac482ea2b8 Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 20:19:31 +0100 Subject: [PATCH 1/9] inspector: Migrate to AWS SDK v2 --- go.mod | 1 + go.sum | 2 ++ internal/conns/awsclient_gen.go | 6 +++--- names/data/names_data.hcl | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a06ee9a2225..e79c226c4f2 100644 --- a/go.mod +++ b/go.mod @@ -118,6 +118,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/healthlake v1.26.3 github.com/aws/aws-sdk-go-v2/service/iam v1.34.3 github.com/aws/aws-sdk-go-v2/service/identitystore v1.25.3 + github.com/aws/aws-sdk-go-v2/service/inspector v1.23.3 github.com/aws/aws-sdk-go-v2/service/inspector2 v1.28.3 github.com/aws/aws-sdk-go-v2/service/internetmonitor v1.16.3 github.com/aws/aws-sdk-go-v2/service/iot v1.55.3 diff --git a/go.sum b/go.sum index 6b34fe84473..28b31415ff7 100644 --- a/go.sum +++ b/go.sum @@ -256,6 +256,8 @@ github.com/aws/aws-sdk-go-v2/service/iam v1.34.3 h1:p4L/tixJ3JUIxCteMGT6oMlqCbEv github.com/aws/aws-sdk-go-v2/service/iam v1.34.3/go.mod h1:rfOWxxwdecWvSC9C2/8K/foW3Blf+aKnIIPP9kQ2DPE= github.com/aws/aws-sdk-go-v2/service/identitystore v1.25.3 h1:eiL4q6pEzvazErz3gBOoP9hDm3Ul8pV69Qn7BrPARrU= github.com/aws/aws-sdk-go-v2/service/identitystore v1.25.3/go.mod h1:oNDSqrUg2dofbodrdr9fBzJ6dX8Lkh/2xN7LXXdvr5A= +github.com/aws/aws-sdk-go-v2/service/inspector v1.23.3 h1:PeYP2Fdsdh/M5qDytEwc6wjjrG22MNxD5xFHEosCS2k= +github.com/aws/aws-sdk-go-v2/service/inspector v1.23.3/go.mod h1:vbORvzmTKicdDc7cyWs9vh1YiSUC2PJE/PvvDlfTC2s= github.com/aws/aws-sdk-go-v2/service/inspector2 v1.28.3 h1:dscyhNwL1v6pYPCflnp8/jBMeCC5y5Vn8npXmM/EE78= github.com/aws/aws-sdk-go-v2/service/inspector2 v1.28.3/go.mod h1:EI8IxOq2F4KHZQQEB4rmQPXmYILE2avtX6wOiR8A5XQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8= diff --git a/internal/conns/awsclient_gen.go b/internal/conns/awsclient_gen.go index 803afa93c39..d94941a0691 100644 --- a/internal/conns/awsclient_gen.go +++ b/internal/conns/awsclient_gen.go @@ -110,6 +110,7 @@ import ( healthlake_sdkv2 "github.com/aws/aws-sdk-go-v2/service/healthlake" iam_sdkv2 "github.com/aws/aws-sdk-go-v2/service/iam" identitystore_sdkv2 "github.com/aws/aws-sdk-go-v2/service/identitystore" + inspector_sdkv2 "github.com/aws/aws-sdk-go-v2/service/inspector" inspector2_sdkv2 "github.com/aws/aws-sdk-go-v2/service/inspector2" internetmonitor_sdkv2 "github.com/aws/aws-sdk-go-v2/service/internetmonitor" iot_sdkv2 "github.com/aws/aws-sdk-go-v2/service/iot" @@ -220,7 +221,6 @@ import ( glue_sdkv1 "github.com/aws/aws-sdk-go/service/glue" guardduty_sdkv1 "github.com/aws/aws-sdk-go/service/guardduty" imagebuilder_sdkv1 "github.com/aws/aws-sdk-go/service/imagebuilder" - inspector_sdkv1 "github.com/aws/aws-sdk-go/service/inspector" ivs_sdkv1 "github.com/aws/aws-sdk-go/service/ivs" kinesisanalytics_sdkv1 "github.com/aws/aws-sdk-go/service/kinesisanalytics" kinesisanalyticsv2_sdkv1 "github.com/aws/aws-sdk-go/service/kinesisanalyticsv2" @@ -742,8 +742,8 @@ func (c *AWSClient) ImageBuilderConn(ctx context.Context) *imagebuilder_sdkv1.Im return errs.Must(conn[*imagebuilder_sdkv1.Imagebuilder](ctx, c, names.ImageBuilder, make(map[string]any))) } -func (c *AWSClient) InspectorConn(ctx context.Context) *inspector_sdkv1.Inspector { - return errs.Must(conn[*inspector_sdkv1.Inspector](ctx, c, names.Inspector, make(map[string]any))) +func (c *AWSClient) InspectorClient(ctx context.Context) *inspector_sdkv2.Client { + return errs.Must(client[*inspector_sdkv2.Client](ctx, c, names.Inspector, make(map[string]any))) } func (c *AWSClient) Inspector2Client(ctx context.Context) *inspector2_sdkv2.Client { diff --git a/names/data/names_data.hcl b/names/data/names_data.hcl index c0a14595d88..2b3ae48559f 100644 --- a/names/data/names_data.hcl +++ b/names/data/names_data.hcl @@ -4428,7 +4428,7 @@ service "inspector" { sdk { id = "Inspector" - client_version = [1] + client_version = [2] } names { From 0f15b934e31dd3c1c76e55c6d2b9ffebfcd4d736 Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 20:26:49 +0100 Subject: [PATCH 2/9] make gen --- internal/service/inspector/generate.go | 2 +- .../service_endpoint_resolver_gen.go | 66 ++++---- .../inspector/service_endpoints_gen_test.go | 146 +++++++++++++++--- .../service/inspector/service_package_gen.go | 28 ++-- internal/service/inspector/tags.go | 16 +- internal/service/inspector/tags_gen.go | 26 ++-- 6 files changed, 188 insertions(+), 96 deletions(-) diff --git a/internal/service/inspector/generate.go b/internal/service/inspector/generate.go index 9d8fab53ce5..b0c454dd7b1 100644 --- a/internal/service/inspector/generate.go +++ b/internal/service/inspector/generate.go @@ -1,7 +1,7 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 -//go:generate go run ../../generate/tags/main.go -ListTags -ServiceTagsSlice +//go:generate go run ../../generate/tags/main.go -AWSSDKVersion=2 -ListTags -ServiceTagsSlice //go:generate go run ../../generate/servicepackage/main.go // ONLY generate directives and package declaration! Do not add anything else to this file. diff --git a/internal/service/inspector/service_endpoint_resolver_gen.go b/internal/service/inspector/service_endpoint_resolver_gen.go index ec8bc211f5b..8a62f5e1183 100644 --- a/internal/service/inspector/service_endpoint_resolver_gen.go +++ b/internal/service/inspector/service_endpoint_resolver_gen.go @@ -6,65 +6,63 @@ import ( "context" "fmt" "net" - "net/url" - endpoints_sdkv1 "github.com/aws/aws-sdk-go/aws/endpoints" + aws_sdkv2 "github.com/aws/aws-sdk-go-v2/aws" + inspector_sdkv2 "github.com/aws/aws-sdk-go-v2/service/inspector" + smithyendpoints "github.com/aws/smithy-go/endpoints" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/hashicorp/terraform-provider-aws/internal/errs" ) -var _ endpoints_sdkv1.Resolver = resolverSDKv1{} +var _ inspector_sdkv2.EndpointResolverV2 = resolverSDKv2{} -type resolverSDKv1 struct { - ctx context.Context +type resolverSDKv2 struct { + defaultResolver inspector_sdkv2.EndpointResolverV2 } -func newEndpointResolverSDKv1(ctx context.Context) resolverSDKv1 { - return resolverSDKv1{ - ctx: ctx, +func newEndpointResolverSDKv2() resolverSDKv2 { + return resolverSDKv2{ + defaultResolver: inspector_sdkv2.NewDefaultEndpointResolverV2(), } } -func (r resolverSDKv1) EndpointFor(service, region string, opts ...func(*endpoints_sdkv1.Options)) (endpoint endpoints_sdkv1.ResolvedEndpoint, err error) { - ctx := r.ctx +func (r resolverSDKv2) ResolveEndpoint(ctx context.Context, params inspector_sdkv2.EndpointParameters) (endpoint smithyendpoints.Endpoint, err error) { + params = params.WithDefaults() + useFIPS := aws_sdkv2.ToBool(params.UseFIPS) - var opt endpoints_sdkv1.Options - opt.Set(opts...) - - useFIPS := opt.UseFIPSEndpoint == endpoints_sdkv1.FIPSEndpointStateEnabled + if eps := params.Endpoint; aws_sdkv2.ToString(eps) != "" { + tflog.Debug(ctx, "setting endpoint", map[string]any{ + "tf_aws.endpoint": endpoint, + }) - defaultResolver := endpoints_sdkv1.DefaultResolver() + if useFIPS { + tflog.Debug(ctx, "endpoint set, ignoring UseFIPSEndpoint setting") + params.UseFIPS = aws_sdkv2.Bool(false) + } - if useFIPS { + return r.defaultResolver.ResolveEndpoint(ctx, params) + } else if useFIPS { ctx = tflog.SetField(ctx, "tf_aws.use_fips", useFIPS) - endpoint, err = defaultResolver.EndpointFor(service, region, opts...) + endpoint, err = r.defaultResolver.ResolveEndpoint(ctx, params) if err != nil { return endpoint, err } tflog.Debug(ctx, "endpoint resolved", map[string]any{ - "tf_aws.endpoint": endpoint.URL, + "tf_aws.endpoint": endpoint.URI.String(), }) - var endpointURL *url.URL - endpointURL, err = url.Parse(endpoint.URL) - if err != nil { - return endpoint, err - } - - hostname := endpointURL.Hostname() + hostname := endpoint.URI.Hostname() _, err = net.LookupHost(hostname) if err != nil { if dnsErr, ok := errs.As[*net.DNSError](err); ok && dnsErr.IsNotFound { tflog.Debug(ctx, "default endpoint host not found, disabling FIPS", map[string]any{ "tf_aws.hostname": hostname, }) - opts = append(opts, func(o *endpoints_sdkv1.Options) { - o.UseFIPSEndpoint = endpoints_sdkv1.FIPSEndpointStateDisabled - }) + params.UseFIPS = aws_sdkv2.Bool(false) } else { - err = fmt.Errorf("looking up accessanalyzer endpoint %q: %s", hostname, err) + err = fmt.Errorf("looking up inspector endpoint %q: %s", hostname, err) return } } else { @@ -72,5 +70,13 @@ func (r resolverSDKv1) EndpointFor(service, region string, opts ...func(*endpoin } } - return defaultResolver.EndpointFor(service, region, opts...) + return r.defaultResolver.ResolveEndpoint(ctx, params) +} + +func withBaseEndpoint(endpoint string) func(*inspector_sdkv2.Options) { + return func(o *inspector_sdkv2.Options) { + if endpoint != "" { + o.BaseEndpoint = aws_sdkv2.String(endpoint) + } + } } diff --git a/internal/service/inspector/service_endpoints_gen_test.go b/internal/service/inspector/service_endpoints_gen_test.go index 4c24b3db9a6..90a745ed872 100644 --- a/internal/service/inspector/service_endpoints_gen_test.go +++ b/internal/service/inspector/service_endpoints_gen_test.go @@ -4,18 +4,22 @@ package inspector_test import ( "context" + "errors" "fmt" "maps" "net" "net/url" "os" "path/filepath" + "reflect" "strings" "testing" - aws_sdkv1 "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/endpoints" - inspector_sdkv1 "github.com/aws/aws-sdk-go/service/inspector" + aws_sdkv2 "github.com/aws/aws-sdk-go-v2/aws" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + inspector_sdkv2 "github.com/aws/aws-sdk-go-v2/service/inspector" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" "github.com/google/go-cmp/cmp" "github.com/hashicorp/aws-sdk-go-base/v2/servicemocks" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -240,54 +244,63 @@ func TestEndpointConfiguration(t *testing.T) { //nolint:paralleltest // uses t.S } func defaultEndpoint(region string) (url.URL, error) { - r := endpoints.DefaultResolver() + r := inspector_sdkv2.NewDefaultEndpointResolverV2() - ep, err := r.EndpointFor(inspector_sdkv1.EndpointsID, region) + ep, err := r.ResolveEndpoint(context.Background(), inspector_sdkv2.EndpointParameters{ + Region: aws_sdkv2.String(region), + }) if err != nil { return url.URL{}, err } - url, _ := url.Parse(ep.URL) - - if url.Path == "" { - url.Path = "/" + if ep.URI.Path == "" { + ep.URI.Path = "/" } - return *url, nil + return ep.URI, nil } func defaultFIPSEndpoint(region string) (url.URL, error) { - r := endpoints.DefaultResolver() + r := inspector_sdkv2.NewDefaultEndpointResolverV2() - ep, err := r.EndpointFor(inspector_sdkv1.EndpointsID, region, func(opt *endpoints.Options) { - opt.UseFIPSEndpoint = endpoints.FIPSEndpointStateEnabled + ep, err := r.ResolveEndpoint(context.Background(), inspector_sdkv2.EndpointParameters{ + Region: aws_sdkv2.String(region), + UseFIPS: aws_sdkv2.Bool(true), }) if err != nil { return url.URL{}, err } - url, _ := url.Parse(ep.URL) - - if url.Path == "" { - url.Path = "/" + if ep.URI.Path == "" { + ep.URI.Path = "/" } - return *url, nil + return ep.URI, nil } func callService(ctx context.Context, t *testing.T, meta *conns.AWSClient) apiCallParams { t.Helper() - client := meta.InspectorConn(ctx) + client := meta.InspectorClient(ctx) - req, _ := client.ListRulesPackagesRequest(&inspector_sdkv1.ListRulesPackagesInput{}) + var result apiCallParams - req.HTTPRequest.URL.Path = "/" - - return apiCallParams{ - endpoint: req.HTTPRequest.URL.String(), - region: aws_sdkv1.StringValue(client.Config.Region), + _, err := client.ListRulesPackages(ctx, &inspector_sdkv2.ListRulesPackagesInput{}, + func(opts *inspector_sdkv2.Options) { + opts.APIOptions = append(opts.APIOptions, + addRetrieveEndpointURLMiddleware(t, &result.endpoint), + addRetrieveRegionMiddleware(&result.region), + addCancelRequestMiddleware(), + ) + }, + ) + if err == nil { + t.Fatal("Expected an error, got none") + } else if !errors.Is(err, errCancelOperation) { + t.Fatalf("Unexpected error: %s", err) } + + return result } func withNoConfig(_ *caseSetup) { @@ -466,6 +479,89 @@ func testEndpointCase(t *testing.T, region string, testcase endpointTestCase, ca } } +func addRetrieveEndpointURLMiddleware(t *testing.T, endpoint *string) func(*middleware.Stack) error { + return func(stack *middleware.Stack) error { + return stack.Finalize.Add( + retrieveEndpointURLMiddleware(t, endpoint), + middleware.After, + ) + } +} + +func retrieveEndpointURLMiddleware(t *testing.T, endpoint *string) middleware.FinalizeMiddleware { + return middleware.FinalizeMiddlewareFunc( + "Test: Retrieve Endpoint", + func(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (middleware.FinalizeOutput, middleware.Metadata, error) { + t.Helper() + + request, ok := in.Request.(*smithyhttp.Request) + if !ok { + t.Fatalf("Expected *github.com/aws/smithy-go/transport/http.Request, got %s", fullTypeName(in.Request)) + } + + url := request.URL + url.RawQuery = "" + url.Path = "/" + + *endpoint = url.String() + + return next.HandleFinalize(ctx, in) + }) +} + +func addRetrieveRegionMiddleware(region *string) func(*middleware.Stack) error { + return func(stack *middleware.Stack) error { + return stack.Serialize.Add( + retrieveRegionMiddleware(region), + middleware.After, + ) + } +} + +func retrieveRegionMiddleware(region *string) middleware.SerializeMiddleware { + return middleware.SerializeMiddlewareFunc( + "Test: Retrieve Region", + func(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (middleware.SerializeOutput, middleware.Metadata, error) { + *region = awsmiddleware.GetRegion(ctx) + + return next.HandleSerialize(ctx, in) + }, + ) +} + +var errCancelOperation = fmt.Errorf("Test: Canceling request") + +func addCancelRequestMiddleware() func(*middleware.Stack) error { + return func(stack *middleware.Stack) error { + return stack.Finalize.Add( + cancelRequestMiddleware(), + middleware.After, + ) + } +} + +// cancelRequestMiddleware creates a Smithy middleware that intercepts the request before sending and cancels it +func cancelRequestMiddleware() middleware.FinalizeMiddleware { + return middleware.FinalizeMiddlewareFunc( + "Test: Cancel Requests", + func(_ context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (middleware.FinalizeOutput, middleware.Metadata, error) { + return middleware.FinalizeOutput{}, middleware.Metadata{}, errCancelOperation + }) +} + +func fullTypeName(i interface{}) string { + return fullValueTypeName(reflect.ValueOf(i)) +} + +func fullValueTypeName(v reflect.Value) string { + if v.Kind() == reflect.Ptr { + return "*" + fullValueTypeName(reflect.Indirect(v)) + } + + requestType := v.Type() + return fmt.Sprintf("%s.%s", requestType.PkgPath(), requestType.Name()) +} + func generateSharedConfigFile(config configFile) string { var buf strings.Builder diff --git a/internal/service/inspector/service_package_gen.go b/internal/service/inspector/service_package_gen.go index 060b15894db..99aa0f1fac4 100644 --- a/internal/service/inspector/service_package_gen.go +++ b/internal/service/inspector/service_package_gen.go @@ -5,10 +5,8 @@ package inspector import ( "context" - aws_sdkv1 "github.com/aws/aws-sdk-go/aws" - session_sdkv1 "github.com/aws/aws-sdk-go/aws/session" - inspector_sdkv1 "github.com/aws/aws-sdk-go/service/inspector" - "github.com/hashicorp/terraform-plugin-log/tflog" + aws_sdkv2 "github.com/aws/aws-sdk-go-v2/aws" + inspector_sdkv2 "github.com/aws/aws-sdk-go-v2/service/inspector" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/types" "github.com/hashicorp/terraform-provider-aws/names" @@ -58,22 +56,14 @@ func (p *servicePackage) ServicePackageName() string { return names.Inspector } -// NewConn returns a new AWS SDK for Go v1 client for this service package's AWS API. -func (p *servicePackage) NewConn(ctx context.Context, config map[string]any) (*inspector_sdkv1.Inspector, error) { - sess := config[names.AttrSession].(*session_sdkv1.Session) +// NewClient returns a new AWS SDK for Go v2 client for this service package's AWS API. +func (p *servicePackage) NewClient(ctx context.Context, config map[string]any) (*inspector_sdkv2.Client, error) { + cfg := *(config["aws_sdkv2_config"].(*aws_sdkv2.Config)) - cfg := aws_sdkv1.Config{} - - if endpoint := config[names.AttrEndpoint].(string); endpoint != "" { - tflog.Debug(ctx, "setting endpoint", map[string]any{ - "tf_aws.endpoint": endpoint, - }) - cfg.Endpoint = aws_sdkv1.String(endpoint) - } else { - cfg.EndpointResolver = newEndpointResolverSDKv1(ctx) - } - - return inspector_sdkv1.New(sess.Copy(&cfg)), nil + return inspector_sdkv2.NewFromConfig(cfg, + inspector_sdkv2.WithEndpointResolverV2(newEndpointResolverSDKv2()), + withBaseEndpoint(config[names.AttrEndpoint].(string)), + ), nil } func ServicePackage(ctx context.Context) conns.ServicePackage { diff --git a/internal/service/inspector/tags.go b/internal/service/inspector/tags.go index a0d5b4d86da..67f5d1af674 100644 --- a/internal/service/inspector/tags.go +++ b/internal/service/inspector/tags.go @@ -10,9 +10,9 @@ import ( "context" "fmt" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" - "github.com/aws/aws-sdk-go/service/inspector/inspectoriface" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-provider-aws/internal/conns" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" "github.com/hashicorp/terraform-provider-aws/names" @@ -22,7 +22,7 @@ import ( // updateTags updates Inspector Classic resource tags. // The identifier is the resource ARN. -func updateTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifier string, oldTagsMap, newTagsMap any) error { +func updateTags(ctx context.Context, conn *inspector.Client, identifier string, oldTagsMap, newTagsMap any) error { oldTags := tftags.New(ctx, oldTagsMap) newTags := tftags.New(ctx, newTagsMap).IgnoreSystem(names.Inspector) @@ -32,7 +32,7 @@ func updateTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifie Tags: Tags(newTags), } - _, err := conn.SetTagsForResourceWithContext(ctx, input) + _, err := conn.SetTagsForResource(ctx, input) if err != nil { return fmt.Errorf("tagging resource (%s): %w", identifier, err) @@ -42,7 +42,7 @@ func updateTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifie ResourceArn: aws.String(identifier), } - _, err := conn.SetTagsForResourceWithContext(ctx, input) + _, err := conn.SetTagsForResource(ctx, input) if err != nil { return fmt.Errorf("untagging resource (%s): %w", identifier, err) @@ -52,7 +52,7 @@ func updateTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifie return nil } -func createTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifier string, tags []*inspector.Tag) error { +func createTags(ctx context.Context, conn *inspector.Client, identifier string, tags []awstypes.Tag) error { if len(tags) == 0 { return nil } @@ -63,5 +63,5 @@ func createTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifie // UpdateTags updates Inspector Classic service tags. // It is called from outside this package. func (p *servicePackage) UpdateTags(ctx context.Context, meta any, identifier string, oldTags, newTags any) error { - return updateTags(ctx, meta.(*conns.AWSClient).InspectorConn(ctx), identifier, oldTags, newTags) + return updateTags(ctx, meta.(*conns.AWSClient).InspectorClient(ctx), identifier, oldTags, newTags) } diff --git a/internal/service/inspector/tags_gen.go b/internal/service/inspector/tags_gen.go index d4d7e73099d..256ef185f90 100644 --- a/internal/service/inspector/tags_gen.go +++ b/internal/service/inspector/tags_gen.go @@ -4,9 +4,9 @@ package inspector import ( "context" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" - "github.com/aws/aws-sdk-go/service/inspector/inspectoriface" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-provider-aws/internal/conns" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" "github.com/hashicorp/terraform-provider-aws/internal/types/option" @@ -15,12 +15,12 @@ import ( // listTags lists inspector service tags. // The identifier is typically the Amazon Resource Name (ARN), although // it may also be a different identifier depending on the service. -func listTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifier string) (tftags.KeyValueTags, error) { +func listTags(ctx context.Context, conn *inspector.Client, identifier string, optFns ...func(*inspector.Options)) (tftags.KeyValueTags, error) { input := &inspector.ListTagsForResourceInput{ ResourceArn: aws.String(identifier), } - output, err := conn.ListTagsForResourceWithContext(ctx, input) + output, err := conn.ListTagsForResource(ctx, input, optFns...) if err != nil { return tftags.New(ctx, nil), err @@ -32,7 +32,7 @@ func listTags(ctx context.Context, conn inspectoriface.InspectorAPI, identifier // ListTags lists inspector service tags and set them in Context. // It is called from outside this package. func (p *servicePackage) ListTags(ctx context.Context, meta any, identifier string) error { - tags, err := listTags(ctx, meta.(*conns.AWSClient).InspectorConn(ctx), identifier) + tags, err := listTags(ctx, meta.(*conns.AWSClient).InspectorClient(ctx), identifier) if err != nil { return err @@ -48,11 +48,11 @@ func (p *servicePackage) ListTags(ctx context.Context, meta any, identifier stri // []*SERVICE.Tag handling // Tags returns inspector service tags. -func Tags(tags tftags.KeyValueTags) []*inspector.Tag { - result := make([]*inspector.Tag, 0, len(tags)) +func Tags(tags tftags.KeyValueTags) []awstypes.Tag { + result := make([]awstypes.Tag, 0, len(tags)) for k, v := range tags.Map() { - tag := &inspector.Tag{ + tag := awstypes.Tag{ Key: aws.String(k), Value: aws.String(v), } @@ -64,11 +64,11 @@ func Tags(tags tftags.KeyValueTags) []*inspector.Tag { } // KeyValueTags creates tftags.KeyValueTags from inspector service tags. -func KeyValueTags(ctx context.Context, tags []*inspector.Tag) tftags.KeyValueTags { +func KeyValueTags(ctx context.Context, tags []awstypes.Tag) tftags.KeyValueTags { m := make(map[string]*string, len(tags)) for _, tag := range tags { - m[aws.StringValue(tag.Key)] = tag.Value + m[aws.ToString(tag.Key)] = tag.Value } return tftags.New(ctx, m) @@ -76,7 +76,7 @@ func KeyValueTags(ctx context.Context, tags []*inspector.Tag) tftags.KeyValueTag // getTagsIn returns inspector service tags from Context. // nil is returned if there are no input tags. -func getTagsIn(ctx context.Context) []*inspector.Tag { +func getTagsIn(ctx context.Context) []awstypes.Tag { if inContext, ok := tftags.FromContext(ctx); ok { if tags := Tags(inContext.TagsIn.UnwrapOrDefault()); len(tags) > 0 { return tags @@ -87,7 +87,7 @@ func getTagsIn(ctx context.Context) []*inspector.Tag { } // setTagsOut sets inspector service tags in Context. -func setTagsOut(ctx context.Context, tags []*inspector.Tag) { +func setTagsOut(ctx context.Context, tags []awstypes.Tag) { if inContext, ok := tftags.FromContext(ctx); ok { inContext.TagsOut = option.Some(KeyValueTags(ctx, tags)) } From 74e04c16aba57377b07fe5765d569d8ead7c8db9 Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 20:27:35 +0100 Subject: [PATCH 3/9] gopatch --- .../service/inspector/assessment_target.go | 38 ++++++++-------- .../inspector/assessment_target_test.go | 23 +++++----- .../service/inspector/assessment_template.go | 44 ++++++++++--------- .../inspector/assessment_template_test.go | 36 ++++++++------- internal/service/inspector/find.go | 11 ++--- internal/service/inspector/resource_group.go | 31 ++++++------- .../service/inspector/resource_group_test.go | 17 +++---- .../inspector/rules_packages_data_source.go | 12 ++--- 8 files changed, 112 insertions(+), 100 deletions(-) diff --git a/internal/service/inspector/assessment_target.go b/internal/service/inspector/assessment_target.go index 953a779cf83..1af3f1db689 100644 --- a/internal/service/inspector/assessment_target.go +++ b/internal/service/inspector/assessment_target.go @@ -8,13 +8,15 @@ import ( "log" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" - "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" + "github.com/hashicorp/aws-sdk-go-base/v2/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs" "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" "github.com/hashicorp/terraform-provider-aws/names" @@ -51,7 +53,7 @@ func ResourceAssessmentTarget() *schema.Resource { func resourceAssessmentTargetCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) input := &inspector.CreateAssessmentTargetInput{ AssessmentTargetName: aws.String(d.Get(names.AttrName).(string)), @@ -61,19 +63,19 @@ func resourceAssessmentTargetCreate(ctx context.Context, d *schema.ResourceData, input.ResourceGroupArn = aws.String(v.(string)) } - resp, err := conn.CreateAssessmentTargetWithContext(ctx, input) + resp, err := conn.CreateAssessmentTarget(ctx, input) if err != nil { return sdkdiag.AppendErrorf(diags, "creating Inspector Classic Assessment Target: %s", err) } - d.SetId(aws.StringValue(resp.AssessmentTargetArn)) + d.SetId(aws.ToString(resp.AssessmentTargetArn)) return append(diags, resourceAssessmentTargetRead(ctx, d, meta)...) } func resourceAssessmentTargetRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) assessmentTarget, err := DescribeAssessmentTarget(ctx, conn, d.Id()) @@ -96,7 +98,7 @@ func resourceAssessmentTargetRead(ctx context.Context, d *schema.ResourceData, m func resourceAssessmentTargetUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) input := inspector.UpdateAssessmentTargetInput{ AssessmentTargetArn: aws.String(d.Id()), @@ -107,7 +109,7 @@ func resourceAssessmentTargetUpdate(ctx context.Context, d *schema.ResourceData, input.ResourceGroupArn = aws.String(v.(string)) } - _, err := conn.UpdateAssessmentTargetWithContext(ctx, &input) + _, err := conn.UpdateAssessmentTarget(ctx, &input) if err != nil { return sdkdiag.AppendErrorf(diags, "updating Inspector Classic Assessment Target (%s): %s", d.Id(), err) } @@ -117,14 +119,14 @@ func resourceAssessmentTargetUpdate(ctx context.Context, d *schema.ResourceData, func resourceAssessmentTargetDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) input := &inspector.DeleteAssessmentTargetInput{ AssessmentTargetArn: aws.String(d.Id()), } err := retry.RetryContext(ctx, 60*time.Minute, func() *retry.RetryError { - _, err := conn.DeleteAssessmentTargetWithContext(ctx, input) + _, err := conn.DeleteAssessmentTarget(ctx, input) - if tfawserr.ErrCodeEquals(err, inspector.ErrCodeAssessmentRunInProgressException) { + if errs.IsA[*awstypes.AssessmentRunInProgressException](err) { return retry.RetryableError(err) } @@ -135,7 +137,7 @@ func resourceAssessmentTargetDelete(ctx context.Context, d *schema.ResourceData, return nil }) if tfresource.TimedOut(err) { - _, err = conn.DeleteAssessmentTargetWithContext(ctx, input) + _, err = conn.DeleteAssessmentTarget(ctx, input) } if err != nil { return sdkdiag.AppendErrorf(diags, "deleting Inspector Classic Assessment Target: %s", err) @@ -143,14 +145,14 @@ func resourceAssessmentTargetDelete(ctx context.Context, d *schema.ResourceData, return diags } -func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Inspector, arn string) (*inspector.AssessmentTarget, error) { +func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Client, arn string) (*awstypes.AssessmentTarget, error) { input := &inspector.DescribeAssessmentTargetsInput{ AssessmentTargetArns: []*string{aws.String(arn)}, } - output, err := conn.DescribeAssessmentTargetsWithContext(ctx, input) + output, err := conn.DescribeAssessmentTargets(ctx, input) - if tfawserr.ErrCodeEquals(err, inspector.ErrCodeInvalidInputException) { + if errs.IsA[*awstypes.InvalidInputException](err) { return nil, nil } @@ -158,9 +160,9 @@ func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Inspector, ar return nil, err } - var assessmentTarget *inspector.AssessmentTarget + var assessmentTarget *awstypes.AssessmentTarget for _, target := range output.AssessmentTargets { - if aws.StringValue(target.Arn) == arn { + if aws.ToString(target.Arn) == arn { assessmentTarget = target break } diff --git a/internal/service/inspector/assessment_target_test.go b/internal/service/inspector/assessment_target_test.go index 57ab87c2547..7643b84a634 100644 --- a/internal/service/inspector/assessment_target_test.go +++ b/internal/service/inspector/assessment_target_test.go @@ -9,7 +9,8 @@ import ( "testing" "github.com/YakDriver/regexache" - "github.com/aws/aws-sdk-go/service/inspector" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" @@ -21,7 +22,7 @@ import ( func TestAccInspectorAssessmentTarget_basic(t *testing.T) { ctx := acctest.Context(t) - var assessmentTarget1 inspector.AssessmentTarget + var assessmentTarget1 awstypes.AssessmentTarget rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resourceName := "aws_inspector_assessment_target.test" @@ -51,7 +52,7 @@ func TestAccInspectorAssessmentTarget_basic(t *testing.T) { func TestAccInspectorAssessmentTarget_disappears(t *testing.T) { ctx := acctest.Context(t) - var assessmentTarget1 inspector.AssessmentTarget + var assessmentTarget1 awstypes.AssessmentTarget rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resourceName := "aws_inspector_assessment_target.test" @@ -75,7 +76,7 @@ func TestAccInspectorAssessmentTarget_disappears(t *testing.T) { func TestAccInspectorAssessmentTarget_name(t *testing.T) { ctx := acctest.Context(t) - var assessmentTarget1, assessmentTarget2 inspector.AssessmentTarget + var assessmentTarget1, assessmentTarget2 awstypes.AssessmentTarget rName1 := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) rName2 := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resourceName := "aws_inspector_assessment_target.test" @@ -111,7 +112,7 @@ func TestAccInspectorAssessmentTarget_name(t *testing.T) { func TestAccInspectorAssessmentTarget_resourceGroupARN(t *testing.T) { ctx := acctest.Context(t) - var assessmentTarget1, assessmentTarget2, assessmentTarget3, assessmentTarget4 inspector.AssessmentTarget + var assessmentTarget1, assessmentTarget2, assessmentTarget3, assessmentTarget4 awstypes.AssessmentTarget rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) inspectorResourceGroupResourceName1 := "aws_inspector_resource_group.test1" inspectorResourceGroupResourceName2 := "aws_inspector_resource_group.test2" @@ -162,7 +163,7 @@ func TestAccInspectorAssessmentTarget_resourceGroupARN(t *testing.T) { func testAccCheckTargetAssessmentDestroy(ctx context.Context) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) for _, rs := range s.RootModule().Resources { if rs.Type != "aws_inspector_assessment_target" { @@ -184,14 +185,14 @@ func testAccCheckTargetAssessmentDestroy(ctx context.Context) resource.TestCheck } } -func testAccCheckTargetExists(ctx context.Context, name string, target *inspector.AssessmentTarget) resource.TestCheckFunc { +func testAccCheckTargetExists(ctx context.Context, name string, target *awstypes.AssessmentTarget) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { return fmt.Errorf("Not found: %s", name) } - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) assessmentTarget, err := tfinspector.DescribeAssessmentTarget(ctx, conn, rs.Primary.ID) @@ -209,15 +210,15 @@ func testAccCheckTargetExists(ctx context.Context, name string, target *inspecto } } -func testAccCheckTargetDisappears(ctx context.Context, assessmentTarget *inspector.AssessmentTarget) resource.TestCheckFunc { +func testAccCheckTargetDisappears(ctx context.Context, assessmentTarget *awstypes.AssessmentTarget) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) input := &inspector.DeleteAssessmentTargetInput{ AssessmentTargetArn: assessmentTarget.Arn, } - _, err := conn.DeleteAssessmentTargetWithContext(ctx, input) + _, err := conn.DeleteAssessmentTarget(ctx, input) return err } diff --git a/internal/service/inspector/assessment_template.go b/internal/service/inspector/assessment_template.go index d04312a4513..89e4ec1496c 100644 --- a/internal/service/inspector/assessment_template.go +++ b/internal/service/inspector/assessment_template.go @@ -7,14 +7,18 @@ import ( "context" "log" - "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" + // "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/service/inspector" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/create" + "github.com/hashicorp/terraform-provider-aws/internal/enum" "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" "github.com/hashicorp/terraform-provider-aws/internal/flex" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" @@ -57,7 +61,7 @@ func ResourceAssessmentTemplate() *schema.Resource { "event": { Type: schema.TypeString, Required: true, - ValidateFunc: validation.StringInSlice(inspector.Event_Values(), false), + ValidateFunc: enum.Validate[awstypes.Event](), }, names.AttrTopicARN: { Type: schema.TypeString, @@ -93,7 +97,7 @@ func ResourceAssessmentTemplate() *schema.Resource { func resourceAssessmentTemplateCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) name := d.Get(names.AttrName).(string) input := &inspector.CreateAssessmentTemplateInput{ @@ -103,13 +107,13 @@ func resourceAssessmentTemplateCreate(ctx context.Context, d *schema.ResourceDat RulesPackageArns: flex.ExpandStringSet(d.Get("rules_package_arns").(*schema.Set)), } - output, err := conn.CreateAssessmentTemplateWithContext(ctx, input) + output, err := conn.CreateAssessmentTemplate(ctx, input) if err != nil { return sdkdiag.AppendErrorf(diags, "creating Inspector Classic Assessment Template (%s): %s", name, err) } - d.SetId(aws.StringValue(output.AssessmentTemplateArn)) + d.SetId(aws.ToString(output.AssessmentTemplateArn)) if err := createTags(ctx, conn, d.Id(), getTagsIn(ctx)); err != nil { return sdkdiag.AppendErrorf(diags, "setting Inspector Classic Assessment Template (%s) tags: %s", d.Id(), err) @@ -128,10 +132,10 @@ func resourceAssessmentTemplateCreate(ctx context.Context, d *schema.ResourceDat func resourceAssessmentTemplateRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) - resp, err := conn.DescribeAssessmentTemplatesWithContext(ctx, &inspector.DescribeAssessmentTemplatesInput{ - AssessmentTemplateArns: aws.StringSlice([]string{d.Id()}), + resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ + AssessmentTemplateArns: []string{d.Id()}, }) if err != nil { return sdkdiag.AppendErrorf(diags, "reading Inspector Classic Assessment Template (%s): %s", d.Id(), err) @@ -145,11 +149,11 @@ func resourceAssessmentTemplateRead(ctx context.Context, d *schema.ResourceData, template := resp.AssessmentTemplates[0] - arn := aws.StringValue(template.Arn) + arn := aws.ToString(template.Arn) d.Set(names.AttrARN, arn) d.Set(names.AttrDuration, template.DurationInSeconds) d.Set(names.AttrName, template.Name) - d.Set("rules_package_arns", aws.StringValueSlice(template.RulesPackageArns)) + d.Set("rules_package_arns", template.RulesPackageArns) d.Set(names.AttrTargetARN, template.AssessmentTargetArn) output, err := findSubscriptionsByAssessmentTemplateARN(ctx, conn, arn) @@ -167,7 +171,7 @@ func resourceAssessmentTemplateRead(ctx context.Context, d *schema.ResourceData, func resourceAssessmentTemplateUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) if d.HasChange("event_subscription") { old, new := d.GetChange("event_subscription") @@ -196,10 +200,10 @@ func resourceAssessmentTemplateUpdate(ctx context.Context, d *schema.ResourceDat func resourceAssessmentTemplateDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) log.Printf("[INFO] Deleting Inspector Classic Assessment Template: %s", d.Id()) - _, err := conn.DeleteAssessmentTemplateWithContext(ctx, &inspector.DeleteAssessmentTemplateInput{ + _, err := conn.DeleteAssessmentTemplate(ctx, &inspector.DeleteAssessmentTemplateInput{ AssessmentTemplateArn: aws.String(d.Id()), }) @@ -246,7 +250,7 @@ func expandEventSubscription(tfMap map[string]interface{}, templateArn *string) return eventSubscription } -func flattenSubscriptions(subscriptions []*inspector.Subscription) []interface{} { +func flattenSubscriptions(subscriptions []*awstypes.Subscription) []interface{} { if len(subscriptions) == 0 { return nil } @@ -270,7 +274,7 @@ func flattenSubscriptions(subscriptions []*inspector.Subscription) []interface{} return tfList } -func flattenEventSubscription(eventSubscription *inspector.EventSubscription, topicArn *string) map[string]interface{} { +func flattenEventSubscription(eventSubscription *awstypes.EventSubscription, topicArn *string) map[string]interface{} { if eventSubscription == nil { return nil } @@ -283,9 +287,9 @@ func flattenEventSubscription(eventSubscription *inspector.EventSubscription, to return tfMap } -func subscribeToEvents(ctx context.Context, conn *inspector.Inspector, eventSubscriptions []*inspector.SubscribeToEventInput) error { +func subscribeToEvents(ctx context.Context, conn *inspector.Client, eventSubscriptions []*inspector.SubscribeToEventInput) error { for _, eventSubscription := range eventSubscriptions { - _, err := conn.SubscribeToEventWithContext(ctx, eventSubscription) + _, err := conn.SubscribeToEvent(ctx, eventSubscription) if err != nil { return create.Error(names.Inspector, create.ErrActionCreating, ResNameAssessmentTemplate, *eventSubscription.TopicArn, err) @@ -295,7 +299,7 @@ func subscribeToEvents(ctx context.Context, conn *inspector.Inspector, eventSubs return nil } -func unsubscribeFromEvents(ctx context.Context, conn *inspector.Inspector, eventSubscriptions []*inspector.SubscribeToEventInput) error { +func unsubscribeFromEvents(ctx context.Context, conn *inspector.Client, eventSubscriptions []*inspector.SubscribeToEventInput) error { for _, eventSubscription := range eventSubscriptions { input := &inspector.UnsubscribeFromEventInput{ Event: eventSubscription.Event, @@ -303,7 +307,7 @@ func unsubscribeFromEvents(ctx context.Context, conn *inspector.Inspector, event TopicArn: eventSubscription.TopicArn, } - _, err := conn.UnsubscribeFromEventWithContext(ctx, input) + _, err := conn.UnsubscribeFromEvent(ctx, input) if err != nil { return create.Error(names.Inspector, create.ErrActionDeleting, ResNameAssessmentTemplate, *eventSubscription.TopicArn, err) diff --git a/internal/service/inspector/assessment_template_test.go b/internal/service/inspector/assessment_template_test.go index e45c12a7a7a..5f783d3a2a5 100644 --- a/internal/service/inspector/assessment_template_test.go +++ b/internal/service/inspector/assessment_template_test.go @@ -9,20 +9,22 @@ import ( "testing" "github.com/YakDriver/regexache" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" - "github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" + "github.com/hashicorp/aws-sdk-go-base/v2/tfawserr" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" "github.com/hashicorp/terraform-provider-aws/internal/acctest" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs" "github.com/hashicorp/terraform-provider-aws/names" ) func TestAccInspectorAssessmentTemplate_basic(t *testing.T) { ctx := acctest.Context(t) - var v inspector.AssessmentTemplate + var v awstypes.AssessmentTemplate resourceName := "aws_inspector_assessment_template.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) @@ -55,7 +57,7 @@ func TestAccInspectorAssessmentTemplate_basic(t *testing.T) { func TestAccInspectorAssessmentTemplate_disappears(t *testing.T) { ctx := acctest.Context(t) - var v inspector.AssessmentTemplate + var v awstypes.AssessmentTemplate resourceName := "aws_inspector_assessment_template.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) @@ -79,7 +81,7 @@ func TestAccInspectorAssessmentTemplate_disappears(t *testing.T) { func TestAccInspectorAssessmentTemplate_tags(t *testing.T) { ctx := acctest.Context(t) - var v inspector.AssessmentTemplate + var v awstypes.AssessmentTemplate resourceName := "aws_inspector_assessment_template.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) @@ -132,7 +134,7 @@ func TestAccInspectorAssessmentTemplate_tags(t *testing.T) { func TestAccInspectorAssessmentTemplate_eventSubscription(t *testing.T) { ctx := acctest.Context(t) - var v inspector.AssessmentTemplate + var v awstypes.AssessmentTemplate resourceName := "aws_inspector_assessment_template.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) @@ -190,20 +192,20 @@ func TestAccInspectorAssessmentTemplate_eventSubscription(t *testing.T) { func testAccCheckTemplateDestroy(ctx context.Context) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) for _, rs := range s.RootModule().Resources { if rs.Type != "aws_inspector_assessment_template" { continue } - resp, err := conn.DescribeAssessmentTemplatesWithContext(ctx, &inspector.DescribeAssessmentTemplatesInput{ + resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ AssessmentTemplateArns: []*string{ aws.String(rs.Primary.ID), }, }) - if tfawserr.ErrCodeEquals(err, inspector.ErrCodeInvalidInputException) { + if errs.IsA[*awstypes.InvalidInputException](err) { continue } @@ -220,11 +222,11 @@ func testAccCheckTemplateDestroy(ctx context.Context) resource.TestCheckFunc { } } -func testAccCheckTemplateDisappears(ctx context.Context, v *inspector.AssessmentTemplate) resource.TestCheckFunc { +func testAccCheckTemplateDisappears(ctx context.Context, v *awstypes.AssessmentTemplate) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) - _, err := conn.DeleteAssessmentTemplateWithContext(ctx, &inspector.DeleteAssessmentTemplateInput{ + _, err := conn.DeleteAssessmentTemplate(ctx, &inspector.DeleteAssessmentTemplateInput{ AssessmentTemplateArn: v.Arn, }) @@ -232,7 +234,7 @@ func testAccCheckTemplateDisappears(ctx context.Context, v *inspector.Assessment } } -func testAccCheckTemplateExists(ctx context.Context, name string, v *inspector.AssessmentTemplate) resource.TestCheckFunc { +func testAccCheckTemplateExists(ctx context.Context, name string, v *awstypes.AssessmentTemplate) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[name] if !ok { @@ -243,10 +245,10 @@ func testAccCheckTemplateExists(ctx context.Context, name string, v *inspector.A return fmt.Errorf("No Inspector Classic Assessment template ID is set") } - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) - resp, err := conn.DescribeAssessmentTemplatesWithContext(ctx, &inspector.DescribeAssessmentTemplatesInput{ - AssessmentTemplateArns: aws.StringSlice([]string{rs.Primary.ID}), + resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ + AssessmentTemplateArns: []string{rs.Primary.ID}, }) if err != nil { return err diff --git a/internal/service/inspector/find.go b/internal/service/inspector/find.go index 8f5565fe1a5..a7d7248d3bb 100644 --- a/internal/service/inspector/find.go +++ b/internal/service/inspector/find.go @@ -6,16 +6,17 @@ package inspector import ( "context" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" ) -func findSubscriptionsByAssessmentTemplateARN(ctx context.Context, conn *inspector.Inspector, arn string) ([]*inspector.Subscription, error) { +func findSubscriptionsByAssessmentTemplateARN(ctx context.Context, conn *inspector.Client, arn string) ([]*awstypes.Subscription, error) { input := &inspector.ListEventSubscriptionsInput{ ResourceArn: aws.String(arn), } - var results []*inspector.Subscription + var results []*awstypes.Subscription err := conn.ListEventSubscriptionsPagesWithContext(ctx, input, func(page *inspector.ListEventSubscriptionsOutput, lastPage bool) bool { if page == nil { @@ -27,7 +28,7 @@ func findSubscriptionsByAssessmentTemplateARN(ctx context.Context, conn *inspect continue } - if aws.StringValue(subscription.ResourceArn) == arn { + if aws.ToString(subscription.ResourceArn) == arn { results = append(results, subscription) } } diff --git a/internal/service/inspector/resource_group.go b/internal/service/inspector/resource_group.go index a27a1b11f98..f0d0f0cd34c 100644 --- a/internal/service/inspector/resource_group.go +++ b/internal/service/inspector/resource_group.go @@ -7,8 +7,9 @@ import ( "context" "log" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" @@ -40,29 +41,29 @@ func ResourceResourceGroup() *schema.Resource { func resourceResourceGroupCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) req := &inspector.CreateResourceGroupInput{ ResourceGroupTags: expandResourceGroupTags(d.Get(names.AttrTags).(map[string]interface{})), } log.Printf("[DEBUG] Creating Inspector Classic Resource Group: %#v", req) - resp, err := conn.CreateResourceGroupWithContext(ctx, req) + resp, err := conn.CreateResourceGroup(ctx, req) if err != nil { return sdkdiag.AppendErrorf(diags, "creating Inspector Classic Resource Group: %s", err) } - d.SetId(aws.StringValue(resp.ResourceGroupArn)) + d.SetId(aws.ToString(resp.ResourceGroupArn)) return append(diags, resourceResourceGroupRead(ctx, d, meta)...) } func resourceResourceGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) - resp, err := conn.DescribeResourceGroupsWithContext(ctx, &inspector.DescribeResourceGroupsInput{ - ResourceGroupArns: aws.StringSlice([]string{d.Id()}), + resp, err := conn.DescribeResourceGroups(ctx, &inspector.DescribeResourceGroupsInput{ + ResourceGroupArns: []string{d.Id()}, }) if err != nil { @@ -71,8 +72,8 @@ func resourceResourceGroupRead(ctx context.Context, d *schema.ResourceData, meta if len(resp.ResourceGroups) == 0 { if failedItem, ok := resp.FailedItems[d.Id()]; ok { - failureCode := aws.StringValue(failedItem.FailureCode) - if failureCode == inspector.FailedItemErrorCodeItemDoesNotExist { + failureCode := aws.ToString(failedItem.FailureCode) + if failureCode == awstypes.FailedItemErrorCodeItemDoesNotExist { log.Printf("[WARN] Inspector Classic Resource Group (%s) not found, removing from state", d.Id()) d.SetId("") return diags @@ -100,11 +101,11 @@ func resourceResourceGroupDelete(ctx context.Context, d *schema.ResourceData, me return diags } -func expandResourceGroupTags(m map[string]interface{}) []*inspector.ResourceGroupTag { - var result []*inspector.ResourceGroupTag +func expandResourceGroupTags(m map[string]interface{}) []*awstypes.ResourceGroupTag { + var result []*awstypes.ResourceGroupTag for k, v := range m { - result = append(result, &inspector.ResourceGroupTag{ + result = append(result, &awstypes.ResourceGroupTag{ Key: aws.String(k), Value: aws.String(v.(string)), }) @@ -113,11 +114,11 @@ func expandResourceGroupTags(m map[string]interface{}) []*inspector.ResourceGrou return result } -func flattenResourceGroupTags(tags []*inspector.ResourceGroupTag) map[string]interface{} { +func flattenResourceGroupTags(tags []*awstypes.ResourceGroupTag) map[string]interface{} { m := map[string]interface{}{} for _, tag := range tags { - m[aws.StringValue(tag.Key)] = aws.StringValue(tag.Value) + m[aws.ToString(tag.Key)] = aws.ToString(tag.Value) } return m diff --git a/internal/service/inspector/resource_group_test.go b/internal/service/inspector/resource_group_test.go index 90a175d2549..c38ef918e5c 100644 --- a/internal/service/inspector/resource_group_test.go +++ b/internal/service/inspector/resource_group_test.go @@ -9,8 +9,9 @@ import ( "testing" "github.com/YakDriver/regexache" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" "github.com/hashicorp/terraform-provider-aws/internal/acctest" @@ -20,7 +21,7 @@ import ( func TestAccInspectorResourceGroup_basic(t *testing.T) { ctx := acctest.Context(t) - var v1, v2 inspector.ResourceGroup + var v1, v2 awstypes.ResourceGroup resourceName := "aws_inspector_resource_group.test" resource.ParallelTest(t, resource.TestCase{ @@ -50,9 +51,9 @@ func TestAccInspectorResourceGroup_basic(t *testing.T) { }) } -func testAccCheckResourceGroupExists(ctx context.Context, name string, rg *inspector.ResourceGroup) resource.TestCheckFunc { +func testAccCheckResourceGroupExists(ctx context.Context, name string, rg *awstypes.ResourceGroup) resource.TestCheckFunc { return func(s *terraform.State) error { - conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorConn(ctx) + conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) rs, ok := s.RootModule().Resources[name] if !ok { @@ -62,8 +63,8 @@ func testAccCheckResourceGroupExists(ctx context.Context, name string, rg *inspe return fmt.Errorf("No ID is set") } - output, err := conn.DescribeResourceGroupsWithContext(ctx, &inspector.DescribeResourceGroupsInput{ - ResourceGroupArns: aws.StringSlice([]string{rs.Primary.ID}), + output, err := conn.DescribeResourceGroups(ctx, &inspector.DescribeResourceGroupsInput{ + ResourceGroupArns: []string{rs.Primary.ID}, }) if err != nil { return err @@ -78,7 +79,7 @@ func testAccCheckResourceGroupExists(ctx context.Context, name string, rg *inspe } } -func testAccCheckResourceGroupRecreated(v1, v2 *inspector.ResourceGroup) resource.TestCheckFunc { +func testAccCheckResourceGroupRecreated(v1, v2 *awstypes.ResourceGroup) resource.TestCheckFunc { return func(s *terraform.State) error { if v2.CreatedAt.Equal(*v1.CreatedAt) { return fmt.Errorf("Inspector Classic Resource Group not recreated when changing tags") diff --git a/internal/service/inspector/rules_packages_data_source.go b/internal/service/inspector/rules_packages_data_source.go index c3546bfb3d0..0f30d890c55 100644 --- a/internal/service/inspector/rules_packages_data_source.go +++ b/internal/service/inspector/rules_packages_data_source.go @@ -7,8 +7,9 @@ import ( "context" "sort" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/inspector" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/inspector" + awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" @@ -33,15 +34,14 @@ func DataSourceRulesPackages() *schema.Resource { func dataSourceRulesPackagesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics - conn := meta.(*conns.AWSClient).InspectorConn(ctx) + conn := meta.(*conns.AWSClient).InspectorClient(ctx) output, err := findRulesPackageARNs(ctx, conn) if err != nil { return sdkdiag.AppendErrorf(diags, "reading Inspector Classic Rules Packages: %s", err) } - - arns := aws.StringValueSlice(output) + arns := output sort.Strings(arns) d.SetId(meta.(*conns.AWSClient).Region) @@ -50,7 +50,7 @@ func dataSourceRulesPackagesRead(ctx context.Context, d *schema.ResourceData, me return diags } -func findRulesPackageARNs(ctx context.Context, conn *inspector.Inspector) ([]*string, error) { +func findRulesPackageARNs(ctx context.Context, conn *inspector.Client) ([]*string, error) { input := &inspector.ListRulesPackagesInput{} var output []*string From 4add1801a61532c7419ae2fd1235917456f5953f Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 20:29:07 +0100 Subject: [PATCH 4/9] r/inspector_assessment_target: Migrate to AWS SDK v2 --- internal/service/inspector/assessment_target.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/internal/service/inspector/assessment_target.go b/internal/service/inspector/assessment_target.go index 1af3f1db689..b322d524431 100644 --- a/internal/service/inspector/assessment_target.go +++ b/internal/service/inspector/assessment_target.go @@ -11,7 +11,6 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" - "github.com/hashicorp/aws-sdk-go-base/v2/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -147,7 +146,7 @@ func resourceAssessmentTargetDelete(ctx context.Context, d *schema.ResourceData, func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Client, arn string) (*awstypes.AssessmentTarget, error) { input := &inspector.DescribeAssessmentTargetsInput{ - AssessmentTargetArns: []*string{aws.String(arn)}, + AssessmentTargetArns: []string{arn}, } output, err := conn.DescribeAssessmentTargets(ctx, input) @@ -160,7 +159,7 @@ func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Client, arn s return nil, err } - var assessmentTarget *awstypes.AssessmentTarget + var assessmentTarget awstypes.AssessmentTarget for _, target := range output.AssessmentTargets { if aws.ToString(target.Arn) == arn { assessmentTarget = target @@ -168,5 +167,5 @@ func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Client, arn s } } - return assessmentTarget, nil + return &assessmentTarget, nil } From 8857120580305187809a03dea4f1bc074f5952d3 Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 21:00:14 +0100 Subject: [PATCH 5/9] r/inspector_assessment_template: Migrate to AWS SDK v2 --- .../service/inspector/assessment_template.go | 32 +++++-------------- .../inspector/assessment_template_test.go | 10 ++---- internal/service/inspector/find.go | 24 +++++++------- 3 files changed, 22 insertions(+), 44 deletions(-) diff --git a/internal/service/inspector/assessment_template.go b/internal/service/inspector/assessment_template.go index 89e4ec1496c..24b298d8cd8 100644 --- a/internal/service/inspector/assessment_template.go +++ b/internal/service/inspector/assessment_template.go @@ -10,12 +10,8 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" - - // "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/create" "github.com/hashicorp/terraform-provider-aws/internal/enum" @@ -59,9 +55,9 @@ func ResourceAssessmentTemplate() *schema.Resource { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "event": { - Type: schema.TypeString, - Required: true, - ValidateFunc: enum.Validate[awstypes.Event](), + Type: schema.TypeString, + Required: true, + ValidateDiagFunc: enum.Validate[awstypes.InspectorEvent](), }, names.AttrTopicARN: { Type: schema.TypeString, @@ -103,8 +99,8 @@ func resourceAssessmentTemplateCreate(ctx context.Context, d *schema.ResourceDat input := &inspector.CreateAssessmentTemplateInput{ AssessmentTargetArn: aws.String(d.Get(names.AttrTargetARN).(string)), AssessmentTemplateName: aws.String(name), - DurationInSeconds: aws.Int64(int64(d.Get(names.AttrDuration).(int))), - RulesPackageArns: flex.ExpandStringSet(d.Get("rules_package_arns").(*schema.Set)), + DurationInSeconds: aws.Int32(int32(d.Get(names.AttrDuration).(int))), + RulesPackageArns: flex.ExpandStringValueSet(d.Get("rules_package_arns").(*schema.Set)), } output, err := conn.CreateAssessmentTemplate(ctx, input) @@ -242,7 +238,7 @@ func expandEventSubscription(tfMap map[string]interface{}, templateArn *string) } eventSubscription := &inspector.SubscribeToEventInput{ - Event: aws.String(tfMap["event"].(string)), + Event: awstypes.InspectorEvent(tfMap["event"].(string)), ResourceArn: templateArn, TopicArn: aws.String(tfMap[names.AttrTopicARN].(string)), } @@ -250,7 +246,7 @@ func expandEventSubscription(tfMap map[string]interface{}, templateArn *string) return eventSubscription } -func flattenSubscriptions(subscriptions []*awstypes.Subscription) []interface{} { +func flattenSubscriptions(subscriptions []awstypes.Subscription) []interface{} { if len(subscriptions) == 0 { return nil } @@ -258,15 +254,7 @@ func flattenSubscriptions(subscriptions []*awstypes.Subscription) []interface{} var tfList []interface{} for _, subscription := range subscriptions { - if subscription == nil { - continue - } - for _, eventSubscription := range subscription.EventSubscriptions { - if eventSubscription == nil { - continue - } - tfList = append(tfList, flattenEventSubscription(eventSubscription, subscription.TopicArn)) } } @@ -274,11 +262,7 @@ func flattenSubscriptions(subscriptions []*awstypes.Subscription) []interface{} return tfList } -func flattenEventSubscription(eventSubscription *awstypes.EventSubscription, topicArn *string) map[string]interface{} { - if eventSubscription == nil { - return nil - } - +func flattenEventSubscription(eventSubscription awstypes.EventSubscription, topicArn *string) map[string]interface{} { tfMap := map[string]interface{}{} tfMap["event"] = eventSubscription.Event diff --git a/internal/service/inspector/assessment_template_test.go b/internal/service/inspector/assessment_template_test.go index 5f783d3a2a5..4140739f060 100644 --- a/internal/service/inspector/assessment_template_test.go +++ b/internal/service/inspector/assessment_template_test.go @@ -9,10 +9,8 @@ import ( "testing" "github.com/YakDriver/regexache" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" - "github.com/hashicorp/aws-sdk-go-base/v2/tfawserr" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" @@ -200,9 +198,7 @@ func testAccCheckTemplateDestroy(ctx context.Context) resource.TestCheckFunc { } resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ - AssessmentTemplateArns: []*string{ - aws.String(rs.Primary.ID), - }, + AssessmentTemplateArns: []string{rs.Primary.ID}, }) if errs.IsA[*awstypes.InvalidInputException](err) { @@ -214,7 +210,7 @@ func testAccCheckTemplateDestroy(ctx context.Context) resource.TestCheckFunc { } if len(resp.AssessmentTemplates) > 0 { - return fmt.Errorf("Found Template, expected none: %s", resp) + return fmt.Errorf("Found Template, expected none: %+v", resp) } } @@ -258,7 +254,7 @@ func testAccCheckTemplateExists(ctx context.Context, name string, v *awstypes.As return fmt.Errorf("Inspector Classic Assessment template not found") } - *v = *resp.AssessmentTemplates[0] + v = &resp.AssessmentTemplates[0] return nil } diff --git a/internal/service/inspector/find.go b/internal/service/inspector/find.go index a7d7248d3bb..6dcae4e0e0e 100644 --- a/internal/service/inspector/find.go +++ b/internal/service/inspector/find.go @@ -11,30 +11,28 @@ import ( awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" ) -func findSubscriptionsByAssessmentTemplateARN(ctx context.Context, conn *inspector.Client, arn string) ([]*awstypes.Subscription, error) { +func findSubscriptionsByAssessmentTemplateARN(ctx context.Context, conn *inspector.Client, arn string) ([]awstypes.Subscription, error) { input := &inspector.ListEventSubscriptionsInput{ ResourceArn: aws.String(arn), } - var results []*awstypes.Subscription + var results []awstypes.Subscription - err := conn.ListEventSubscriptionsPagesWithContext(ctx, input, func(page *inspector.ListEventSubscriptionsOutput, lastPage bool) bool { - if page == nil { - return !lastPage + pages := inspector.NewListEventSubscriptionsPaginator(conn, input) + + for pages.HasMorePages() { + page, err := pages.NextPage(ctx) + + if err != nil { + return nil, err } for _, subscription := range page.Subscriptions { - if subscription == nil { - continue - } - if aws.ToString(subscription.ResourceArn) == arn { results = append(results, subscription) } } + } - return !lastPage - }) - - return results, err + return results, nil } From 6b08a8deb1ea833e0a635b14048dd9617d99f94c Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 21:02:38 +0100 Subject: [PATCH 6/9] r/inspector_group: Migrate to AWS SDK v2 --- internal/service/inspector/resource_group.go | 13 ++++++------- internal/service/inspector/resource_group_test.go | 3 +-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/internal/service/inspector/resource_group.go b/internal/service/inspector/resource_group.go index f0d0f0cd34c..e114c2d23e8 100644 --- a/internal/service/inspector/resource_group.go +++ b/internal/service/inspector/resource_group.go @@ -72,14 +72,13 @@ func resourceResourceGroupRead(ctx context.Context, d *schema.ResourceData, meta if len(resp.ResourceGroups) == 0 { if failedItem, ok := resp.FailedItems[d.Id()]; ok { - failureCode := aws.ToString(failedItem.FailureCode) - if failureCode == awstypes.FailedItemErrorCodeItemDoesNotExist { + if failedItem.FailureCode == awstypes.FailedItemErrorCodeItemDoesNotExist { log.Printf("[WARN] Inspector Classic Resource Group (%s) not found, removing from state", d.Id()) d.SetId("") return diags } - return sdkdiag.AppendErrorf(diags, "reading Inspector Classic Resource Group (%s): %s", d.Id(), failureCode) + return sdkdiag.AppendErrorf(diags, "reading Inspector Classic Resource Group (%s): %s", d.Id(), string(failedItem.FailureCode)) } return sdkdiag.AppendErrorf(diags, "reading Inspector Classic Resource Group (%s): %v", d.Id(), resp.FailedItems) @@ -101,11 +100,11 @@ func resourceResourceGroupDelete(ctx context.Context, d *schema.ResourceData, me return diags } -func expandResourceGroupTags(m map[string]interface{}) []*awstypes.ResourceGroupTag { - var result []*awstypes.ResourceGroupTag +func expandResourceGroupTags(m map[string]interface{}) []awstypes.ResourceGroupTag { + var result []awstypes.ResourceGroupTag for k, v := range m { - result = append(result, &awstypes.ResourceGroupTag{ + result = append(result, awstypes.ResourceGroupTag{ Key: aws.String(k), Value: aws.String(v.(string)), }) @@ -114,7 +113,7 @@ func expandResourceGroupTags(m map[string]interface{}) []*awstypes.ResourceGroup return result } -func flattenResourceGroupTags(tags []*awstypes.ResourceGroupTag) map[string]interface{} { +func flattenResourceGroupTags(tags []awstypes.ResourceGroupTag) map[string]interface{} { m := map[string]interface{}{} for _, tag := range tags { diff --git a/internal/service/inspector/resource_group_test.go b/internal/service/inspector/resource_group_test.go index c38ef918e5c..3fa0d5ecf6a 100644 --- a/internal/service/inspector/resource_group_test.go +++ b/internal/service/inspector/resource_group_test.go @@ -9,7 +9,6 @@ import ( "testing" "github.com/YakDriver/regexache" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -73,7 +72,7 @@ func testAccCheckResourceGroupExists(ctx context.Context, name string, rg *awsty return fmt.Errorf("No matching Inspector Classic Resource Groups") } - *rg = *output.ResourceGroups[0] + *rg = output.ResourceGroups[0] return nil } From 36ad4f5fa6d806d9d8a0815504f925d80d7a7e2b Mon Sep 17 00:00:00 2001 From: Matt Burgess <549318+mattburgess@users.noreply.github.com> Date: Thu, 18 Jul 2024 21:08:57 +0100 Subject: [PATCH 7/9] d/inspector_rules_packages: Migrate to AWS SDK v2 --- .../inspector/rules_packages_data_source.go | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/internal/service/inspector/rules_packages_data_source.go b/internal/service/inspector/rules_packages_data_source.go index 0f30d890c55..00508a325e1 100644 --- a/internal/service/inspector/rules_packages_data_source.go +++ b/internal/service/inspector/rules_packages_data_source.go @@ -7,9 +7,7 @@ import ( "context" "sort" - "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/inspector" - awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" @@ -50,26 +48,20 @@ func dataSourceRulesPackagesRead(ctx context.Context, d *schema.ResourceData, me return diags } -func findRulesPackageARNs(ctx context.Context, conn *inspector.Client) ([]*string, error) { +func findRulesPackageARNs(ctx context.Context, conn *inspector.Client) ([]string, error) { input := &inspector.ListRulesPackagesInput{} - var output []*string + var output []string - err := conn.ListRulesPackagesPagesWithContext(ctx, input, func(page *inspector.ListRulesPackagesOutput, lastPage bool) bool { - if page == nil { - return !lastPage - } + pages := inspector.NewListRulesPackagesPaginator(conn, input) - for _, v := range page.RulesPackageArns { - if v != nil { - output = append(output, v) - } - } + for pages.HasMorePages() { + page, err := pages.NextPage(ctx) - return !lastPage - }) + if err != nil { + return nil, err + } - if err != nil { - return nil, err + output = append(output, page.RulesPackageArns...) } return output, nil From a6c55ab3f986889a70bc13551afd3bbeec937719 Mon Sep 17 00:00:00 2001 From: Jared Baker Date: Fri, 19 Jul 2024 15:01:25 -0400 Subject: [PATCH 8/9] r/aws_inspector_assessment_target: compose NotFound error in finder Rather than relying on a nil response object to infer when a target is not found, the associated finder function will not return a `retry.NotFoundError` when no matching targets are found in the Describe API response. --- .../service/inspector/assessment_target.go | 27 ++++++++++--------- .../inspector/assessment_target_test.go | 25 +++++++++-------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/internal/service/inspector/assessment_target.go b/internal/service/inspector/assessment_target.go index b322d524431..c086c5d1e7a 100644 --- a/internal/service/inspector/assessment_target.go +++ b/internal/service/inspector/assessment_target.go @@ -50,6 +50,10 @@ func ResourceAssessmentTarget() *schema.Resource { } } +const ( + ResNameAssessmentTarget = "Assessment Target" +) + func resourceAssessmentTargetCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics conn := meta.(*conns.AWSClient).InspectorClient(ctx) @@ -76,18 +80,17 @@ func resourceAssessmentTargetRead(ctx context.Context, d *schema.ResourceData, m var diags diag.Diagnostics conn := meta.(*conns.AWSClient).InspectorClient(ctx) - assessmentTarget, err := DescribeAssessmentTarget(ctx, conn, d.Id()) - - if err != nil { - return sdkdiag.AppendErrorf(diags, "describing Inspector Classic Assessment Target (%s): %s", d.Id(), err) - } - - if assessmentTarget == nil { + assessmentTarget, err := FindAssessmentTargetByID(ctx, conn, d.Id()) + if errs.IsA[*retry.NotFoundError](err) { log.Printf("[WARN] Inspector Classic Assessment Target (%s) not found, removing from state", d.Id()) d.SetId("") return diags } + if err != nil { + return sdkdiag.AppendErrorf(diags, "describing Inspector Classic Assessment Target (%s): %s", d.Id(), err) + } + d.Set(names.AttrARN, assessmentTarget.Arn) d.Set(names.AttrName, assessmentTarget.Name) d.Set("resource_group_arn", assessmentTarget.ResourceGroupArn) @@ -144,7 +147,7 @@ func resourceAssessmentTargetDelete(ctx context.Context, d *schema.ResourceData, return diags } -func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Client, arn string) (*awstypes.AssessmentTarget, error) { +func FindAssessmentTargetByID(ctx context.Context, conn *inspector.Client, arn string) (*awstypes.AssessmentTarget, error) { input := &inspector.DescribeAssessmentTargetsInput{ AssessmentTargetArns: []string{arn}, } @@ -159,13 +162,13 @@ func DescribeAssessmentTarget(ctx context.Context, conn *inspector.Client, arn s return nil, err } - var assessmentTarget awstypes.AssessmentTarget for _, target := range output.AssessmentTargets { if aws.ToString(target.Arn) == arn { - assessmentTarget = target - break + return &target, nil } } - return &assessmentTarget, nil + return nil, &retry.NotFoundError{ + LastRequest: input, + } } diff --git a/internal/service/inspector/assessment_target_test.go b/internal/service/inspector/assessment_target_test.go index 7643b84a634..cdc44b84755 100644 --- a/internal/service/inspector/assessment_target_test.go +++ b/internal/service/inspector/assessment_target_test.go @@ -5,17 +5,21 @@ package inspector_test import ( "context" + "errors" "fmt" "testing" "github.com/YakDriver/regexache" "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" "github.com/hashicorp/terraform-provider-aws/internal/acctest" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/create" + "github.com/hashicorp/terraform-provider-aws/internal/errs" tfinspector "github.com/hashicorp/terraform-provider-aws/internal/service/inspector" "github.com/hashicorp/terraform-provider-aws/names" ) @@ -170,15 +174,15 @@ func testAccCheckTargetAssessmentDestroy(ctx context.Context) resource.TestCheck continue } - assessmentTarget, err := tfinspector.DescribeAssessmentTarget(ctx, conn, rs.Primary.ID) - + _, err := tfinspector.FindAssessmentTargetByID(ctx, conn, rs.Primary.ID) + if errs.IsA[*retry.NotFoundError](err) { + return nil + } if err != nil { - return fmt.Errorf("finding Inspector Classic Assessment Target: %s", err) + return create.Error(names.Inspector, create.ErrActionCheckingDestroyed, tfinspector.ResNameAssessmentTarget, rs.Primary.ID, err) } - if assessmentTarget != nil { - return fmt.Errorf("Inspector Classic Assessment Target (%s) still exists", rs.Primary.ID) - } + return create.Error(names.Inspector, create.ErrActionCheckingDestroyed, tfinspector.ResNameAssessmentTarget, rs.Primary.ID, errors.New("not destroyed")) } return nil @@ -194,14 +198,9 @@ func testAccCheckTargetExists(ctx context.Context, name string, target *awstypes conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) - assessmentTarget, err := tfinspector.DescribeAssessmentTarget(ctx, conn, rs.Primary.ID) - + assessmentTarget, err := tfinspector.FindAssessmentTargetByID(ctx, conn, rs.Primary.ID) if err != nil { - return fmt.Errorf("finding Inspector Classic Assessment Target: %s", err) - } - - if assessmentTarget == nil { - return fmt.Errorf("Inspector Classic Assessment Target (%s) not found", rs.Primary.ID) + return create.Error(names.Inspector, create.ErrActionCheckingExistence, tfinspector.ResNameAssessmentTarget, rs.Primary.ID, err) } *target = *assessmentTarget From 79d037cd2000bbb1c9f37cb50cfd4d0e66534d43 Mon Sep 17 00:00:00 2001 From: Jared Baker Date: Fri, 19 Jul 2024 15:39:34 -0400 Subject: [PATCH 9/9] r/aws_inspector_assessment_template: add finder --- .../service/inspector/assessment_template.go | 44 ++++++++++++++----- .../inspector/assessment_template_test.go | 32 +++++--------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/internal/service/inspector/assessment_template.go b/internal/service/inspector/assessment_template.go index 24b298d8cd8..e7dbfa3ec52 100644 --- a/internal/service/inspector/assessment_template.go +++ b/internal/service/inspector/assessment_template.go @@ -11,13 +11,16 @@ import ( "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/create" "github.com/hashicorp/terraform-provider-aws/internal/enum" + "github.com/hashicorp/terraform-provider-aws/internal/errs" "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" "github.com/hashicorp/terraform-provider-aws/internal/flex" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" "github.com/hashicorp/terraform-provider-aws/internal/verify" "github.com/hashicorp/terraform-provider-aws/names" ) @@ -130,20 +133,15 @@ func resourceAssessmentTemplateRead(ctx context.Context, d *schema.ResourceData, var diags diag.Diagnostics conn := meta.(*conns.AWSClient).InspectorClient(ctx) - resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ - AssessmentTemplateArns: []string{d.Id()}, - }) - if err != nil { - return sdkdiag.AppendErrorf(diags, "reading Inspector Classic Assessment Template (%s): %s", d.Id(), err) - } - - if resp.AssessmentTemplates == nil || len(resp.AssessmentTemplates) == 0 { + template, err := FindAssessmentTemplateByID(ctx, conn, d.Id()) + if errs.IsA[*retry.NotFoundError](err) { log.Printf("[WARN] Inspector Classic Assessment Template (%s) not found, removing from state", d.Id()) d.SetId("") return diags } - - template := resp.AssessmentTemplates[0] + if err != nil { + return create.AppendDiagError(diags, names.Inspector, create.ErrActionReading, ResNameAssessmentTemplate, d.Id(), err) + } arn := aws.ToString(template.Arn) d.Set(names.AttrARN, arn) @@ -210,6 +208,32 @@ func resourceAssessmentTemplateDelete(ctx context.Context, d *schema.ResourceDat return diags } +func FindAssessmentTemplateByID(ctx context.Context, conn *inspector.Client, arn string) (*awstypes.AssessmentTemplate, error) { + in := &inspector.DescribeAssessmentTargetsInput{ + AssessmentTargetArns: []string{arn}, + } + + out, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ + AssessmentTemplateArns: []string{arn}, + }) + + if err != nil { + return nil, err + } + + if out.AssessmentTemplates == nil || len(out.AssessmentTemplates) == 0 { + return nil, &retry.NotFoundError{ + LastRequest: in, + } + } + + if i := len(out.AssessmentTemplates); i > 1 { + return nil, tfresource.NewTooManyResultsError(i, in) + } + + return &out.AssessmentTemplates[0], nil +} + func expandEventSubscriptions(tfList []interface{}, templateArn *string) []*inspector.SubscribeToEventInput { if len(tfList) == 0 { return nil diff --git a/internal/service/inspector/assessment_template_test.go b/internal/service/inspector/assessment_template_test.go index 4140739f060..c091141ce68 100644 --- a/internal/service/inspector/assessment_template_test.go +++ b/internal/service/inspector/assessment_template_test.go @@ -5,18 +5,22 @@ package inspector_test import ( "context" + "errors" "fmt" "testing" "github.com/YakDriver/regexache" "github.com/aws/aws-sdk-go-v2/service/inspector" awstypes "github.com/aws/aws-sdk-go-v2/service/inspector/types" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" "github.com/hashicorp/terraform-provider-aws/internal/acctest" "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/create" "github.com/hashicorp/terraform-provider-aws/internal/errs" + tfinspector "github.com/hashicorp/terraform-provider-aws/internal/service/inspector" "github.com/hashicorp/terraform-provider-aws/names" ) @@ -197,21 +201,15 @@ func testAccCheckTemplateDestroy(ctx context.Context) resource.TestCheckFunc { continue } - resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ - AssessmentTemplateArns: []string{rs.Primary.ID}, - }) - - if errs.IsA[*awstypes.InvalidInputException](err) { - continue + _, err := tfinspector.FindAssessmentTemplateByID(ctx, conn, rs.Primary.ID) + if errs.IsA[*retry.NotFoundError](err) { + return nil } - if err != nil { - return fmt.Errorf("finding Inspector Classic Assessment Template: %s", err) + return create.Error(names.Inspector, create.ErrActionCheckingDestroyed, tfinspector.ResNameAssessmentTemplate, rs.Primary.ID, err) } - if len(resp.AssessmentTemplates) > 0 { - return fmt.Errorf("Found Template, expected none: %+v", resp) - } + return create.Error(names.Inspector, create.ErrActionCheckingDestroyed, tfinspector.ResNameAssessmentTemplate, rs.Primary.ID, errors.New("not destroyed")) } return nil @@ -243,18 +241,12 @@ func testAccCheckTemplateExists(ctx context.Context, name string, v *awstypes.As conn := acctest.Provider.Meta().(*conns.AWSClient).InspectorClient(ctx) - resp, err := conn.DescribeAssessmentTemplates(ctx, &inspector.DescribeAssessmentTemplatesInput{ - AssessmentTemplateArns: []string{rs.Primary.ID}, - }) + resp, err := tfinspector.FindAssessmentTemplateByID(ctx, conn, rs.Primary.ID) if err != nil { - return err - } - - if resp.AssessmentTemplates == nil || len(resp.AssessmentTemplates) == 0 { - return fmt.Errorf("Inspector Classic Assessment template not found") + return create.Error(names.Inspector, create.ErrActionCheckingExistence, tfinspector.ResNameAssessmentTemplate, rs.Primary.ID, err) } - v = &resp.AssessmentTemplates[0] + *v = *resp return nil }