From 1be6d0e097c5f06fa37caf8dacd9520afc80e459 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 29 Jan 2021 16:41:42 -0500 Subject: [PATCH] r/aws_kinesis_analytics_application: Return 'NotFoundError' instead of 'nil' when no application found (#15945). r/aws_kinesis_analytics_application: Implement 'd.IsNewResource()' checks in 'resourceAwsKinesisAnalyticsApplicationRead' (#16796). Acceptance test output: $ make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSKinesisAnalyticsApplication_basic\|TestAccAWSKinesisAnalyticsApplication_disappears' ==> Checking that code complies with gofmt requirements... TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSKinesisAnalyticsApplication_basic\|TestAccAWSKinesisAnalyticsApplication_disappears -timeout 120m === RUN TestAccAWSKinesisAnalyticsApplication_basic === PAUSE TestAccAWSKinesisAnalyticsApplication_basic === RUN TestAccAWSKinesisAnalyticsApplication_disappears === PAUSE TestAccAWSKinesisAnalyticsApplication_disappears === CONT TestAccAWSKinesisAnalyticsApplication_basic === CONT TestAccAWSKinesisAnalyticsApplication_disappears --- PASS: TestAccAWSKinesisAnalyticsApplication_basic (15.29s) --- PASS: TestAccAWSKinesisAnalyticsApplication_disappears (18.26s) PASS ok github.com/terraform-providers/terraform-provider-aws/aws 18.344s --- .../service/kinesisanalytics/finder/finder.go | 29 +++++++++++++++++-- .../service/kinesisanalytics/waiter/status.go | 10 +++---- .../service/kinesisanalytics/waiter/waiter.go | 9 ++++-- ...ource_aws_kinesis_analytics_application.go | 8 +++-- ..._aws_kinesis_analytics_application_test.go | 9 +++--- 5 files changed, 48 insertions(+), 17 deletions(-) diff --git a/aws/internal/service/kinesisanalytics/finder/finder.go b/aws/internal/service/kinesisanalytics/finder/finder.go index 1cbe195c57fb..6050b3d037a0 100644 --- a/aws/internal/service/kinesisanalytics/finder/finder.go +++ b/aws/internal/service/kinesisanalytics/finder/finder.go @@ -3,18 +3,43 @@ package finder import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/kinesisanalytics" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -// ApplicationByName returns the application corresponding to the specified name. -func ApplicationByName(conn *kinesisanalytics.KinesisAnalytics, name string) (*kinesisanalytics.ApplicationDetail, error) { +// ApplicationDetailByName returns the application corresponding to the specified name. +// Returns NotFoundError if no application is found. +func ApplicationDetailByName(conn *kinesisanalytics.KinesisAnalytics, name string) (*kinesisanalytics.ApplicationDetail, error) { input := &kinesisanalytics.DescribeApplicationInput{ ApplicationName: aws.String(name), } + return ApplicationDetail(conn, input) +} + +// ApplicationDetail returns the application details corresponding to the specified name. +// Returns NotFoundError if no application is found. +func ApplicationDetail(conn *kinesisanalytics.KinesisAnalytics, input *kinesisanalytics.DescribeApplicationInput) (*kinesisanalytics.ApplicationDetail, error) { output, err := conn.DescribeApplication(input) + + if tfawserr.ErrCodeEquals(err, kinesisanalytics.ErrCodeResourceNotFoundException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + if err != nil { return nil, err } + if output == nil || output.ApplicationDetail == nil { + return nil, &resource.NotFoundError{ + Message: "Empty result", + LastRequest: input, + LastResponse: output, + } + } + return output.ApplicationDetail, nil } diff --git a/aws/internal/service/kinesisanalytics/waiter/status.go b/aws/internal/service/kinesisanalytics/waiter/status.go index 0a326c79d213..6758955b9df6 100644 --- a/aws/internal/service/kinesisanalytics/waiter/status.go +++ b/aws/internal/service/kinesisanalytics/waiter/status.go @@ -3,9 +3,9 @@ package waiter import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/kinesisanalytics" - "github.com/hashicorp/aws-sdk-go-base/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalytics/finder" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) const ( @@ -13,12 +13,12 @@ const ( applicationStatusUnknown = "Unknown" ) -// ApplicationStatus fetches the Application and its Status +// ApplicationStatus fetches the ApplicationDetail and its Status func ApplicationStatus(conn *kinesisanalytics.KinesisAnalytics, name string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - application, err := finder.ApplicationByName(conn, name) + applicationDetail, err := finder.ApplicationDetailByName(conn, name) - if tfawserr.ErrCodeEquals(err, kinesisanalytics.ErrCodeResourceNotFoundException) { + if tfresource.NotFound(err) { return nil, applicationStatusNotFound, nil } @@ -26,6 +26,6 @@ func ApplicationStatus(conn *kinesisanalytics.KinesisAnalytics, name string) res return nil, applicationStatusUnknown, err } - return application, aws.StringValue(application.ApplicationStatus), nil + return applicationDetail, aws.StringValue(applicationDetail.ApplicationStatus), nil } } diff --git a/aws/internal/service/kinesisanalytics/waiter/waiter.go b/aws/internal/service/kinesisanalytics/waiter/waiter.go index 0c9b9e290e52..5c101a0d2a31 100644 --- a/aws/internal/service/kinesisanalytics/waiter/waiter.go +++ b/aws/internal/service/kinesisanalytics/waiter/waiter.go @@ -11,9 +11,12 @@ import ( ) // ApplicationDeleted waits for an Application to return Deleted -func ApplicationDeleted(conn *kinesisanalytics.KinesisAnalytics, name string, timeout time.Duration) (*kinesisanalytics.ApplicationSummary, error) { +func ApplicationDeleted(conn *kinesisanalytics.KinesisAnalytics, name string, timeout time.Duration) (*kinesisanalytics.ApplicationDetail, error) { stateConf := &resource.StateChangeConf{ - Pending: []string{kinesisanalytics.ApplicationStatusRunning, kinesisanalytics.ApplicationStatusDeleting}, + Pending: []string{ + kinesisanalytics.ApplicationStatusRunning, + kinesisanalytics.ApplicationStatusDeleting, + }, Target: []string{}, Refresh: ApplicationStatus(conn, name), Timeout: timeout, @@ -21,7 +24,7 @@ func ApplicationDeleted(conn *kinesisanalytics.KinesisAnalytics, name string, ti outputRaw, err := stateConf.WaitForState() - if v, ok := outputRaw.(*kinesisanalytics.ApplicationSummary); ok { + if v, ok := outputRaw.(*kinesisanalytics.ApplicationDetail); ok { return v, err } diff --git a/aws/resource_aws_kinesis_analytics_application.go b/aws/resource_aws_kinesis_analytics_application.go index 8930fc77bca8..2811824c70a1 100644 --- a/aws/resource_aws_kinesis_analytics_application.go +++ b/aws/resource_aws_kinesis_analytics_application.go @@ -11,12 +11,14 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/arn" "github.com/aws/aws-sdk-go/service/kinesisanalytics" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalytics/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalytics/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsKinesisAnalyticsApplication() *schema.Resource { @@ -657,9 +659,9 @@ func resourceAwsKinesisAnalyticsApplicationRead(d *schema.ResourceData, meta int conn := meta.(*AWSClient).kinesisanalyticsconn ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig - application, err := finder.ApplicationByName(conn, d.Get("name").(string)) + application, err := finder.ApplicationDetailByName(conn, d.Get("name").(string)) - if isAWSErr(err, kinesisanalytics.ErrCodeResourceNotFoundException, "") { + if !d.IsNewResource() && tfresource.NotFound(err) { log.Printf("[WARN] Kinesis Analytics Application (%s) not found, removing from state", d.Id()) d.SetId("") return nil @@ -1041,7 +1043,7 @@ func resourceAwsKinesisAnalyticsApplicationDelete(d *schema.ResourceData, meta i CreateTimestamp: aws.Time(createTimestamp), }) - if isAWSErr(err, kinesisanalytics.ErrCodeResourceNotFoundException, "") { + if tfawserr.ErrCodeEquals(err, kinesisanalytics.ErrCodeResourceNotFoundException) { return nil } diff --git a/aws/resource_aws_kinesis_analytics_application_test.go b/aws/resource_aws_kinesis_analytics_application_test.go index 0e3c3b514bd6..682ce18ae38f 100644 --- a/aws/resource_aws_kinesis_analytics_application_test.go +++ b/aws/resource_aws_kinesis_analytics_application_test.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalytics/finder" "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalytics/lister" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func init() { @@ -42,7 +43,7 @@ func testSweepKinesisAnalyticsApplications(region string) error { arn := aws.StringValue(applicationSummary.ApplicationARN) name := aws.StringValue(applicationSummary.ApplicationName) - application, err := finder.ApplicationByName(conn, name) + application, err := finder.ApplicationDetailByName(conn, name) if tfawserr.ErrMessageContains(err, kinesisanalytics.ErrCodeUnsupportedOperationException, "was created/updated by kinesisanalyticsv2 SDK") { continue @@ -1489,8 +1490,8 @@ func testAccCheckKinesisAnalyticsApplicationDestroy(s *terraform.State) error { continue } - _, err := finder.ApplicationByName(conn, rs.Primary.Attributes["name"]) - if isAWSErr(err, kinesisanalytics.ErrCodeResourceNotFoundException, "") { + _, err := finder.ApplicationDetailByName(conn, rs.Primary.Attributes["name"]) + if tfresource.NotFound(err) { continue } if err != nil { @@ -1515,7 +1516,7 @@ func testAccCheckKinesisAnalyticsApplicationExists(n string, v *kinesisanalytics conn := testAccProvider.Meta().(*AWSClient).kinesisanalyticsconn - application, err := finder.ApplicationByName(conn, rs.Primary.Attributes["name"]) + application, err := finder.ApplicationDetailByName(conn, rs.Primary.Attributes["name"]) if err != nil { return err }