github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/cloudflare/resource_cloudflare_record.go (about)

     1  package cloudflare
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/cloudflare/cloudflare-go"
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  )
    10  
    11  func resourceCloudFlareRecord() *schema.Resource {
    12  	return &schema.Resource{
    13  		Create: resourceCloudFlareRecordCreate,
    14  		Read:   resourceCloudFlareRecordRead,
    15  		Update: resourceCloudFlareRecordUpdate,
    16  		Delete: resourceCloudFlareRecordDelete,
    17  
    18  		SchemaVersion: 1,
    19  		MigrateState:  resourceCloudFlareRecordMigrateState,
    20  		Schema: map[string]*schema.Schema{
    21  			"domain": {
    22  				Type:     schema.TypeString,
    23  				Required: true,
    24  			},
    25  
    26  			"name": {
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  			},
    30  
    31  			"hostname": {
    32  				Type:     schema.TypeString,
    33  				Computed: true,
    34  			},
    35  
    36  			"type": {
    37  				Type:     schema.TypeString,
    38  				Required: true,
    39  				ForceNew: true,
    40  			},
    41  
    42  			"value": {
    43  				Type:     schema.TypeString,
    44  				Required: true,
    45  			},
    46  
    47  			"ttl": {
    48  				Type:     schema.TypeInt,
    49  				Optional: true,
    50  				Computed: true,
    51  			},
    52  
    53  			"priority": {
    54  				Type:     schema.TypeInt,
    55  				Optional: true,
    56  			},
    57  
    58  			"proxied": {
    59  				Default:  false,
    60  				Optional: true,
    61  				Type:     schema.TypeBool,
    62  			},
    63  
    64  			"zone_id": {
    65  				Type:     schema.TypeString,
    66  				Computed: true,
    67  			},
    68  		},
    69  	}
    70  }
    71  
    72  func resourceCloudFlareRecordCreate(d *schema.ResourceData, meta interface{}) error {
    73  	client := meta.(*cloudflare.API)
    74  
    75  	newRecord := cloudflare.DNSRecord{
    76  		Type:     d.Get("type").(string),
    77  		Name:     d.Get("name").(string),
    78  		Content:  d.Get("value").(string),
    79  		Proxied:  d.Get("proxied").(bool),
    80  		ZoneName: d.Get("domain").(string),
    81  	}
    82  
    83  	if priority, ok := d.GetOk("priority"); ok {
    84  		newRecord.Priority = priority.(int)
    85  	}
    86  
    87  	if ttl, ok := d.GetOk("ttl"); ok {
    88  		newRecord.TTL = ttl.(int)
    89  	}
    90  
    91  	// Validate value based on type
    92  	if err := validateRecordName(newRecord.Type, newRecord.Content); err != nil {
    93  		return fmt.Errorf("Error validating record name %q: %s", newRecord.Name, err)
    94  	}
    95  
    96  	// Validate type
    97  	if err := validateRecordType(newRecord.Type, newRecord.Proxied); err != nil {
    98  		return fmt.Errorf("Error validating record type %q: %s", newRecord.Type, err)
    99  	}
   100  
   101  	zoneId, err := client.ZoneIDByName(newRecord.ZoneName)
   102  	if err != nil {
   103  		return fmt.Errorf("Error finding zone %q: %s", newRecord.ZoneName, err)
   104  	}
   105  
   106  	d.Set("zone_id", zoneId)
   107  	newRecord.ZoneID = zoneId
   108  
   109  	log.Printf("[DEBUG] CloudFlare Record create configuration: %#v", newRecord)
   110  
   111  	r, err := client.CreateDNSRecord(zoneId, newRecord)
   112  	if err != nil {
   113  		return fmt.Errorf("Failed to create record: %s", err)
   114  	}
   115  
   116  	// In the Event that the API returns an empty DNS Record, we verify that the
   117  	// ID returned is not the default ""
   118  	if r.Result.ID == "" {
   119  		return fmt.Errorf("Failed to find record in Creat response; Record was empty")
   120  	}
   121  
   122  	d.SetId(r.Result.ID)
   123  
   124  	log.Printf("[INFO] CloudFlare Record ID: %s", d.Id())
   125  
   126  	return resourceCloudFlareRecordRead(d, meta)
   127  }
   128  
   129  func resourceCloudFlareRecordRead(d *schema.ResourceData, meta interface{}) error {
   130  	client := meta.(*cloudflare.API)
   131  	domain := d.Get("domain").(string)
   132  
   133  	zoneId, err := client.ZoneIDByName(domain)
   134  	if err != nil {
   135  		return fmt.Errorf("Error finding zone %q: %s", domain, err)
   136  	}
   137  
   138  	record, err := client.DNSRecord(zoneId, d.Id())
   139  	if err != nil {
   140  		return err
   141  	}
   142  
   143  	d.SetId(record.ID)
   144  	d.Set("hostname", record.Name)
   145  	d.Set("type", record.Type)
   146  	d.Set("value", record.Content)
   147  	d.Set("ttl", record.TTL)
   148  	d.Set("priority", record.Priority)
   149  	d.Set("proxied", record.Proxied)
   150  	d.Set("zone_id", zoneId)
   151  
   152  	return nil
   153  }
   154  
   155  func resourceCloudFlareRecordUpdate(d *schema.ResourceData, meta interface{}) error {
   156  	client := meta.(*cloudflare.API)
   157  
   158  	updateRecord := cloudflare.DNSRecord{
   159  		ID:       d.Id(),
   160  		Type:     d.Get("type").(string),
   161  		Name:     d.Get("name").(string),
   162  		Content:  d.Get("value").(string),
   163  		ZoneName: d.Get("domain").(string),
   164  		Proxied:  false,
   165  	}
   166  
   167  	if priority, ok := d.GetOk("priority"); ok {
   168  		updateRecord.Priority = priority.(int)
   169  	}
   170  
   171  	if proxied, ok := d.GetOk("proxied"); ok {
   172  		updateRecord.Proxied = proxied.(bool)
   173  	}
   174  
   175  	if ttl, ok := d.GetOk("ttl"); ok {
   176  		updateRecord.TTL = ttl.(int)
   177  	}
   178  
   179  	zoneId, err := client.ZoneIDByName(updateRecord.ZoneName)
   180  	if err != nil {
   181  		return fmt.Errorf("Error finding zone %q: %s", updateRecord.ZoneName, err)
   182  	}
   183  
   184  	updateRecord.ZoneID = zoneId
   185  
   186  	log.Printf("[DEBUG] CloudFlare Record update configuration: %#v", updateRecord)
   187  	err = client.UpdateDNSRecord(zoneId, d.Id(), updateRecord)
   188  	if err != nil {
   189  		return fmt.Errorf("Failed to update CloudFlare Record: %s", err)
   190  	}
   191  
   192  	return resourceCloudFlareRecordRead(d, meta)
   193  }
   194  
   195  func resourceCloudFlareRecordDelete(d *schema.ResourceData, meta interface{}) error {
   196  	client := meta.(*cloudflare.API)
   197  	domain := d.Get("domain").(string)
   198  
   199  	zoneId, err := client.ZoneIDByName(domain)
   200  	if err != nil {
   201  		return fmt.Errorf("Error finding zone %q: %s", domain, err)
   202  	}
   203  
   204  	log.Printf("[INFO] Deleting CloudFlare Record: %s, %s", domain, d.Id())
   205  
   206  	err = client.DeleteDNSRecord(zoneId, d.Id())
   207  	if err != nil {
   208  		return fmt.Errorf("Error deleting CloudFlare Record: %s", err)
   209  	}
   210  
   211  	return nil
   212  }