From 98c385723cef3e64ab45c1abda09ae3abd7a45eb Mon Sep 17 00:00:00 2001 From: Paul Stack Date: Mon, 31 Oct 2016 19:18:00 +0000 Subject: [PATCH] provider/aws: Fix aws_route53_record alias perpetual diff (#9704) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #9628 Fixes #9298 When a route53_record alias is updated in the console, AWS prepends `dualstack.` to the name. This is there incase IPV6 is wanted. It is exactly the same without it as it is with it In order to stop perpetual diffs, I introduced a normalizeFunc that will that tke alias name and strip known issues: * dualstack * trailing dot This normalize fun will continue to grow I'm sure ``` % make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSRoute53Record_' ✹ ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2016/10/29 00:28:12 Generated command/internal_plugin_list.go TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSRoute53Record_ -timeout 120m === RUN TestAccAWSRoute53Record_basic --- PASS: TestAccAWSRoute53Record_basic (124.64s) === RUN TestAccAWSRoute53Record_basic_fqdn --- PASS: TestAccAWSRoute53Record_basic_fqdn (132.07s) === RUN TestAccAWSRoute53Record_txtSupport --- PASS: TestAccAWSRoute53Record_txtSupport (134.07s) === RUN TestAccAWSRoute53Record_spfSupport --- PASS: TestAccAWSRoute53Record_spfSupport (113.36s) === RUN TestAccAWSRoute53Record_generatesSuffix --- PASS: TestAccAWSRoute53Record_generatesSuffix (112.62s) === RUN TestAccAWSRoute53Record_wildcard --- PASS: TestAccAWSRoute53Record_wildcard (162.84s) === RUN TestAccAWSRoute53Record_failover --- PASS: TestAccAWSRoute53Record_failover (126.18s) === RUN TestAccAWSRoute53Record_weighted_basic --- PASS: TestAccAWSRoute53Record_weighted_basic (121.10s) === RUN TestAccAWSRoute53Record_alias --- PASS: TestAccAWSRoute53Record_alias (118.14s) === RUN TestAccAWSRoute53Record_s3_alias --- PASS: TestAccAWSRoute53Record_s3_alias (155.07s) === RUN TestAccAWSRoute53Record_weighted_alias --- PASS: TestAccAWSRoute53Record_weighted_alias (235.41s) === RUN TestAccAWSRoute53Record_geolocation_basic ^[[C--- PASS: TestAccAWSRoute53Record_geolocation_basic (125.32s) === RUN TestAccAWSRoute53Record_latency_basic --- PASS: TestAccAWSRoute53Record_latency_basic (122.23s) === RUN TestAccAWSRoute53Record_TypeChange --- PASS: TestAccAWSRoute53Record_TypeChange (231.98s) === RUN TestAccAWSRoute53Record_empty --- PASS: TestAccAWSRoute53Record_empty (116.48s) PASS ok github.com/hashicorp/terraform/builtin/providers/aws 2131.526s ``` Before this fix, I was getting the following by recreating the code in ``` ~ aws_route53_record.alias alias.1563903989.evaluate_target_health: "true" => "false" alias.1563903989.name: "9828-recreation-106795730.us-west-2.elb.amazonaws.com." => "" alias.1563903989.zone_id: "Z1H1FL5HABSF5" => "" alias.318754017.evaluate_target_health: "" => "true" alias.318754017.name: "" => "9828-recreation-106795730.us-west-2.elb.amazonaws.com" alias.318754017.zone_id: "" => "Z1H1FL5HABSF5" Plan: 0 to add, 1 to change, 0 to destroy. ``` After this fix: ``` No changes. Infrastructure is up-to-date. This means that Terraform could not detect any differences between your configuration and the real physical resources that exist. As a result, Terraform doesn't need to do anything. --- .../aws/resource_aws_route53_record.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/builtin/providers/aws/resource_aws_route53_record.go b/builtin/providers/aws/resource_aws_route53_record.go index 1816902f4..fd6c64d4f 100644 --- a/builtin/providers/aws/resource_aws_route53_record.go +++ b/builtin/providers/aws/resource_aws_route53_record.go @@ -95,8 +95,9 @@ func resourceAwsRoute53Record() *schema.Resource { }, "name": &schema.Schema{ - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Required: true, + StateFunc: normalizeAwsAliasName, }, "evaluate_target_health": &schema.Schema{ @@ -374,7 +375,7 @@ func resourceAwsRoute53RecordRead(d *schema.ResourceData, meta interface{}) erro } if alias := record.AliasTarget; alias != nil { - name := strings.TrimSuffix(*alias.DNSName, ".") + name := normalizeAwsAliasName(*alias.DNSName) d.Set("alias", []interface{}{ map[string]interface{}{ "zone_id": *alias.HostedZoneId, @@ -732,7 +733,7 @@ func expandRecordName(name, zone string) string { func resourceAwsRoute53AliasRecordHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) - buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) + buf.WriteString(fmt.Sprintf("%s-", normalizeAwsAliasName(m["name"].(string)))) buf.WriteString(fmt.Sprintf("%s-", m["zone_id"].(string))) buf.WriteString(fmt.Sprintf("%t-", m["evaluate_target_health"].(bool))) @@ -748,3 +749,12 @@ func nilString(s string) *string { } return aws.String(s) } + +func normalizeAwsAliasName(alias interface{}) string { + input := alias.(string) + if strings.HasPrefix(input, "dualstack.") { + return strings.Replace(input, "dualstack.", "", -1) + } + + return strings.TrimRight(input, ".") +}