From 2ee9a9cf24629ed560db863a8a10a969e53882bc Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Mon, 23 Aug 2021 21:51:13 +0300 Subject: [PATCH 1/3] route53 delegation set - add arn --- aws/resource_aws_route53_delegation_set.go | 50 ++++++++++++------- ...esource_aws_route53_delegation_set_test.go | 24 +++++++++ .../r/route53_delegation_set.html.markdown | 1 + 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/aws/resource_aws_route53_delegation_set.go b/aws/resource_aws_route53_delegation_set.go index cb6378e87163..68974ae81c9d 100644 --- a/aws/resource_aws_route53_delegation_set.go +++ b/aws/resource_aws_route53_delegation_set.go @@ -1,14 +1,16 @@ package aws import ( + "fmt" "log" - "sort" "strings" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/arn" "github.com/aws/aws-sdk-go/service/route53" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) func resourceAwsRoute53DelegationSet() *schema.Resource { @@ -21,10 +23,15 @@ func resourceAwsRoute53DelegationSet() *schema.Resource { }, Schema: map[string]*schema.Schema{ - "reference_name": { + "arn": { Type: schema.TypeString, - Optional: true, - ForceNew: true, + Computed: true, + }, + "reference_name": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ValidateFunc: validation.StringLenBetween(0, 128), }, "name_servers": { @@ -58,8 +65,8 @@ func resourceAwsRoute53DelegationSetCreate(d *schema.ResourceData, meta interfac set := out.DelegationSet d.SetId(cleanDelegationSetId(*set.Id)) - d.Set("name_servers", expandNameServers(set.NameServers)) - return nil + + return resourceAwsRoute53DelegationSetRead(d, meta) } func resourceAwsRoute53DelegationSetRead(d *schema.ResourceData, meta interface{}) error { @@ -71,14 +78,24 @@ func resourceAwsRoute53DelegationSetRead(d *schema.ResourceData, meta interface{ log.Printf("[DEBUG] Reading Route53 reusable delegation set: %#v", input) out, err := r53.GetReusableDelegationSet(input) if err != nil { + if isAWSErr(err, route53.ErrCodeNoSuchDelegationSet, "") { + d.SetId("") + return nil + + } return err } log.Printf("[DEBUG] Route53 reusable delegation set received: %#v", out) set := out.DelegationSet + d.Set("name_servers", aws.StringValueSlice(set.NameServers)) - d.SetId(cleanDelegationSetId(*set.Id)) - d.Set("name_servers", expandNameServers(set.NameServers)) + arn := arn.ARN{ + Partition: meta.(*AWSClient).partition, + Service: "route53", + Resource: fmt.Sprintf("delegationset/%s", d.Id()), + }.String() + d.Set("arn", arn) return nil } @@ -91,18 +108,15 @@ func resourceAwsRoute53DelegationSetDelete(d *schema.ResourceData, meta interfac } log.Printf("[DEBUG] Deleting Route53 reusable delegation set: %#v", input) _, err := r53.DeleteReusableDelegationSet(input) - return err -} + if isAWSErr(err, route53.ErrCodeNoSuchDelegationSet, "") { + return nil + } -func expandNameServers(name_servers []*string) []string { - log.Printf("[DEBUG] Processing %d name servers: %#v...", len(name_servers), name_servers) - ns := make([]string, len(name_servers)) - for i, server := range name_servers { - ns[i] = *server + if err != nil { + return fmt.Errorf("error deleting Route53 reusable delegation set (%s): %w", d.Id(), err) } - sort.Strings(ns) - log.Printf("[DEBUG] Returning processed name servers: %#v", ns) - return ns + + return nil } func cleanDelegationSetId(id string) string { diff --git a/aws/resource_aws_route53_delegation_set_test.go b/aws/resource_aws_route53_delegation_set_test.go index 488ab57d5e2d..3a8a593b326a 100644 --- a/aws/resource_aws_route53_delegation_set_test.go +++ b/aws/resource_aws_route53_delegation_set_test.go @@ -3,6 +3,7 @@ package aws import ( "fmt" "reflect" + "regexp" "testing" "github.com/aws/aws-sdk-go/aws" @@ -26,6 +27,7 @@ func TestAccAWSRoute53DelegationSet_basic(t *testing.T) { Config: testAccRoute53DelegationSetConfig(refName), Check: resource.ComposeTestCheckFunc( testAccCheckRoute53DelegationSetExists(resourceName), + testAccMatchResourceAttrGlobalARNNoAccount(resourceName, "arn", "route53", regexp.MustCompile("delegationset/.+")), ), }, { @@ -76,6 +78,28 @@ func TestAccAWSRoute53DelegationSet_withZones(t *testing.T) { }) } +func TestAccAWSRoute53DelegationSet_disappears(t *testing.T) { + refName := acctest.RandomWithPrefix("tf-acc-test") + resourceName := "aws_route53_delegation_set.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ErrorCheck: testAccErrorCheck(t, route53.EndpointsID), + Providers: testAccProviders, + CheckDestroy: testAccCheckRoute53DelegationSetDestroy, + Steps: []resource.TestStep{ + { + Config: testAccRoute53DelegationSetConfig(refName), + Check: resource.ComposeTestCheckFunc( + testAccCheckRoute53DelegationSetExists(resourceName), + testAccCheckResourceDisappears(testAccProvider, resourceAwsRoute53DelegationSet(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) +} + func testAccCheckRoute53DelegationSetDestroy(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).r53conn for _, rs := range s.RootModule().Resources { diff --git a/website/docs/r/route53_delegation_set.html.markdown b/website/docs/r/route53_delegation_set.html.markdown index 374524db6a5e..6fecc31d30fe 100644 --- a/website/docs/r/route53_delegation_set.html.markdown +++ b/website/docs/r/route53_delegation_set.html.markdown @@ -39,6 +39,7 @@ The following arguments are supported: In addition to all arguments above, the following attributes are exported: +* `arn` - The Amazon Resource Name (ARN) of the Delegation Set. * `id` - The delegation set ID * `name_servers` - A list of authoritative name servers for the hosted zone (effectively a list of NS records). From 3f1c11b44db244580e0af85b9d938b5c8b738f12 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Mon, 23 Aug 2021 21:55:12 +0300 Subject: [PATCH 2/3] route53 delegation set datasource - add arn --- .changelog/20664.txt | 11 +++++++++++ aws/data_source_aws_route53_delegation_set.go | 14 +++++++++++++- aws/data_source_aws_route53_delegation_set_test.go | 1 + .../docs/d/route53_delegation_set.html.markdown | 2 ++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changelog/20664.txt diff --git a/.changelog/20664.txt b/.changelog/20664.txt new file mode 100644 index 000000000000..cba94cf3ded9 --- /dev/null +++ b/.changelog/20664.txt @@ -0,0 +1,11 @@ +```release-note:enhancement +resource/aws_route53_delegation_set: Add `arn` attribute +``` + +```release-note:enhancement +resource/aws_route53_delegation_set: Add plan time validation for `reference_name` +``` + +```release-note:enhancement +data-source/aws_route53_delegation_set: Add `arn` attribute +``` \ No newline at end of file diff --git a/aws/data_source_aws_route53_delegation_set.go b/aws/data_source_aws_route53_delegation_set.go index 723a17c7b2d9..5a0774812a2a 100644 --- a/aws/data_source_aws_route53_delegation_set.go +++ b/aws/data_source_aws_route53_delegation_set.go @@ -5,6 +5,7 @@ import ( "log" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/arn" "github.com/aws/aws-sdk-go/service/route53" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -14,6 +15,10 @@ func dataSourceAwsDelegationSet() *schema.Resource { Read: dataSourceAwsDelegationSetRead, Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Computed: true, + }, "id": { Type: schema.TypeString, Required: true, @@ -50,9 +55,16 @@ func dataSourceAwsDelegationSetRead(d *schema.ResourceData, meta interface{}) er d.SetId(dSetID) d.Set("caller_reference", resp.DelegationSet.CallerReference) - if err := d.Set("name_servers", expandNameServers(resp.DelegationSet.NameServers)); err != nil { + if err := d.Set("name_servers", aws.StringValueSlice(resp.DelegationSet.NameServers)); err != nil { return fmt.Errorf("error setting name_servers: %w", err) } + arn := arn.ARN{ + Partition: meta.(*AWSClient).partition, + Service: "route53", + Resource: fmt.Sprintf("delegationset/%s", d.Id()), + }.String() + d.Set("arn", arn) + return nil } diff --git a/aws/data_source_aws_route53_delegation_set_test.go b/aws/data_source_aws_route53_delegation_set_test.go index d3f217c8a576..b397149d7344 100644 --- a/aws/data_source_aws_route53_delegation_set_test.go +++ b/aws/data_source_aws_route53_delegation_set_test.go @@ -23,6 +23,7 @@ func TestAccAWSRoute53DelegationSetDataSource_basic(t *testing.T) { { Config: testAccAWSDataSourceAWSRoute53DelegationSetConfig_basic(zoneName), Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), resource.TestCheckResourceAttrPair(dataSourceName, "name_servers.#", resourceName, "name_servers.#"), resource.TestMatchResourceAttr("data.aws_route53_delegation_set.dset", "caller_reference", regexp.MustCompile("DynDNS(.*)")), ), diff --git a/website/docs/d/route53_delegation_set.html.markdown b/website/docs/d/route53_delegation_set.html.markdown index 8e1c9b8591d7..d9158fa972fc 100644 --- a/website/docs/d/route53_delegation_set.html.markdown +++ b/website/docs/d/route53_delegation_set.html.markdown @@ -24,9 +24,11 @@ data "aws_route53_delegation_set" "dset" { ## Argument Reference + * `id` - (Required) The Hosted Zone id of the desired delegation set. The following attribute is additionally exported: +* `arn` - The Amazon Resource Name (ARN) of the Delegation Set. * `caller_reference` - Caller Reference of the delegation set. * `name_servers` - The list of DNS name servers for the delegation set. From 9b95233140977418705570a0cca481a9d2651f9f Mon Sep 17 00:00:00 2001 From: Ilia Lazebnik Date: Mon, 23 Aug 2021 23:50:06 +0300 Subject: [PATCH 3/3] Update 20664.txt --- .changelog/20664.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.changelog/20664.txt b/.changelog/20664.txt index cba94cf3ded9..a6c0251cff76 100644 --- a/.changelog/20664.txt +++ b/.changelog/20664.txt @@ -8,4 +8,8 @@ resource/aws_route53_delegation_set: Add plan time validation for `reference_nam ```release-note:enhancement data-source/aws_route53_delegation_set: Add `arn` attribute -``` \ No newline at end of file +``` + +```release-note:bug +resource/aws_route53_delegation_set: Properly remove from state when resource does not exist +```