From 23a94a74467227bdbcf8bacc0c9406a149d8a5b8 Mon Sep 17 00:00:00 2001 From: Herman <97112+frek818@users.noreply.github.com> Date: Thu, 26 Jun 2025 21:20:07 -0700 Subject: [PATCH 1/8] fix bug where key value items are deleted when the value is changed --- .../service/cloudfrontkeyvaluestore/equal.go | 5 ++ .../cloudfrontkeyvaluestore/keys_exclusive.go | 7 +-- .../keys_exclusive_test.go | 47 +++++++++++++++++-- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/internal/service/cloudfrontkeyvaluestore/equal.go b/internal/service/cloudfrontkeyvaluestore/equal.go index b8269fe493e4..75f9f54c1ad7 100644 --- a/internal/service/cloudfrontkeyvaluestore/equal.go +++ b/internal/service/cloudfrontkeyvaluestore/equal.go @@ -12,3 +12,8 @@ import ( func resourceKeyValuePairEqual(s1, s2 awstypes.ListKeysResponseListItem) bool { return aws.ToString(s1.Key) == aws.ToString(s2.Key) && aws.ToString(s1.Value) == aws.ToString(s2.Value) } + +// resourceKeyValuePairKeyEqual determines whether two key value pairs have an equal key +func resourceKeyValuePairKeyEqual(s1, s2 awstypes.ListKeysResponseListItem) bool { + return aws.ToString(s1.Key) == aws.ToString(s2.Key) +} diff --git a/internal/service/cloudfrontkeyvaluestore/keys_exclusive.go b/internal/service/cloudfrontkeyvaluestore/keys_exclusive.go index aab3d5ace86b..05e7b8fc8c13 100644 --- a/internal/service/cloudfrontkeyvaluestore/keys_exclusive.go +++ b/internal/service/cloudfrontkeyvaluestore/keys_exclusive.go @@ -124,7 +124,8 @@ func (r *keysExclusiveResource) syncKeyValuePairs(ctx context.Context, plan *key return diags } - put, del, _ := intflex.DiffSlices(have, want, resourceKeyValuePairEqual) + put, del, modify, _ := intflex.DiffSlicesWithModify(have, want, resourceKeyValuePairEqual, resourceKeyValuePairKeyEqual) + put = append(put, modify...) // We need to perform a batched operation in the event of many Key Value Pairs // to stay within AWS service limits @@ -295,7 +296,6 @@ func FindResourceKeyValuePairsForKeyValueStore(ctx context.Context, conn *cloudf paginator := cloudfrontkeyvaluestore.NewListKeysPaginator(conn, input) for paginator.HasMorePages() { page, err := paginator.NextPage(ctx) - if err != nil { return nil, nil, err } @@ -324,7 +324,8 @@ func expandDeleteKeyRequestListItem(delete []awstypes.ListKeysResponseListItem) out := []awstypes.DeleteKeyRequestListItem{} for _, r := range delete { out = append(out, awstypes.DeleteKeyRequestListItem{ - Key: r.Key}) + Key: r.Key, + }) } return out diff --git a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go index f1bc78af6ab2..c13dbec277be 100644 --- a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go +++ b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go @@ -333,6 +333,50 @@ func TestAccCloudFrontKeyValueStoreKeysExclusive_maxBatchSize(t *testing.T) { }) } +func TestAccCloudFrontKeyValueStoreKeysExclusive_itemRemainsAfterValueChange(t *testing.T) { + ctx := acctest.Context(t) + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + var keys []string + var values []string + var newValues []string + keys = append(keys, sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)) + values = append(values, "Original Value") + newValues = append(newValues, "New Value") + + resourceName := "aws_cloudfrontkeyvaluestore_keys_exclusive.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { + acctest.PreCheck(ctx, t) + acctest.PreCheckPartitionHasService(t, names.CloudFront) + }, + ErrorCheck: acctest.ErrorCheck(t, names.CloudFront), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckKeysExclusiveDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccKeysExclusiveConfig_basic(keys, values, rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckKeysExclusiveExists(ctx, resourceName), + testCheckMultipleKeyValuePairs(keys, values, resourceName), + ), + }, + { + Config: testAccKeysExclusiveConfig_basic(keys, values, rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckKeysExclusiveExists(ctx, resourceName), + testCheckMultipleKeyValuePairs(keys, newValues, resourceName), + ), + ResourceName: resourceName, + ImportState: true, + ImportStateIdFunc: acctest.AttrImportStateIdFunc(resourceName, "key_value_store_arn"), + ImportStateVerify: true, + ImportStateVerifyIdentifierAttribute: "key_value_store_arn", + }, + }, + }) +} + func testAccCheckKeysExclusiveDestroy(ctx context.Context) resource.TestCheckFunc { return func(s *terraform.State) error { conn := acctest.Provider.Meta().(*conns.AWSClient).CloudFrontKeyValueStoreClient(ctx) @@ -369,7 +413,6 @@ func testAccCheckKeysExclusiveExists(ctx context.Context, n string) resource.Tes conn := acctest.Provider.Meta().(*conns.AWSClient).CloudFrontKeyValueStoreClient(ctx) _, out, err := tfcloudfrontkeyvaluestore.FindResourceKeyValuePairsForKeyValueStore(ctx, conn, rs.Primary.Attributes["key_value_store_arn"]) - if err != nil { return create.Error(names.CloudFrontKeyValueStore, create.ErrActionCheckingExistence, tfcloudfrontkeyvaluestore.ResNameKeysExclusive, rs.Primary.Attributes["key_value_store_arn"], err) } @@ -393,7 +436,6 @@ func testAccCheckKeyValueStoreKeysExclusiveUpdate(ctx context.Context, n string, conn := acctest.Provider.Meta().(*conns.AWSClient).CloudFrontKeyValueStoreClient(ctx) resp, err := tfcloudfrontkeyvaluestore.FindKeyValueStoreByARN(ctx, conn, rs.Primary.Attributes["key_value_store_arn"]) - if err != nil { return fmt.Errorf("error finding Cloudfront KeyValueStore in out of band test") } @@ -406,7 +448,6 @@ func testAccCheckKeyValueStoreKeysExclusiveUpdate(ctx context.Context, n string, } _, err = conn.UpdateKeys(ctx, &input) - if err != nil { return fmt.Errorf("Error updating CloudFront KeyValueStore %s Key for out of band tests", rs.Primary.Attributes["key_value_store_arn"]) } From 895e76d464386918cf8f27c0fab0f210637ab008 Mon Sep 17 00:00:00 2001 From: Herman <97112+frek818@users.noreply.github.com> Date: Thu, 26 Jun 2025 21:20:20 -0700 Subject: [PATCH 2/8] add change log entry --- .changelog/43208.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/43208.txt diff --git a/.changelog/43208.txt b/.changelog/43208.txt new file mode 100644 index 000000000000..11a827d6fdb6 --- /dev/null +++ b/.changelog/43208.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_cloudfrontkeyvaluestore_keys_exclusive: Prevent deletion of change key value pair. +``` From c12d8810ec8740b1501a9fadf146dc57dc107e47 Mon Sep 17 00:00:00 2001 From: frek818 <97112+frek818@users.noreply.github.com> Date: Fri, 27 Jun 2025 11:50:42 -0400 Subject: [PATCH 3/8] Update .changelog/43208.txt Co-authored-by: Brittan DeYoung <32572259+brittandeyoung@users.noreply.github.com> --- .changelog/43208.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/43208.txt b/.changelog/43208.txt index 11a827d6fdb6..ab8226bb07db 100644 --- a/.changelog/43208.txt +++ b/.changelog/43208.txt @@ -1,3 +1,3 @@ ```release-note:bug -resource/aws_cloudfrontkeyvaluestore_keys_exclusive: Prevent deletion of change key value pair. +resource/aws_cloudfrontkeyvaluestore_keys_exclusive: Fixes bug where updating an existing `resource_key_value_pair` value would result in the `resource_key_value_pair` being deleted instead of updated. ``` From 2a041e468fad0c1083166446485870b21c0962c7 Mon Sep 17 00:00:00 2001 From: frek818 <97112+frek818@users.noreply.github.com> Date: Fri, 27 Jun 2025 11:53:43 -0400 Subject: [PATCH 4/8] Update internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go Co-authored-by: Brittan DeYoung <32572259+brittandeyoung@users.noreply.github.com> --- internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go index c13dbec277be..6078fdc0e816 100644 --- a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go +++ b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go @@ -362,7 +362,7 @@ func TestAccCloudFrontKeyValueStoreKeysExclusive_itemRemainsAfterValueChange(t * ), }, { - Config: testAccKeysExclusiveConfig_basic(keys, values, rName), + Config: testAccKeysExclusiveConfig_basic(keys, newValues, rName), Check: resource.ComposeTestCheckFunc( testAccCheckKeysExclusiveExists(ctx, resourceName), testCheckMultipleKeyValuePairs(keys, newValues, resourceName), From 8842d5d97f715d8ffaf1630c0bf023feeed854ab Mon Sep 17 00:00:00 2001 From: frek818 <97112+frek818@users.noreply.github.com> Date: Fri, 27 Jun 2025 12:03:26 -0400 Subject: [PATCH 5/8] Update internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go Co-authored-by: Brittan DeYoung <32572259+brittandeyoung@users.noreply.github.com> --- .../service/cloudfrontkeyvaluestore/keys_exclusive_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go index 6078fdc0e816..c511b8020cdd 100644 --- a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go +++ b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go @@ -367,11 +367,6 @@ func TestAccCloudFrontKeyValueStoreKeysExclusive_itemRemainsAfterValueChange(t * testAccCheckKeysExclusiveExists(ctx, resourceName), testCheckMultipleKeyValuePairs(keys, newValues, resourceName), ), - ResourceName: resourceName, - ImportState: true, - ImportStateIdFunc: acctest.AttrImportStateIdFunc(resourceName, "key_value_store_arn"), - ImportStateVerify: true, - ImportStateVerifyIdentifierAttribute: "key_value_store_arn", }, }, }) From de1c64a7dee3de556460f43cf90e80a0c4e9b184 Mon Sep 17 00:00:00 2001 From: Jared Baker Date: Mon, 7 Jul 2025 13:22:59 -0400 Subject: [PATCH 6/8] r/aws_cloudfrontkeyvaluestore_keys_exclusive(test): tweak test name ```console % make testacc PKG=cloudfrontkeyvaluestore TESTS=TestAccCloudFrontKeyValueStoreKeysExclusive_ make: Verifying source code with gofmt... ==> Checking that code complies with gofmt requirements... TF_ACC=1 go1.24.4 test ./internal/service/cloudfrontkeyvaluestore/... -v -count 1 -parallel 20 -run='TestAccCloudFrontKeyValueStoreKeysExclusive_' -timeout 360m -vet=off 2025/07/07 13:20:31 Creating Terraform AWS Provider (SDKv2-style)... 2025/07/07 13:20:31 Initializing Terraform AWS Provider (SDKv2-style)... --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_disappears_KeyValueStore (29.38s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_value (38.49s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_outOfBandRemoval (40.03s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_basic (40.04s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_outOfBandAddition (40.41s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate (47.01s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_maxBatchSize (49.63s) --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_empty (49.80s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/cloudfrontkeyvaluestore 55.867s ``` --- internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go index c511b8020cdd..c00fa4c47ea9 100644 --- a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go +++ b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go @@ -333,7 +333,7 @@ func TestAccCloudFrontKeyValueStoreKeysExclusive_maxBatchSize(t *testing.T) { }) } -func TestAccCloudFrontKeyValueStoreKeysExclusive_itemRemainsAfterValueChange(t *testing.T) { +func TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate(t *testing.T) { ctx := acctest.Context(t) rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) var keys []string From 73d58ea04cb9ddf4da221e3b06b26a715e825a42 Mon Sep 17 00:00:00 2001 From: Jared Baker Date: Mon, 7 Jul 2025 13:24:00 -0400 Subject: [PATCH 7/8] chore: tweak changelog --- .changelog/43208.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/43208.txt b/.changelog/43208.txt index ab8226bb07db..bef18843a6c7 100644 --- a/.changelog/43208.txt +++ b/.changelog/43208.txt @@ -1,3 +1,3 @@ ```release-note:bug -resource/aws_cloudfrontkeyvaluestore_keys_exclusive: Fixes bug where updating an existing `resource_key_value_pair` value would result in the `resource_key_value_pair` being deleted instead of updated. +resource/aws_cloudfrontkeyvaluestore_keys_exclusive: Fix errant deletion of key value pairs when a value is changed ``` From 8a54b0d1ac9aece02bc4c9e78a75e0a873d8f5cb Mon Sep 17 00:00:00 2001 From: Jared Baker Date: Mon, 7 Jul 2025 13:30:36 -0400 Subject: [PATCH 8/8] r/aws_cloudfrontkeyvaluestore_keys_exclusive(test): tidy test init ```console % make testacc PKG=cloudfrontkeyvaluestore TESTS=TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate make: Verifying source code with gofmt... ==> Checking that code complies with gofmt requirements... TF_ACC=1 go1.24.4 test ./internal/service/cloudfrontkeyvaluestore/... -v -count 1 -parallel 20 -run='TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate' -timeout 360m -vet=off 2025/07/07 13:29:14 Creating Terraform AWS Provider (SDKv2-style)... 2025/07/07 13:29:14 Initializing Terraform AWS Provider (SDKv2-style)... === RUN TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate === PAUSE TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate === CONT TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate --- PASS: TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate (44.56s) PASS ok github.com/hashicorp/terraform-provider-aws/internal/service/cloudfrontkeyvaluestore 50.354s ``` --- .../cloudfrontkeyvaluestore/keys_exclusive_test.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go index c00fa4c47ea9..6a6b3dc14f49 100644 --- a/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go +++ b/internal/service/cloudfrontkeyvaluestore/keys_exclusive_test.go @@ -336,13 +336,9 @@ func TestAccCloudFrontKeyValueStoreKeysExclusive_maxBatchSize(t *testing.T) { func TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate(t *testing.T) { ctx := acctest.Context(t) rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) - var keys []string - var values []string - var newValues []string - keys = append(keys, sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)) - values = append(values, "Original Value") - newValues = append(newValues, "New Value") - + keys := []string{sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)} + values := []string{sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)} + valuesUpdated := []string{sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)} resourceName := "aws_cloudfrontkeyvaluestore_keys_exclusive.test" resource.ParallelTest(t, resource.TestCase{ @@ -362,10 +358,10 @@ func TestAccCloudFrontKeyValueStoreKeysExclusive_valueUpdate(t *testing.T) { ), }, { - Config: testAccKeysExclusiveConfig_basic(keys, newValues, rName), + Config: testAccKeysExclusiveConfig_basic(keys, valuesUpdated, rName), Check: resource.ComposeTestCheckFunc( testAccCheckKeysExclusiveExists(ctx, resourceName), - testCheckMultipleKeyValuePairs(keys, newValues, resourceName), + testCheckMultipleKeyValuePairs(keys, valuesUpdated, resourceName), ), }, },