diff --git a/builtin/providers/aws/resource_aws_route53_delegation_set_test.go b/builtin/providers/aws/resource_aws_route53_delegation_set_test.go index f6954e208..8de0e1b83 100644 --- a/builtin/providers/aws/resource_aws_route53_delegation_set_test.go +++ b/builtin/providers/aws/resource_aws_route53_delegation_set_test.go @@ -2,14 +2,15 @@ package aws import ( "fmt" + "reflect" "testing" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/terraform" - "github.com/awslabs/aws-sdk-go/aws" - "github.com/awslabs/aws-sdk-go/service/route53" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/route53" ) func TestAccRoute53DelegationSet_basic(t *testing.T) { @@ -28,6 +29,28 @@ func TestAccRoute53DelegationSet_basic(t *testing.T) { }) } +func TestAccRoute53DelegationSet_withZones(t *testing.T) { + var zone route53.GetHostedZoneOutput + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckRoute53ZoneDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccRoute53DelegationSetWithZonesConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckRoute53DelegationSetExists("aws_route53_delegation_set.main"), + testAccCheckRoute53ZoneExists("aws_route53_zone.primary", &zone), + testAccCheckRoute53ZoneExists("aws_route53_zone.secondary", &zone), + testAccCheckRoute53NameServersMatch("aws_route53_delegation_set.main", "aws_route53_zone.primary"), + testAccCheckRoute53NameServersMatch("aws_route53_delegation_set.main", "aws_route53_zone.secondary"), + ), + }, + }, + }) +} + func testAccCheckRoute53DelegationSetDestroy(s *terraform.State, provider *schema.Provider) error { conn := provider.Meta().(*AWSClient).r53conn for _, rs := range s.RootModule().Resources { @@ -72,8 +95,59 @@ func testAccCheckRoute53DelegationSetExists(n string) resource.TestCheckFunc { } } +func testAccCheckRoute53NameServersMatch(delegationSetName, zoneName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + conn := testAccProvider.Meta().(*AWSClient).r53conn + + delegationSetLocal, ok := s.RootModule().Resources[delegationSetName] + if !ok { + return fmt.Errorf("Not found: %s", delegationSetName) + } + delegationSet, err := conn.GetReusableDelegationSet(&route53.GetReusableDelegationSetInput{ + ID: aws.String(delegationSetLocal.Primary.ID), + }) + if err != nil { + return fmt.Errorf("Delegation set does not exist: %#v", delegationSetLocal.Primary.ID) + } + + hostedZoneLocal, ok := s.RootModule().Resources[zoneName] + if !ok { + return fmt.Errorf("Not found: %s", zoneName) + } + hostedZone, err := conn.GetHostedZone(&route53.GetHostedZoneInput{ + ID: aws.String(hostedZoneLocal.Primary.ID), + }) + if err != nil { + return fmt.Errorf("Delegation set does not exist: %#v", hostedZoneLocal.Primary.ID) + } + + if !reflect.DeepEqual(delegationSet.DelegationSet.NameServers, hostedZone.DelegationSet.NameServers) { + return fmt.Errorf("Name servers do not match:\nDelegation Set: %#v\nHosted Zone:%#v", + delegationSet.DelegationSet.NameServers, hostedZone.DelegationSet.NameServers) + } + + return nil + } +} + const testAccRoute53DelegationSetConfig = ` resource "aws_route53_delegation_set" "test" { reference_name = "test" } ` + +const testAccRoute53DelegationSetWithZonesConfig = ` +resource "aws_route53_delegation_set" "main" { + reference_name = "main" +} + +resource "aws_route53_zone" "primary" { + name = "hashicorp.com" + delegation_set_id = "${aws_route53_delegation_set.main.id}" +} + +resource "aws_route53_zone" "secondary" { + name = "terraform.io" + delegation_set_id = "${aws_route53_delegation_set.main.id}" +} +` diff --git a/builtin/providers/aws/resource_aws_route53_zone.go b/builtin/providers/aws/resource_aws_route53_zone.go index dca775a1a..3cdd756c6 100644 --- a/builtin/providers/aws/resource_aws_route53_zone.go +++ b/builtin/providers/aws/resource_aws_route53_zone.go @@ -32,7 +32,7 @@ func resourceAwsRoute53Zone() *schema.Resource { "comment": &schema.Schema{ Type: schema.TypeString, Optional: true, - Default: "Managed by Terraform", + Default: "Managed by Terraform", }, "vpc_id": &schema.Schema{ @@ -53,6 +53,12 @@ func resourceAwsRoute53Zone() *schema.Resource { Computed: true, }, + "delegation_set_id": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, + "name_servers": &schema.Schema{ Type: schema.TypeList, Elem: &schema.Schema{Type: schema.TypeString}, @@ -83,6 +89,10 @@ func resourceAwsRoute53ZoneCreate(d *schema.ResourceData, meta interface{}) erro d.Set("vpc_region", req.VPC.VPCRegion) } + if v, ok := d.GetOk("delegation_set_id"); ok { + req.DelegationSetID = aws.String(v.(string)) + } + log.Printf("[DEBUG] Creating Route53 hosted zone: %s", *req.Name) var err error resp, err := r53.CreateHostedZone(req) @@ -157,6 +167,10 @@ func resourceAwsRoute53ZoneRead(d *schema.ResourceData, meta interface{}) error } } + if zone.DelegationSet != nil && zone.DelegationSet.ID != nil { + d.Set("delegation_set_id", cleanDelegationSetId(*zone.DelegationSet.ID)) + } + // get tags req := &route53.ListTagsForResourceInput{ ResourceID: aws.String(d.Id()),