diff --git a/.changelog/14270.txt b/.changelog/14270.txt new file mode 100644 index 000000000000..75b5343fb2ea --- /dev/null +++ b/.changelog/14270.txt @@ -0,0 +1,7 @@ +```release-note:bug +resource/aws_cloudformation_stack: CRLF line endings in `template_body` no longer cause erroneous diffs +``` + +```release-note:note +provider: When using YAML or JSON documents, such as in `template_body` of `aws_cloudformation_stack`, CRLF was previously treated as different from LF but these are now treated as equivalent in many situations +``` diff --git a/internal/verify/json.go b/internal/verify/json.go index 4d1a43d6ce61..9eb5a7f6706b 100644 --- a/internal/verify/json.go +++ b/internal/verify/json.go @@ -85,6 +85,9 @@ func SuppressEquivalentJSONOrYAMLDiffs(k, old, new string, d *schema.ResourceDat } func NormalizeJSONOrYAMLString(templateString interface{}) (string, error) { + if v, ok := templateString.(string); ok { + templateString = strings.ReplaceAll(v, "\r\n", "\n") + } if looksLikeJSONString(templateString) { return structure.NormalizeJsonString(templateString.(string)) } diff --git a/internal/verify/json_test.go b/internal/verify/json_test.go index e759971fd771..27a39aabb71d 100644 --- a/internal/verify/json_test.go +++ b/internal/verify/json_test.go @@ -384,14 +384,25 @@ func TestNormalizeJSONOrYAMLString(t *testing.T) { t.Fatalf("Got:\n\n%s\n\nExpected:\n\n%s\n", actual, validNormalizedJSON) } - validNormalizedYaml := `abc: 1 + validNormalizedYAML := `abc: 1 ` - actual, err = NormalizeJSONOrYAMLString(validNormalizedYaml) + actual, err = NormalizeJSONOrYAMLString(validNormalizedYAML) if err != nil { t.Fatalf("Expected not to throw an error while parsing template, but got: %s", err) } - if actual != validNormalizedYaml { - t.Fatalf("Got:\n\n%s\n\nExpected:\n\n%s\n", actual, validNormalizedYaml) + if actual != validNormalizedYAML { + t.Fatalf("Got:\n\n%s\n\nExpected:\n\n%s\n", actual, validNormalizedYAML) + } + + validNormalizedYAMLWithCarriageReturn := "abc: 1\r\n" + expectedNormalizedYAML := `abc: 1 +` + actual, err = NormalizeJSONOrYAMLString(validNormalizedYAMLWithCarriageReturn) + if err != nil { + t.Fatalf("Expected not to throw an error while parsing template, but got: %s", err) + } + if actual != expectedNormalizedYAML { + t.Fatalf("Got:\n\n%s\n\nExpected:\n\n%s\n", actual, expectedNormalizedYAML) } }