From a7311fa68f96b5a73a6266567eb2f22711de34dd Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 2 May 2016 22:23:21 -0700 Subject: [PATCH] providers/cloudflare: record can manage apex records Apex records must be created by specifying "@" as the name, but this caused Refresh and Delete errors. --- .../cloudflare/resource_cloudflare_record.go | 26 +++++++------- .../resource_cloudflare_record_test.go | 35 +++++++++++++++++++ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/builtin/providers/cloudflare/resource_cloudflare_record.go b/builtin/providers/cloudflare/resource_cloudflare_record.go index 628e40df5..1ab5bc6fa 100644 --- a/builtin/providers/cloudflare/resource_cloudflare_record.go +++ b/builtin/providers/cloudflare/resource_cloudflare_record.go @@ -3,7 +3,6 @@ package cloudflare import ( "fmt" "log" - "strings" "time" "golang.org/x/net/context" @@ -115,11 +114,12 @@ func resourceCloudFlareRecordCreate(d *schema.ResourceData, meta interface{}) er } func resourceCloudFlareRecordRead(d *schema.ResourceData, meta interface{}) error { - var ( - client = meta.(*cloudflare.Client) - domain = d.Get("domain").(string) - rName = strings.Join([]string{d.Get("name").(string), domain}, ".") - ) + client := meta.(*cloudflare.Client) + domain := d.Get("domain").(string) + rName := domain + if v := d.Get("name").(string); v != "@" { + rName = v + "." + rName + } zone, err := retrieveZone(client, domain) if err != nil { @@ -187,11 +187,12 @@ func resourceCloudFlareRecordUpdate(d *schema.ResourceData, meta interface{}) er } func resourceCloudFlareRecordDelete(d *schema.ResourceData, meta interface{}) error { - var ( - client = meta.(*cloudflare.Client) - domain = d.Get("domain").(string) - rName = strings.Join([]string{d.Get("name").(string), domain}, ".") - ) + client := meta.(*cloudflare.Client) + domain := d.Get("domain").(string) + rName := domain + if v := d.Get("name").(string); v != "@" { + rName = v + "." + rName + } zone, err := retrieveZone(client, domain) if err != nil { @@ -218,8 +219,7 @@ func resourceCloudFlareRecordDelete(d *schema.ResourceData, meta interface{}) er func retrieveRecord( client *cloudflare.Client, zone *cloudflare.Zone, - name string, -) (*cloudflare.Record, error) { + name string) (*cloudflare.Record, error) { ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30)) rs, err := client.Records.List(ctx, zone.ID) diff --git a/builtin/providers/cloudflare/resource_cloudflare_record_test.go b/builtin/providers/cloudflare/resource_cloudflare_record_test.go index 82b9ccfa3..64e46fdea 100644 --- a/builtin/providers/cloudflare/resource_cloudflare_record_test.go +++ b/builtin/providers/cloudflare/resource_cloudflare_record_test.go @@ -39,6 +39,32 @@ func TestAccCloudFlareRecord_Basic(t *testing.T) { }) } +func TestAccCloudFlareRecord_Apex(t *testing.T) { + var record cloudflare.Record + domain := os.Getenv("CLOUDFLARE_DOMAIN") + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckCloudFlareRecordDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: fmt.Sprintf(testAccCheckCloudFlareRecordConfigApex, domain), + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudFlareRecordExists("cloudflare_record.foobar", &record), + testAccCheckCloudFlareRecordAttributes(&record), + resource.TestCheckResourceAttr( + "cloudflare_record.foobar", "name", "@"), + resource.TestCheckResourceAttr( + "cloudflare_record.foobar", "domain", domain), + resource.TestCheckResourceAttr( + "cloudflare_record.foobar", "value", "192.168.0.10"), + ), + }, + }, + }) +} + func TestAccCloudFlareRecord_Proxied(t *testing.T) { var record cloudflare.Record domain := os.Getenv("CLOUDFLARE_DOMAIN") @@ -226,6 +252,15 @@ resource "cloudflare_record" "foobar" { ttl = 3600 }` +const testAccCheckCloudFlareRecordConfigApex = ` +resource "cloudflare_record" "foobar" { + domain = "%s" + name = "@" + value = "192.168.0.10" + type = "A" + ttl = 3600 +}` + const testAccCheckCloudFlareRecordConfigProxied = ` resource "cloudflare_record" "foobar" { domain = "%s"