Skip to content

Commit

Permalink
r/aws_kinesisanalyticsv2_application: Return 'NotFoundError' instead …
Browse files Browse the repository at this point in the history
…of 'nil' when no application found (hashicorp#15945).

Acceptance test output:

$ make testacc TEST=./aws/ TESTARGS='-run=TestAccAWSKinesisAnalyticsV2Application_' ACCTEST_PARALLELISM=3
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./aws -v -count 1 -parallel 3 -run=TestAccAWSKinesisAnalyticsV2Application_ -timeout 120m
=== RUN   TestAccAWSKinesisAnalyticsV2Application_basicFlinkApplication
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_basicFlinkApplication
=== RUN   TestAccAWSKinesisAnalyticsV2Application_basicSQLApplication
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_basicSQLApplication
=== RUN   TestAccAWSKinesisAnalyticsV2Application_disappears
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_disappears
=== RUN   TestAccAWSKinesisAnalyticsV2Application_Tags
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_Tags
=== RUN   TestAccAWSKinesisAnalyticsV2Application_ApplicationCodeConfiguration_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_ApplicationCodeConfiguration_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Add
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Add
=== RUN   TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Delete
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Delete
=== RUN   TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_EnvironmentProperties_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_EnvironmentProperties_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_EnvironmentProperties_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_EnvironmentProperties_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_ServiceExecutionRole_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_ServiceExecutionRole_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Add
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Add
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Add
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Add
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Delete
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Delete
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Multiple_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Multiple_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Output_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Output_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Add
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Add
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Delete
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Delete
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Update
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Add
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Add
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Delete
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Delete
=== RUN   TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Update
=== PAUSE TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Update
=== CONT  TestAccAWSKinesisAnalyticsV2Application_basicFlinkApplication
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Update
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_basicFlinkApplication (54.58s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Delete
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Update (74.66s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Add
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Update (117.92s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Delete (67.58s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Delete
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_VPCConfiguration_Add (68.71s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Add
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Add (103.54s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Output_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Delete (129.15s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Multiple_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_ReferenceDataSource_Update (135.56s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Multiple_Update (108.99s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Delete
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Update (113.14s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Add
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Output_Update (126.17s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Update (41.51s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Add
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Add (97.33s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_ServiceExecutionRole_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_InputProcessingConfiguration_Delete (106.22s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_EnvironmentProperties_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_ServiceExecutionRole_Update (42.77s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_EnvironmentProperties_Update (66.21s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_EnvironmentProperties_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_SQLApplicationConfiguration_Input_Add (118.86s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_ApplicationCodeConfiguration_Update
--- PASS: TestAccAWSKinesisAnalyticsV2Application_ApplicationCodeConfiguration_Update (52.50s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Delete
--- PASS: TestAccAWSKinesisAnalyticsV2Application_FlinkApplicationConfiguration_Update (80.04s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Add
--- PASS: TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Delete (42.49s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_disappears
--- PASS: TestAccAWSKinesisAnalyticsV2Application_EnvironmentProperties_Update (103.32s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_Tags
--- PASS: TestAccAWSKinesisAnalyticsV2Application_CloudWatchLoggingOptions_Add (52.77s)
=== CONT  TestAccAWSKinesisAnalyticsV2Application_basicSQLApplication
--- PASS: TestAccAWSKinesisAnalyticsV2Application_disappears (35.36s)
--- PASS: TestAccAWSKinesisAnalyticsV2Application_basicSQLApplication (36.17s)
--- PASS: TestAccAWSKinesisAnalyticsV2Application_Tags (59.22s)
PASS
ok  	github.com/terraform-providers/terraform-provider-aws/aws	695.388s
  • Loading branch information
ewbankkit committed Mar 26, 2021
1 parent 33560da commit e66e32d
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 26 deletions.
28 changes: 26 additions & 2 deletions aws/internal/service/kinesisanalyticsv2/finder/finder.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,42 @@ package finder
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/kinesisanalyticsv2"
"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 *kinesisanalyticsv2.KinesisAnalyticsV2, name string) (*kinesisanalyticsv2.ApplicationDetail, error) {
// ApplicationDetailByName returns the application corresponding to the specified name.
// Returns NotFoundError if no application is found.
func ApplicationDetailByName(conn *kinesisanalyticsv2.KinesisAnalyticsV2, name string) (*kinesisanalyticsv2.ApplicationDetail, error) {
input := &kinesisanalyticsv2.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 *kinesisanalyticsv2.KinesisAnalyticsV2, input *kinesisanalyticsv2.DescribeApplicationInput) (*kinesisanalyticsv2.ApplicationDetail, error) {
output, err := conn.DescribeApplication(input)

if tfawserr.ErrCodeEquals(err, kinesisanalyticsv2.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,
}
}

return output.ApplicationDetail, nil
}
19 changes: 7 additions & 12 deletions aws/internal/service/kinesisanalyticsv2/waiter/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,24 @@ package waiter
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/kinesisanalyticsv2"
"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/kinesisanalyticsv2/finder"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

const (
applicationStatusNotFound = "NotFound"
applicationStatusUnknown = "Unknown"
)

// ApplicationStatus fetches the Application and its Status
// ApplicationStatus fetches the ApplicationDetail and its Status
func ApplicationStatus(conn *kinesisanalyticsv2.KinesisAnalyticsV2, 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, kinesisanalyticsv2.ErrCodeResourceNotFoundException) {
return nil, applicationStatusNotFound, nil
if tfresource.NotFound(err) {
return nil, "", nil
}

if err != nil {
return nil, applicationStatusUnknown, err
return nil, "", err
}

return application, aws.StringValue(application.ApplicationStatus), nil
return applicationDetail, aws.StringValue(applicationDetail.ApplicationStatus), nil
}
}
11 changes: 9 additions & 2 deletions aws/internal/service/kinesisanalyticsv2/waiter/waiter.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,20 @@ import (
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

const (
ApplicationDeletedTimeout = 5 * time.Minute
ApplicationStartedTimeout = 5 * time.Minute
ApplicationStoppedTimeout = 5 * time.Minute
ApplicationUpdatedTimeout = 5 * time.Minute
)

// ApplicationDeleted waits for an Application to return Deleted
func ApplicationDeleted(conn *kinesisanalyticsv2.KinesisAnalyticsV2, name string, timeout time.Duration) (*kinesisanalyticsv2.ApplicationDetail, error) {
func ApplicationDeleted(conn *kinesisanalyticsv2.KinesisAnalyticsV2, name string) (*kinesisanalyticsv2.ApplicationDetail, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{kinesisanalyticsv2.ApplicationStatusDeleting},
Target: []string{},
Refresh: ApplicationStatus(conn, name),
Timeout: timeout,
Timeout: ApplicationDeletedTimeout,
}

outputRaw, err := stateConf.WaitForState()
Expand Down
15 changes: 9 additions & 6 deletions aws/resource_aws_kinesisanalyticsv2_application.go
Original file line number Diff line number Diff line change
Expand Up @@ -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/kinesisanalyticsv2"
"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/kinesisanalyticsv2/finder"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalyticsv2/waiter"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

func resourceAwsKinesisAnalyticsV2Application() *schema.Resource {
Expand Down Expand Up @@ -854,11 +856,12 @@ func resourceAwsKinesisAnalyticsV2Application() *schema.Resource {

func resourceAwsKinesisAnalyticsV2ApplicationCreate(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*AWSClient).kinesisanalyticsv2conn
applicationName := d.Get("name").(string)

input := &kinesisanalyticsv2.CreateApplicationInput{
ApplicationConfiguration: expandKinesisAnalyticsV2ApplicationConfiguration(d.Get("application_configuration").([]interface{})),
ApplicationDescription: aws.String(d.Get("description").(string)),
ApplicationName: aws.String(d.Get("name").(string)),
ApplicationName: aws.String(applicationName),
CloudWatchLoggingOptions: expandKinesisAnalyticsV2CloudWatchLoggingOptions(d.Get("cloudwatch_logging_options").([]interface{})),
RuntimeEnvironment: aws.String(d.Get("runtime_environment").(string)),
ServiceExecutionRole: aws.String(d.Get("service_execution_role").(string)),
Expand All @@ -875,7 +878,7 @@ func resourceAwsKinesisAnalyticsV2ApplicationCreate(d *schema.ResourceData, meta
})

if err != nil {
return fmt.Errorf("error creating Kinesis Analytics v2 Application: %w", err)
return fmt.Errorf("error creating Kinesis Analytics v2 Application (%s): %w", applicationName, err)
}

output := outputRaw.(*kinesisanalyticsv2.CreateApplicationOutput)
Expand All @@ -889,9 +892,9 @@ func resourceAwsKinesisAnalyticsV2ApplicationRead(d *schema.ResourceData, meta i
conn := meta.(*AWSClient).kinesisanalyticsv2conn
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, kinesisanalyticsv2.ErrCodeResourceNotFoundException, "") {
if !d.IsNewResource() && tfresource.NotFound(err) {
log.Printf("[WARN] Kinesis Analytics v2 Application (%s) not found, removing from state", d.Id())
d.SetId("")
return nil
Expand Down Expand Up @@ -1374,15 +1377,15 @@ func resourceAwsKinesisAnalyticsV2ApplicationDelete(d *schema.ResourceData, meta
CreateTimestamp: aws.Time(createTimestamp),
})

if isAWSErr(err, kinesisanalyticsv2.ErrCodeResourceNotFoundException, "") {
if tfawserr.ErrCodeEquals(err, kinesisanalyticsv2.ErrCodeResourceNotFoundException) {
return nil
}

if err != nil {
return fmt.Errorf("error deleting Kinesis Analytics v2 Application (%s): %w", d.Id(), err)
}

_, err = waiter.ApplicationDeleted(conn, applicationName, d.Timeout(schema.TimeoutDelete))
_, err = waiter.ApplicationDeleted(conn, applicationName)

if err != nil {
return fmt.Errorf("error waiting for Kinesis Analytics v2 Application (%s) deletion: %w", d.Id(), err)
Expand Down
12 changes: 8 additions & 4 deletions aws/resource_aws_kinesisanalyticsv2_application_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalyticsv2/finder"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/kinesisanalyticsv2/lister"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource"
)

func init() {
Expand Down Expand Up @@ -41,7 +42,7 @@ func testSweepKinesisAnalyticsV2Application(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 err != nil {
sweeperErr := fmt.Errorf("error reading Kinesis Analytics v2 Application (%s): %w", arn, err)
Expand Down Expand Up @@ -2719,10 +2720,12 @@ func testAccCheckKinesisAnalyticsV2ApplicationDestroy(s *terraform.State) error
continue
}

_, err := finder.ApplicationByName(conn, rs.Primary.Attributes["name"])
if isAWSErr(err, kinesisanalyticsv2.ErrCodeResourceNotFoundException, "") {
_, err := finder.ApplicationDetailByName(conn, rs.Primary.Attributes["name"])

if tfresource.NotFound(err) {
continue
}

if err != nil {
return err
}
Expand All @@ -2745,7 +2748,8 @@ func testAccCheckKinesisAnalyticsV2ApplicationExists(n string, v *kinesisanalyti

conn := testAccProvider.Meta().(*AWSClient).kinesisanalyticsv2conn

application, err := finder.ApplicationByName(conn, rs.Primary.Attributes["name"])
application, err := finder.ApplicationDetailByName(conn, rs.Primary.Attributes["name"])

if err != nil {
return err
}
Expand Down

0 comments on commit e66e32d

Please sign in to comment.