Fix aws_dms_replication_task diff for json with whitespace. (#12380)
This commit is contained in:
parent
7f96b589c1
commit
6c0caaf1dd
|
@ -1,6 +1,8 @@
|
||||||
package aws
|
package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -42,3 +44,17 @@ func suppressAwsDbEngineVersionDiffs(k, old, new string, d *schema.ResourceData)
|
||||||
// Throw a diff by default
|
// Throw a diff by default
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func suppressEquivalentJsonDiffs(k, old, new string, d *schema.ResourceData) bool {
|
||||||
|
ob := bytes.NewBufferString("")
|
||||||
|
if err := json.Compact(ob, []byte(old)); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
nb := bytes.NewBufferString("")
|
||||||
|
if err := json.Compact(nb, []byte(new)); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonBytesEqual(ob.Bytes(), nb.Bytes())
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSuppressEquivalentJsonDiffsWhitespaceAndNoWhitespace(t *testing.T) {
|
||||||
|
d := new(schema.ResourceData)
|
||||||
|
|
||||||
|
noWhitespace := `{"test":"test"}`
|
||||||
|
whitespace := `
|
||||||
|
{
|
||||||
|
"test": "test"
|
||||||
|
}`
|
||||||
|
|
||||||
|
if !suppressEquivalentJsonDiffs("", noWhitespace, whitespace, d) {
|
||||||
|
t.Errorf("Expected suppressEquivalentJsonDiffs to return true for %s == %s", noWhitespace, whitespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
noWhitespaceDiff := `{"test":"test"}`
|
||||||
|
whitespaceDiff := `
|
||||||
|
{
|
||||||
|
"test": "tested"
|
||||||
|
}`
|
||||||
|
|
||||||
|
if suppressEquivalentJsonDiffs("", noWhitespaceDiff, whitespaceDiff, d) {
|
||||||
|
t.Errorf("Expected suppressEquivalentJsonDiffs to return false for %s == %s", noWhitespaceDiff, whitespaceDiff)
|
||||||
|
}
|
||||||
|
}
|
|
@ -57,9 +57,10 @@ func resourceAwsDmsReplicationTask() *schema.Resource {
|
||||||
ValidateFunc: validateDmsReplicationTaskId,
|
ValidateFunc: validateDmsReplicationTaskId,
|
||||||
},
|
},
|
||||||
"replication_task_settings": {
|
"replication_task_settings": {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ValidateFunc: validateJsonString,
|
ValidateFunc: validateJsonString,
|
||||||
|
DiffSuppressFunc: suppressEquivalentJsonDiffs,
|
||||||
},
|
},
|
||||||
"source_endpoint_arn": {
|
"source_endpoint_arn": {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
|
@ -68,9 +69,10 @@ func resourceAwsDmsReplicationTask() *schema.Resource {
|
||||||
ValidateFunc: validateArn,
|
ValidateFunc: validateArn,
|
||||||
},
|
},
|
||||||
"table_mappings": {
|
"table_mappings": {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Required: true,
|
||||||
ValidateFunc: validateJsonString,
|
ValidateFunc: validateJsonString,
|
||||||
|
DiffSuppressFunc: suppressEquivalentJsonDiffs,
|
||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
Type: schema.TypeMap,
|
Type: schema.TypeMap,
|
||||||
|
|
|
@ -2,6 +2,8 @@ package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,3 +26,17 @@ func isBase64Encoded(data []byte) bool {
|
||||||
func looksLikeJsonString(s interface{}) bool {
|
func looksLikeJsonString(s interface{}) bool {
|
||||||
return regexp.MustCompile(`^\s*{`).MatchString(s.(string))
|
return regexp.MustCompile(`^\s*{`).MatchString(s.(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func jsonBytesEqual(b1, b2 []byte) bool {
|
||||||
|
var o1 interface{}
|
||||||
|
if err := json.Unmarshal(b1, &o1); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var o2 interface{}
|
||||||
|
if err := json.Unmarshal(b2, &o2); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return reflect.DeepEqual(o1, o2)
|
||||||
|
}
|
||||||
|
|
|
@ -32,3 +32,41 @@ func TestLooksLikeJsonString(t *testing.T) {
|
||||||
t.Errorf("Expected looksLikeJson to return false for %s", doesNotLookLikeJson)
|
t.Errorf("Expected looksLikeJson to return false for %s", doesNotLookLikeJson)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestJsonBytesEqualQuotedAndUnquoted(t *testing.T) {
|
||||||
|
unquoted := `{"test": "test"}`
|
||||||
|
quoted := "{\"test\": \"test\"}"
|
||||||
|
|
||||||
|
if !jsonBytesEqual([]byte(unquoted), []byte(quoted)) {
|
||||||
|
t.Errorf("Expected jsonBytesEqual to return true for %s == %s", unquoted, quoted)
|
||||||
|
}
|
||||||
|
|
||||||
|
unquotedDiff := `{"test": "test"}`
|
||||||
|
quotedDiff := "{\"test\": \"tested\"}"
|
||||||
|
|
||||||
|
if jsonBytesEqual([]byte(unquotedDiff), []byte(quotedDiff)) {
|
||||||
|
t.Errorf("Expected jsonBytesEqual to return false for %s == %s", unquotedDiff, quotedDiff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJsonBytesEqualWhitespaceAndNoWhitespace(t *testing.T) {
|
||||||
|
noWhitespace := `{"test":"test"}`
|
||||||
|
whitespace := `
|
||||||
|
{
|
||||||
|
"test": "test"
|
||||||
|
}`
|
||||||
|
|
||||||
|
if !jsonBytesEqual([]byte(noWhitespace), []byte(whitespace)) {
|
||||||
|
t.Errorf("Expected jsonBytesEqual to return true for %s == %s", noWhitespace, whitespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
noWhitespaceDiff := `{"test":"test"}`
|
||||||
|
whitespaceDiff := `
|
||||||
|
{
|
||||||
|
"test": "tested"
|
||||||
|
}`
|
||||||
|
|
||||||
|
if jsonBytesEqual([]byte(noWhitespaceDiff), []byte(whitespaceDiff)) {
|
||||||
|
t.Errorf("Expected jsonBytesEqual to return false for %s == %s", noWhitespaceDiff, whitespaceDiff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue