Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

providers/cloudflare: record can manage apex records #6449

Merged
merged 3 commits into from
May 3, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Godeps/Godeps.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 4 additions & 8 deletions builtin/providers/cloudflare/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ package cloudflare
import (
"log"

"github.com/crackcomm/cloudflare"
// NOTE: Temporary until they merge my PR:
"github.com/mitchellh/cloudflare-go"
)

type Config struct {
Expand All @@ -12,13 +13,8 @@ type Config struct {
}

// Client() returns a new client for accessing cloudflare.
func (c *Config) Client() (*cloudflare.Client, error) {
client := cloudflare.New(&cloudflare.Options{
Email: c.Email,
Key: c.Token,
})

func (c *Config) Client() (*cloudflare.API, error) {
client := cloudflare.New(c.Token, c.Email)
log.Printf("[INFO] CloudFlare Client configured for user: %s", c.Email)

return client, nil
}
135 changes: 33 additions & 102 deletions builtin/providers/cloudflare/resource_cloudflare_record.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ package cloudflare
import (
"fmt"
"log"
"strings"
"time"

"golang.org/x/net/context"

"github.com/crackcomm/cloudflare"
"github.com/hashicorp/terraform/helper/schema"

// NOTE: Temporary until they merge my PR:
"github.com/mitchellh/cloudflare-go"
)

func resourceCloudFlareRecord() *schema.Resource {
Expand Down Expand Up @@ -72,13 +70,13 @@ func resourceCloudFlareRecord() *schema.Resource {
}

func resourceCloudFlareRecordCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*cloudflare.Client)
client := meta.(*cloudflare.API)

newRecord := &cloudflare.Record{
Content: d.Get("value").(string),
newRecord := cloudflare.DNSRecord{
Type: d.Get("type").(string),
Name: d.Get("name").(string),
Content: d.Get("value").(string),
Proxied: d.Get("proxied").(bool),
Type: d.Get("type").(string),
ZoneName: d.Get("domain").(string),
}

Expand All @@ -90,43 +88,38 @@ func resourceCloudFlareRecordCreate(d *schema.ResourceData, meta interface{}) er
newRecord.TTL = ttl.(int)
}

zone, err := retrieveZone(client, newRecord.ZoneName)
zoneId, err := client.ZoneIDByName(newRecord.ZoneName)
if err != nil {
return err
return fmt.Errorf("Error finding zone %q: %s", newRecord.ZoneName, err)
}

d.Set("zone_id", zone.ID)
newRecord.ZoneID = zone.ID
d.Set("zone_id", zoneId)
newRecord.ZoneID = zoneId

log.Printf("[DEBUG] CloudFlare Record create configuration: %#v", newRecord)

ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))

err = client.Records.Create(ctx, newRecord)
r, err := client.CreateDNSRecord(zoneId, newRecord)
if err != nil {
return fmt.Errorf("Failed to create record: %s", err)
}

d.SetId(newRecord.ID)
d.SetId(r.ID)

log.Printf("[INFO] CloudFlare Record ID: %s", d.Id())

return resourceCloudFlareRecordRead(d, meta)
}

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.API)
domain := d.Get("domain").(string)

zone, err := retrieveZone(client, domain)
zoneId, err := client.ZoneIDByName(domain)
if err != nil {
return err
return fmt.Errorf("Error finding zone %q: %s", domain, err)
}

record, err := retrieveRecord(client, zone, rName)
record, err := client.DNSRecord(zoneId, d.Id())
if err != nil {
return err
}
Expand All @@ -138,21 +131,21 @@ func resourceCloudFlareRecordRead(d *schema.ResourceData, meta interface{}) erro
d.Set("ttl", record.TTL)
d.Set("priority", record.Priority)
d.Set("proxied", record.Proxied)
d.Set("zone_id", zone.ID)
d.Set("zone_id", zoneId)

return nil
}

func resourceCloudFlareRecordUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*cloudflare.Client)
client := meta.(*cloudflare.API)

updateRecord := &cloudflare.Record{
Content: d.Get("value").(string),
updateRecord := cloudflare.DNSRecord{
ID: d.Id(),
Name: d.Get("name").(string),
Proxied: false,
Type: d.Get("type").(string),
Name: d.Get("name").(string),
Content: d.Get("value").(string),
ZoneName: d.Get("domain").(string),
Proxied: false,
}

if priority, ok := d.GetOk("priority"); ok {
Expand All @@ -167,18 +160,15 @@ func resourceCloudFlareRecordUpdate(d *schema.ResourceData, meta interface{}) er
updateRecord.TTL = ttl.(int)
}

zone, err := retrieveZone(client, updateRecord.ZoneName)
zoneId, err := client.ZoneIDByName(updateRecord.ZoneName)
if err != nil {
return err
return fmt.Errorf("Error finding zone %q: %s", updateRecord.ZoneName, err)
}

updateRecord.ZoneID = zone.ID
updateRecord.ZoneID = zoneId

log.Printf("[DEBUG] CloudFlare Record update configuration: %#v", updateRecord)

ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))

err = client.Records.Patch(ctx, updateRecord)
err = client.UpdateDNSRecord(zoneId, d.Id(), updateRecord)
if err != nil {
return fmt.Errorf("Failed to update CloudFlare Record: %s", err)
}
Expand All @@ -187,79 +177,20 @@ 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.API)
domain := d.Get("domain").(string)

zone, err := retrieveZone(client, domain)
zoneId, err := client.ZoneIDByName(domain)
if err != nil {
return err
}

record, err := retrieveRecord(client, zone, rName)
if err != nil {
return err
return fmt.Errorf("Error finding zone %q: %s", domain, err)
}

log.Printf("[INFO] Deleting CloudFlare Record: %s, %s", domain, d.Id())

ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))

err = client.Records.Delete(ctx, zone.ID, record.ID)
err = client.DeleteDNSRecord(zoneId, d.Id())
if err != nil {
return fmt.Errorf("Error deleting CloudFlare Record: %s", err)
}

return nil
}

func retrieveRecord(
client *cloudflare.Client,
zone *cloudflare.Zone,
name string,
) (*cloudflare.Record, error) {
ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))

rs, err := client.Records.List(ctx, zone.ID)
if err != nil {
return nil, fmt.Errorf("Unable to retrieve records for (%s): %s", zone.Name, err)
}

var record *cloudflare.Record

for _, r := range rs {
if r.Name == name {
record = r
}
}
if record == nil {
return nil, fmt.Errorf("Unable to find Cloudflare record %s", name)
}

return record, nil
}

func retrieveZone(client *cloudflare.Client, domain string) (*cloudflare.Zone, error) {
ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))

zs, err := client.Zones.List(ctx)
if err != nil {
return nil, fmt.Errorf("Failed to fetch zone for %s: %s", domain, err)
}

var zone *cloudflare.Zone

for _, z := range zs {
if z.Name == domain {
zone = z
}
}

if zone == nil {
return nil, fmt.Errorf("Failed to find zone for: %s", domain)
}

return zone, nil
}
Loading