github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/cloudflare/resource_cloudflare_record.go (about)

     1  package cloudflare
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	"github.com/pearkes/cloudflare"
    10  )
    11  
    12  func resourceCloudFlareRecord() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceCloudFlareRecordCreate,
    15  		Read:   resourceCloudFlareRecordRead,
    16  		Update: resourceCloudFlareRecordUpdate,
    17  		Delete: resourceCloudFlareRecordDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"domain": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  			},
    24  
    25  			"name": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Required: true,
    28  			},
    29  
    30  			"hostname": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Computed: true,
    33  			},
    34  
    35  			"type": &schema.Schema{
    36  				Type:     schema.TypeString,
    37  				Required: true,
    38  				ForceNew: true,
    39  			},
    40  
    41  			"value": &schema.Schema{
    42  				Type:     schema.TypeString,
    43  				Required: true,
    44  			},
    45  
    46  			"ttl": &schema.Schema{
    47  				Type:     schema.TypeString,
    48  				Optional: true,
    49  				Computed: true,
    50  			},
    51  
    52  			"priority": &schema.Schema{
    53  				Type:     schema.TypeString,
    54  				Optional: true,
    55  			},
    56  		},
    57  	}
    58  }
    59  
    60  func resourceCloudFlareRecordCreate(d *schema.ResourceData, meta interface{}) error {
    61  	client := meta.(*cloudflare.Client)
    62  
    63  	// Create the new record
    64  	newRecord := &cloudflare.CreateRecord{
    65  		Name:    d.Get("name").(string),
    66  		Type:    d.Get("type").(string),
    67  		Content: d.Get("value").(string),
    68  	}
    69  
    70  	if ttl, ok := d.GetOk("ttl"); ok {
    71  		newRecord.Ttl = ttl.(string)
    72  	}
    73  
    74  	if priority, ok := d.GetOk("priority"); ok {
    75  		newRecord.Priority = priority.(string)
    76  	}
    77  
    78  	log.Printf("[DEBUG] CloudFlare Record create configuration: %#v", newRecord)
    79  
    80  	rec, err := client.CreateRecord(d.Get("domain").(string), newRecord)
    81  
    82  	if err != nil {
    83  		return fmt.Errorf("Failed to create CloudFlare Record: %s", err)
    84  	}
    85  
    86  	d.SetId(rec.Id)
    87  	log.Printf("[INFO] CloudFlare Record ID: %s", d.Id())
    88  
    89  	return resourceCloudFlareRecordRead(d, meta)
    90  }
    91  
    92  func resourceCloudFlareRecordRead(d *schema.ResourceData, meta interface{}) error {
    93  	client := meta.(*cloudflare.Client)
    94  
    95  	rec, err := client.RetrieveRecord(d.Get("domain").(string), d.Id())
    96  	if err != nil {
    97  		if strings.Contains(err.Error(), "not found") {
    98  			d.SetId("")
    99  			return nil
   100  		}
   101  
   102  		return fmt.Errorf(
   103  			"Couldn't find CloudFlare Record ID (%s) for domain (%s): %s",
   104  			d.Id(), d.Get("domain").(string), err)
   105  	}
   106  
   107  	d.Set("name", rec.Name)
   108  	d.Set("hostname", rec.FullName)
   109  	d.Set("type", rec.Type)
   110  	d.Set("value", rec.Value)
   111  	d.Set("ttl", rec.Ttl)
   112  	d.Set("priority", rec.Priority)
   113  
   114  	return nil
   115  }
   116  
   117  func resourceCloudFlareRecordUpdate(d *schema.ResourceData, meta interface{}) error {
   118  	client := meta.(*cloudflare.Client)
   119  
   120  	// CloudFlare requires we send all values for an update request
   121  	updateRecord := &cloudflare.UpdateRecord{
   122  		Name:    d.Get("name").(string),
   123  		Type:    d.Get("type").(string),
   124  		Content: d.Get("value").(string),
   125  	}
   126  
   127  	if ttl, ok := d.GetOk("ttl"); ok {
   128  		updateRecord.Ttl = ttl.(string)
   129  	}
   130  
   131  	if priority, ok := d.GetOk("priority"); ok {
   132  		updateRecord.Priority = priority.(string)
   133  	}
   134  
   135  	log.Printf("[DEBUG] CloudFlare Record update configuration: %#v", updateRecord)
   136  
   137  	err := client.UpdateRecord(d.Get("domain").(string), d.Id(), updateRecord)
   138  	if err != nil {
   139  		return fmt.Errorf("Failed to update CloudFlare Record: %s", err)
   140  	}
   141  
   142  	return resourceCloudFlareRecordRead(d, meta)
   143  }
   144  
   145  func resourceCloudFlareRecordDelete(d *schema.ResourceData, meta interface{}) error {
   146  	client := meta.(*cloudflare.Client)
   147  
   148  	log.Printf("[INFO] Deleting CloudFlare Record: %s, %s", d.Get("domain").(string), d.Id())
   149  
   150  	err := client.DestroyRecord(d.Get("domain").(string), d.Id())
   151  
   152  	if err != nil {
   153  		return fmt.Errorf("Error deleting CloudFlare Record: %s", err)
   154  	}
   155  
   156  	return nil
   157  }