Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/46898.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/aws_cloudfrontkeyvaluestore_key: Fix issue where values were incorrectly JSON-encoded, resulting in extra quotes being stored in AWS
```
9 changes: 9 additions & 0 deletions internal/service/cloudfrontkeyvaluestore/key.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ func (r *keyResource) Create(ctx context.Context, request resource.CreateRequest

// Additional fields.
input.IfMatch = etag
// Manually set Value to avoid JSON encoding by AutoFlEx.
input.Value = data.Value.ValueStringPointer()

output, err := conn.PutKey(ctx, input)

Expand Down Expand Up @@ -159,6 +161,11 @@ func (r *keyResource) Read(ctx context.Context, request resource.ReadRequest, re
return
}

// Manually set Value to avoid JSON decoding by AutoFlEx.
if output.Value != nil {
data.Value = types.StringValue(*output.Value)
}

response.Diagnostics.Append(response.State.Set(ctx, &data)...)
}

Expand Down Expand Up @@ -200,6 +207,8 @@ func (r *keyResource) Update(ctx context.Context, request resource.UpdateRequest

// Additional fields.
input.IfMatch = etag
// Manually set Value to avoid JSON encoding by AutoFlEx.
input.Value = new.Value.ValueStringPointer()

output, err := conn.PutKey(ctx, input)

Expand Down
63 changes: 63 additions & 0 deletions internal/service/cloudfrontkeyvaluestore/key_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func TestAccCloudFrontKeyValueStoreKey_basic(t *testing.T) {
Config: testAccKeyConfig_basic(rName, value),
Check: resource.ComposeTestCheckFunc(
testAccCheckKeyExists(ctx, t, resourceName),
testAccCheckKeyHasValue(ctx, t, resourceName, value),
resource.TestCheckResourceAttr(resourceName, names.AttrKey, rName),
resource.TestCheckResourceAttrPair(resourceName, "key_value_store_arn", "aws_cloudfront_key_value_store.test", names.AttrARN),
resource.TestCheckResourceAttrSet(resourceName, names.AttrID),
Expand Down Expand Up @@ -113,6 +114,7 @@ func TestAccCloudFrontKeyValueStoreKey_value(t *testing.T) {
Config: testAccKeyConfig_basic(rName, value1),
Check: resource.ComposeTestCheckFunc(
testAccCheckKeyExists(ctx, t, resourceName),
testAccCheckKeyHasValue(ctx, t, resourceName, value1),
resource.TestCheckResourceAttr(resourceName, names.AttrKey, rName),
resource.TestCheckResourceAttrPair(resourceName, "key_value_store_arn", "aws_cloudfront_key_value_store.test", names.AttrARN),
resource.TestCheckResourceAttrSet(resourceName, names.AttrID),
Expand All @@ -129,6 +131,7 @@ func TestAccCloudFrontKeyValueStoreKey_value(t *testing.T) {
Config: testAccKeyConfig_basic(rName, value2),
Check: resource.ComposeTestCheckFunc(
testAccCheckKeyExists(ctx, t, resourceName),
testAccCheckKeyHasValue(ctx, t, resourceName, value2),
resource.TestCheckResourceAttr(resourceName, names.AttrKey, rName),
resource.TestCheckResourceAttrPair(resourceName, "key_value_store_arn", "aws_cloudfront_key_value_store.test", names.AttrARN),
resource.TestCheckResourceAttrSet(resourceName, names.AttrID),
Expand All @@ -140,6 +143,39 @@ func TestAccCloudFrontKeyValueStoreKey_value(t *testing.T) {
})
}

func TestAccCloudFrontKeyValueStoreKey_specialCharacters(t *testing.T) {
ctx := acctest.Context(t)
rName := acctest.RandomWithPrefix(t, acctest.ResourcePrefix)
// Test value with special characters that would be affected by JSON encoding
value := `special "quoted" value with 'quotes' and {braces}`
resourceName := "aws_cloudfrontkeyvaluestore_key.test"

acctest.ParallelTest(ctx, t, resource.TestCase{
PreCheck: func() {
acctest.PreCheck(ctx, t)
acctest.PreCheckPartitionHasService(t, names.CloudFront)
},
ErrorCheck: acctest.ErrorCheck(t, names.CloudFront),
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckKeyDestroy(ctx, t),
Steps: []resource.TestStep{
{
Config: testAccKeyConfig_basic(rName, value),
Check: resource.ComposeTestCheckFunc(
testAccCheckKeyExists(ctx, t, resourceName),
testAccCheckKeyHasValue(ctx, t, resourceName, value),
resource.TestCheckResourceAttr(resourceName, names.AttrValue, value),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccCloudFrontKeyValueStoreKey_disappears(t *testing.T) {
ctx := acctest.Context(t)
rName := acctest.RandomWithPrefix(t, acctest.ResourcePrefix)
Expand Down Expand Up @@ -208,6 +244,33 @@ func testAccCheckKeyExists(ctx context.Context, t *testing.T, n string) resource
}
}

func testAccCheckKeyHasValue(ctx context.Context, t *testing.T, n string, expectedValue string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}

conn := acctest.ProviderMeta(ctx, t).CloudFrontKeyValueStoreClient(ctx)

output, err := tfcloudfrontkeyvaluestore.FindKeyByTwoPartKey(ctx, conn, rs.Primary.Attributes["key_value_store_arn"], rs.Primary.Attributes[names.AttrKey])
if err != nil {
return err
}

if output.Value == nil {
return fmt.Errorf("CloudFront KeyValueStore Key value is nil")
}

actualValue := *output.Value
if actualValue != expectedValue {
return fmt.Errorf("CloudFront KeyValueStore Key value = %q, expected %q", actualValue, expectedValue)
}

return nil
}
}

func testAccKeyConfig_basic(rName, value string) string {
return fmt.Sprintf(`
resource "aws_cloudfrontkeyvaluestore_key" "test" {
Expand Down
Loading