From 6f76340192147f7a1f29a2831d2ed5cb6f167b8b Mon Sep 17 00:00:00 2001 From: Anton Tereshchenkov Date: Sat, 28 Feb 2015 18:55:10 +0800 Subject: [PATCH] providers/digitalocean: add dot in GET response Added tests for relative and external CNAME values. --- .../resource_digitalocean_record.go | 25 +++-- .../resource_digitalocean_record_test.go | 94 +++++++++++++++++-- 2 files changed, 103 insertions(+), 16 deletions(-) diff --git a/builtin/providers/digitalocean/resource_digitalocean_record.go b/builtin/providers/digitalocean/resource_digitalocean_record.go index 1dcf7a3a9..78a4e8911 100644 --- a/builtin/providers/digitalocean/resource_digitalocean_record.go +++ b/builtin/providers/digitalocean/resource_digitalocean_record.go @@ -68,18 +68,10 @@ func resourceDigitalOceanRecord() *schema.Resource { func resourceDigitalOceanRecordCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*digitalocean.Client) - rrValue := d.Get("value").(string) - // Ensure all records with domain value are absolute (ending with dot) - if t := d.Get("type").(string); t == "CNAME" || t == "MX" || t == "NS" || t == "SRV" { - if rrValue[len(rrValue)-1] != '.' { - rrValue += "." - } - } - newRecord := digitalocean.CreateRecord{ Type: d.Get("type").(string), Name: d.Get("name").(string), - Data: rrValue, + Data: d.Get("value").(string), Priority: d.Get("priority").(string), Port: d.Get("port").(string), Weight: d.Get("weight").(string), @@ -99,8 +91,9 @@ func resourceDigitalOceanRecordCreate(d *schema.ResourceData, meta interface{}) func resourceDigitalOceanRecordRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*digitalocean.Client) + domain := d.Get("domain").(string) - rec, err := client.RetrieveRecord(d.Get("domain").(string), d.Id()) + rec, err := client.RetrieveRecord(domain, d.Id()) if err != nil { // If the record is somehow already destroyed, mark as // succesfully gone @@ -112,6 +105,18 @@ func resourceDigitalOceanRecordRead(d *schema.ResourceData, meta interface{}) er return err } + // Update response data for records with domain value + if t := rec.Type; t == "CNAME" || t == "MX" || t == "NS" || t == "SRV" { + // Append dot to response if resource value is absolute + if value := d.Get("value").(string); strings.HasSuffix(value, ".") { + rec.Data += "." + // If resource value ends with current domain, make response data absolute + if strings.HasSuffix(value, domain+".") { + rec.Data += domain + "." + } + } + } + d.Set("name", rec.Name) d.Set("type", rec.Type) d.Set("value", rec.Data) diff --git a/builtin/providers/digitalocean/resource_digitalocean_record_test.go b/builtin/providers/digitalocean/resource_digitalocean_record_test.go index dd4b1010f..139fd30b7 100644 --- a/builtin/providers/digitalocean/resource_digitalocean_record_test.go +++ b/builtin/providers/digitalocean/resource_digitalocean_record_test.go @@ -88,13 +88,67 @@ func TestAccDigitalOceanRecord_HostnameValue(t *testing.T) { Config: testAccCheckDigitalOceanRecordConfig_cname, Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), - testAccCheckDigitalOceanRecordAttributesHostname(&record), + testAccCheckDigitalOceanRecordAttributesHostname("a", &record), resource.TestCheckResourceAttr( "digitalocean_record.foobar", "name", "terraform"), resource.TestCheckResourceAttr( "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), resource.TestCheckResourceAttr( - "digitalocean_record.foobar", "value", "a.foobar-test-terraform.com"), + "digitalocean_record.foobar", "value", "a.foobar-test-terraform.com."), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "type", "CNAME"), + ), + }, + }, + }) +} + +func TestAccDigitalOceanRecord_RelativeHostnameValue(t *testing.T) { + var record digitalocean.Record + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckDigitalOceanRecordDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckDigitalOceanRecordConfig_relative_cname, + Check: resource.ComposeTestCheckFunc( + testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), + testAccCheckDigitalOceanRecordAttributesHostname("a.b", &record), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "name", "terraform"), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "value", "a.b"), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "type", "CNAME"), + ), + }, + }, + }) +} + +func TestAccDigitalOceanRecord_ExternalHostnameValue(t *testing.T) { + var record digitalocean.Record + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckDigitalOceanRecordDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckDigitalOceanRecordConfig_external_cname, + Check: resource.ComposeTestCheckFunc( + testAccCheckDigitalOceanRecordExists("digitalocean_record.foobar", &record), + testAccCheckDigitalOceanRecordAttributesHostname("a.foobar-test-terraform.net", &record), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "name", "terraform"), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "domain", "foobar-test-terraform.com"), + resource.TestCheckResourceAttr( + "digitalocean_record.foobar", "value", "a.foobar-test-terraform.net."), resource.TestCheckResourceAttr( "digitalocean_record.foobar", "type", "CNAME"), ), @@ -173,11 +227,11 @@ func testAccCheckDigitalOceanRecordExists(n string, record *digitalocean.Record) } } -func testAccCheckDigitalOceanRecordAttributesHostname(record *digitalocean.Record) resource.TestCheckFunc { +func testAccCheckDigitalOceanRecordAttributesHostname(data string, record *digitalocean.Record) resource.TestCheckFunc { return func(s *terraform.State) error { - if record.Data != "a.foobar-test-terraform.com" { - return fmt.Errorf("Bad value: %s", record.Data) + if record.Data != data { + return fmt.Errorf("Bad value: expected %s, got %s", data, record.Data) } return nil @@ -222,6 +276,34 @@ resource "digitalocean_record" "foobar" { domain = "${digitalocean_domain.foobar.name}" name = "terraform" - value = "a.foobar-test-terraform.com" + value = "a.foobar-test-terraform.com." + type = "CNAME" +}` + +const testAccCheckDigitalOceanRecordConfig_relative_cname = ` +resource "digitalocean_domain" "foobar" { + name = "foobar-test-terraform.com" + ip_address = "192.168.0.10" +} + +resource "digitalocean_record" "foobar" { + domain = "${digitalocean_domain.foobar.name}" + + name = "terraform" + value = "a.b" + type = "CNAME" +}` + +const testAccCheckDigitalOceanRecordConfig_external_cname = ` +resource "digitalocean_domain" "foobar" { + name = "foobar-test-terraform.com" + ip_address = "192.168.0.10" +} + +resource "digitalocean_record" "foobar" { + domain = "${digitalocean_domain.foobar.name}" + + name = "terraform" + value = "a.foobar-test-terraform.net." type = "CNAME" }`