From 37f66ee90a8ada237a93346485f737c297086213 Mon Sep 17 00:00:00 2001 From: Graham Davison Date: Thu, 3 Oct 2024 11:02:55 -0700 Subject: [PATCH 1/4] Moves `TestAccECSTaskDefinition_disappears` --- internal/service/ecs/task_definition_test.go | 57 ++++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/internal/service/ecs/task_definition_test.go b/internal/service/ecs/task_definition_test.go index 2bdb14b1935d..b3c05b19891a 100644 --- a/internal/service/ecs/task_definition_test.go +++ b/internal/service/ecs/task_definition_test.go @@ -131,6 +131,34 @@ func TestAccECSTaskDefinition_basic(t *testing.T) { }) } +func TestAccECSTaskDefinition_disappears(t *testing.T) { + ctx := acctest.Context(t) + var def awstypes.TaskDefinition + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + resourceName := "aws_ecs_task_definition.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, names.ECSServiceID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckTaskDefinitionDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccTaskDefinitionConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckTaskDefinitionExists(ctx, resourceName, &def), + acctest.CheckResourceDisappears(ctx, acctest.Provider, tfecs.ResourceTaskDefinition(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, + { + Config: testAccTaskDefinitionConfig_basic(rName), + Check: resource.TestCheckResourceAttr(resourceName, "revision", acctest.Ct2), // should get re-created + }, + }, + }) +} + // Regression for https://github.com/hashicorp/terraform/issues/2370 func TestAccECSTaskDefinition_scratchVolume(t *testing.T) { ctx := acctest.Context(t) @@ -1023,35 +1051,6 @@ func TestAccECSTaskDefinition_executionRole(t *testing.T) { }) } -// Regression for https://github.com/hashicorp/terraform/issues/3582#issuecomment-286409786 -func TestAccECSTaskDefinition_disappears(t *testing.T) { - ctx := acctest.Context(t) - var def awstypes.TaskDefinition - rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) - resourceName := "aws_ecs_task_definition.test" - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(ctx, t) }, - ErrorCheck: acctest.ErrorCheck(t, names.ECSServiceID), - ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, - CheckDestroy: testAccCheckTaskDefinitionDestroy(ctx), - Steps: []resource.TestStep{ - { - Config: testAccTaskDefinitionConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( - testAccCheckTaskDefinitionExists(ctx, resourceName, &def), - acctest.CheckResourceDisappears(ctx, acctest.Provider, tfecs.ResourceTaskDefinition(), resourceName), - ), - ExpectNonEmptyPlan: true, - }, - { - Config: testAccTaskDefinitionConfig_basic(rName), - Check: resource.TestCheckResourceAttr(resourceName, "revision", acctest.Ct2), // should get re-created - }, - }, - }) -} - func TestAccECSTaskDefinition_tags(t *testing.T) { ctx := acctest.Context(t) var def awstypes.TaskDefinition From 2b31317d80bb878b3893aab8da549bd48a2d2d34 Mon Sep 17 00:00:00 2001 From: Graham Davison Date: Fri, 4 Oct 2024 17:13:28 -0700 Subject: [PATCH 2/4] Use `ComposeAggregateTestCheckFunc` --- internal/service/ecs/task_definition_test.go | 80 ++++++++++---------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/internal/service/ecs/task_definition_test.go b/internal/service/ecs/task_definition_test.go index b3c05b19891a..966d34076f68 100644 --- a/internal/service/ecs/task_definition_test.go +++ b/internal/service/ecs/task_definition_test.go @@ -105,7 +105,7 @@ func TestAccECSTaskDefinition_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(`task-definition/.+`)), acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(`task-definition/.+`)), @@ -114,7 +114,7 @@ func TestAccECSTaskDefinition_basic(t *testing.T) { }, { Config: testAccTaskDefinitionConfig_modified(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(`task-definition/.+`)), acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(`task-definition/.+`)), @@ -145,7 +145,7 @@ func TestAccECSTaskDefinition_disappears(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), acctest.CheckResourceDisappears(ctx, acctest.Provider, tfecs.ResourceTaskDefinition(), resourceName), ), @@ -174,7 +174,7 @@ func TestAccECSTaskDefinition_scratchVolume(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_scratchVolume(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), ), }, @@ -203,7 +203,7 @@ func TestAccECSTaskDefinition_configuredAtLaunch(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_configuredAtLaunch(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckResourceAttr(resourceName, "volume.0.configure_at_launch", acctest.CtTrue), @@ -234,7 +234,7 @@ func TestAccECSTaskDefinition_DockerVolume_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_dockerVolumes(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -277,7 +277,7 @@ func TestAccECSTaskDefinition_DockerVolume_minimal(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_dockerVolumesMinimal(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -312,7 +312,7 @@ func TestAccECSTaskDefinition_runtimePlatform(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_runtimePlatformMinimal(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "runtime_platform.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "runtime_platform.*", map[string]string{ @@ -346,7 +346,7 @@ func TestAccECSTaskDefinition_Fargate_runtimePlatform(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_fargateRuntimePlatformMinimal(rName, true, true), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "runtime_platform.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "runtime_platform.*", map[string]string{ @@ -380,7 +380,7 @@ func TestAccECSTaskDefinition_Fargate_runtimePlatformWithoutArch(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_fargateRuntimePlatformMinimal(rName, false, true), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "runtime_platform.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "runtime_platform.*", map[string]string{ @@ -413,7 +413,7 @@ func TestAccECSTaskDefinition_EFSVolume_minimal(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_efsVolumeMinimal(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -448,7 +448,7 @@ func TestAccECSTaskDefinition_EFSVolume_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_efsVolume(rName, "/home/test"), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -484,7 +484,7 @@ func TestAccECSTaskDefinition_EFSVolume_transitEncryptionMinimal(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_transitEncryptionEFSVolumeMinimal(rName, "null"), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -522,7 +522,7 @@ func TestAccECSTaskDefinition_EFSVolume_transitEncryption(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_transitEncryptionEFSVolume(rName, "ENABLED", 2999), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -560,7 +560,7 @@ func TestAccECSTaskDefinition_EFSVolume_transitEncryptionDisabled(t *testing.T) Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_transitEncryptionEFSVolumeDisabled(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -597,7 +597,7 @@ func TestAccECSTaskDefinition_EFSVolume_accessPoint(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_efsAccessPoint(rName, "DISABLED"), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -647,7 +647,7 @@ func TestAccECSTaskDefinition_fsxWinFileSystem(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_fsxVolume(domainName, rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "volume.*", map[string]string{ @@ -686,7 +686,7 @@ func TestAccECSTaskDefinition_DockerVolume_taskScoped(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_scopedDockerVolume(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), testAccCheckTaskDefinitionDockerVolumeConfigurationAutoprovisionNil(&def), resource.TestCheckResourceAttr(resourceName, "volume.#", acctest.Ct1), @@ -712,14 +712,14 @@ func TestAccECSTaskDefinition_service(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_service(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), testAccCheckServiceExists(ctx, "aws_ecs_service.test", &service), ), }, { Config: testAccTaskDefinitionConfig_serviceModified(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), testAccCheckServiceExists(ctx, "aws_ecs_service.test", &service), ), @@ -749,7 +749,7 @@ func TestAccECSTaskDefinition_taskRoleARN(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_roleARN(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), ), }, @@ -778,7 +778,7 @@ func TestAccECSTaskDefinition_networkMode(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_networkMode(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "network_mode", "bridge"), ), @@ -808,7 +808,7 @@ func TestAccECSTaskDefinition_ipcMode(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_ipcMode(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "ipc_mode", "host"), ), @@ -838,7 +838,7 @@ func TestAccECSTaskDefinition_pidMode(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_pidMode(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "pid_mode", "host"), ), @@ -868,7 +868,7 @@ func TestAccECSTaskDefinition_constraint(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_constraint(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "placement_constraints.#", acctest.Ct1), testAccCheckTaskDefinitionConstraintsAttrs(&def), @@ -899,13 +899,13 @@ func TestAccECSTaskDefinition_changeVolumesForcesNewResource(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_basic(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &before), ), }, { Config: testAccTaskDefinitionConfig_updatedVolume(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &after), testAccCheckTaskDefinitionRecreated(t, &before, &after), ), @@ -936,7 +936,7 @@ func TestAccECSTaskDefinition_arrays(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_arrays(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), ), }, @@ -965,7 +965,7 @@ func TestAccECSTaskDefinition_Fargate_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_fargate(rName, `[{"protocol": "tcp", "containerPort": 8000}]`), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "requires_compatibilities.#", acctest.Ct1), resource.TestCheckResourceAttr(resourceName, "cpu", "256"), @@ -1002,7 +1002,7 @@ func TestAccECSTaskDefinition_Fargate_ephemeralStorage(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_fargateEphemeralStorage(rName, `[{"protocol": "tcp", "containerPort": 8000}]`), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "requires_compatibilities.#", acctest.Ct1), resource.TestCheckResourceAttr(resourceName, "cpu", "256"), @@ -1036,7 +1036,7 @@ func TestAccECSTaskDefinition_executionRole(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_executionRole(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), ), }, @@ -1065,7 +1065,7 @@ func TestAccECSTaskDefinition_tags(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_tags1(rName, acctest.CtKey1, acctest.CtValue1), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, acctest.Ct1), resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey1, acctest.CtValue1), @@ -1080,7 +1080,7 @@ func TestAccECSTaskDefinition_tags(t *testing.T) { }, { Config: testAccTaskDefinitionConfig_tags2(rName, acctest.CtKey1, acctest.CtValue1Updated, acctest.CtKey2, acctest.CtValue2), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, acctest.Ct2), resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey1, acctest.CtValue1Updated), @@ -1089,7 +1089,7 @@ func TestAccECSTaskDefinition_tags(t *testing.T) { }, { Config: testAccTaskDefinitionConfig_tags1(rName, acctest.CtKey2, acctest.CtValue2), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, acctest.CtTagsPercent, acctest.Ct1), resource.TestCheckResourceAttr(resourceName, acctest.CtTagsKey2, acctest.CtValue2), @@ -1122,7 +1122,7 @@ func TestAccECSTaskDefinition_proxy(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_proxyConfiguration(rName, containerName, proxyType, ignoredUid, ignoredGid, appPorts, proxyIngressPort, proxyEgressPort, egressIgnoredPorts, egressIgnoredIPs), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), testAccCheckTaskDefinitionProxyConfiguration(&def, containerName, proxyType, ignoredUid, ignoredGid, appPorts, proxyIngressPort, proxyEgressPort, egressIgnoredPorts, egressIgnoredIPs), ), @@ -1152,7 +1152,7 @@ func TestAccECSTaskDefinition_inferenceAccelerator(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_inferenceAccelerator(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), resource.TestCheckResourceAttr(resourceName, "inference_accelerator.#", acctest.Ct1), ), @@ -1200,7 +1200,7 @@ func TestAccECSTaskDefinition_trackLatest(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_trackLatest(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(`task-definition/.+`)), acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(`task-definition/.+`)), @@ -1233,7 +1233,7 @@ func TestAccECSTaskDefinition_unknownContainerDefinitions(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccTaskDefinitionConfig_unknownContainerDefinitions(rName), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), ), }, @@ -1311,7 +1311,7 @@ func TestAccECSTaskDefinition_v5590ContainerDefinitionsRegression(t *testing.T) { ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Config: testAccTaskDefinitionConfig_v5590ContainerDefinitionsRegression(rName, "nginx"), - Check: resource.ComposeTestCheckFunc( + Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), acctest.CheckResourceAttrJMES(resourceName, "container_definitions", "length(@)", acctest.Ct1), acctest.CheckResourceAttrJMES(resourceName, "container_definitions", "[0].cpu", acctest.Ct10), @@ -1570,11 +1570,9 @@ func testAccCheckTaskDefinitionDestroy(ctx context.Context) resource.TestCheckFu } _, _, err := tfecs.FindTaskDefinitionByFamilyOrARN(ctx, conn, rs.Primary.Attributes[names.AttrARN]) - if tfresource.NotFound(err) { return nil } - if err != nil { return err } From f29d9d86ba0047685e0f76e6e0dc832ea321c1a7 Mon Sep 17 00:00:00 2001 From: Graham Davison Date: Fri, 4 Oct 2024 17:14:08 -0700 Subject: [PATCH 3/4] Tests revision in basic test --- internal/service/ecs/task_definition_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/service/ecs/task_definition_test.go b/internal/service/ecs/task_definition_test.go index 966d34076f68..da13efd58c75 100644 --- a/internal/service/ecs/task_definition_test.go +++ b/internal/service/ecs/task_definition_test.go @@ -107,8 +107,9 @@ func TestAccECSTaskDefinition_basic(t *testing.T) { Config: testAccTaskDefinitionConfig_basic(rName), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), - acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(`task-definition/.+`)), - acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(`task-definition/.+`)), + acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(fmt.Sprintf(`task-definition/%s:%s$`, rName, acctest.Ct1))), + acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(fmt.Sprintf(`task-definition/%s$`, rName))), + resource.TestCheckResourceAttr(resourceName, "revision", acctest.Ct1), resource.TestCheckResourceAttr(resourceName, "track_latest", acctest.CtFalse), ), }, @@ -116,8 +117,9 @@ func TestAccECSTaskDefinition_basic(t *testing.T) { Config: testAccTaskDefinitionConfig_modified(rName), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckTaskDefinitionExists(ctx, resourceName, &def), - acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(`task-definition/.+`)), - acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(`task-definition/.+`)), + acctest.MatchResourceAttrRegionalARN(resourceName, names.AttrARN, "ecs", regexache.MustCompile(fmt.Sprintf(`task-definition/%s:%s$`, rName, acctest.Ct2))), + acctest.MatchResourceAttrRegionalARN(resourceName, "arn_without_revision", "ecs", regexache.MustCompile(fmt.Sprintf(`task-definition/%s$`, rName))), + resource.TestCheckResourceAttr(resourceName, "revision", acctest.Ct2), ), }, { From 685d624c301bca7d5d0fb5691aa2ee80c06ca9d5 Mon Sep 17 00:00:00 2001 From: Graham Davison Date: Fri, 11 Oct 2024 13:35:31 -0700 Subject: [PATCH 4/4] Adds checks for Task Definitions that have been deleted or are in the process of being deleted --- internal/service/ecs/task_definition.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/internal/service/ecs/task_definition.go b/internal/service/ecs/task_definition.go index d7e5ca880669..606b94202fdf 100644 --- a/internal/service/ecs/task_definition.go +++ b/internal/service/ecs/task_definition.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "log" + "net/http" "strings" "github.com/YakDriver/regexache" @@ -15,6 +16,7 @@ import ( "github.com/aws/aws-sdk-go-v2/aws/arn" "github.com/aws/aws-sdk-go-v2/service/ecs" awstypes "github.com/aws/aws-sdk-go-v2/service/ecs/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" @@ -586,7 +588,6 @@ func resourceTaskDefinitionRead(ctx context.Context, d *schema.ResourceData, met d.SetId("") return diags } - if err != nil { return sdkdiag.AppendErrorf(diags, "reading ECS Task Definition (%s): %s", familyOrARN, err) } @@ -663,8 +664,9 @@ func resourceTaskDefinitionDelete(ctx context.Context, d *schema.ResourceData, m _, err := conn.DeregisterTaskDefinition(ctx, &ecs.DeregisterTaskDefinitionInput{ TaskDefinition: aws.String(d.Get(names.AttrARN).(string)), }) - - if err != nil { + if tfawserr.ErrMessageContains(err, "ClientException", "in the process of being deleted") { + return diags + } else if err != nil { return sdkdiag.AppendErrorf(diags, "deleting ECS Task Definition (%s): %s", d.Id(), err) } @@ -673,8 +675,12 @@ func resourceTaskDefinitionDelete(ctx context.Context, d *schema.ResourceData, m func findTaskDefinition(ctx context.Context, conn *ecs.Client, input *ecs.DescribeTaskDefinitionInput) (*awstypes.TaskDefinition, []awstypes.Tag, error) { output, err := conn.DescribeTaskDefinition(ctx, input) - - if err != nil { + if tfawserr.ErrHTTPStatusCodeEquals(err, http.StatusBadRequest) { + return nil, nil, &retry.NotFoundError{ + LastError: err, + LastRequest: input, + } + } else if err != nil { return nil, nil, err } @@ -704,7 +710,7 @@ func findTaskDefinitionByFamilyOrARN(ctx context.Context, conn *ecs.Client, fami return nil, nil, err } - if status := taskDefinition.Status; status == awstypes.TaskDefinitionStatusInactive { + if status := taskDefinition.Status; status == awstypes.TaskDefinitionStatusInactive || status == awstypes.TaskDefinitionStatusDeleteInProgress { return nil, nil, &retry.NotFoundError{ Message: string(status), LastRequest: input,