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

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"time"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	"google.golang.org/api/dns/v1"
    10  	"google.golang.org/api/googleapi"
    11  )
    12  
    13  func resourceDnsRecordSet() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceDnsRecordSetCreate,
    16  		Read:   resourceDnsRecordSetRead,
    17  		Delete: resourceDnsRecordSetDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"managed_zone": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  				ForceNew: true,
    24  			},
    25  
    26  			"name": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  				ForceNew: true,
    30  			},
    31  
    32  			"rrdatas": &schema.Schema{
    33  				Type:     schema.TypeList,
    34  				Required: true,
    35  				ForceNew: true,
    36  				Elem: &schema.Schema{
    37  					Type: schema.TypeString,
    38  				},
    39  			},
    40  
    41  			"ttl": &schema.Schema{
    42  				Type:     schema.TypeInt,
    43  				Required: true,
    44  				ForceNew: true,
    45  			},
    46  
    47  			"type": &schema.Schema{
    48  				Type:     schema.TypeString,
    49  				Required: true,
    50  				ForceNew: true,
    51  			},
    52  
    53  			"project": &schema.Schema{
    54  				Type:     schema.TypeString,
    55  				Optional: true,
    56  				ForceNew: true,
    57  			},
    58  		},
    59  	}
    60  }
    61  
    62  func resourceDnsRecordSetCreate(d *schema.ResourceData, meta interface{}) error {
    63  	config := meta.(*Config)
    64  
    65  	project, err := getProject(d, config)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	zone := d.Get("managed_zone").(string)
    71  
    72  	rrdatasCount := d.Get("rrdatas.#").(int)
    73  
    74  	// Build the change
    75  	chg := &dns.Change{
    76  		Additions: []*dns.ResourceRecordSet{
    77  			&dns.ResourceRecordSet{
    78  				Name:    d.Get("name").(string),
    79  				Type:    d.Get("type").(string),
    80  				Ttl:     int64(d.Get("ttl").(int)),
    81  				Rrdatas: make([]string, rrdatasCount),
    82  			},
    83  		},
    84  	}
    85  
    86  	for i := 0; i < rrdatasCount; i++ {
    87  		rrdata := fmt.Sprintf("rrdatas.%d", i)
    88  		chg.Additions[0].Rrdatas[i] = d.Get(rrdata).(string)
    89  	}
    90  
    91  	log.Printf("[DEBUG] DNS Record create request: %#v", chg)
    92  	chg, err = config.clientDns.Changes.Create(project, zone, chg).Do()
    93  	if err != nil {
    94  		return fmt.Errorf("Error creating DNS RecordSet: %s", err)
    95  	}
    96  
    97  	d.SetId(chg.Id)
    98  
    99  	w := &DnsChangeWaiter{
   100  		Service:     config.clientDns,
   101  		Change:      chg,
   102  		Project:     project,
   103  		ManagedZone: zone,
   104  	}
   105  	state := w.Conf()
   106  	state.Delay = 10 * time.Second
   107  	state.Timeout = 10 * time.Minute
   108  	state.MinTimeout = 2 * time.Second
   109  	_, err = state.WaitForState()
   110  	if err != nil {
   111  		return fmt.Errorf("Error waiting for Google DNS change: %s", err)
   112  	}
   113  
   114  	return resourceDnsRecordSetRead(d, meta)
   115  }
   116  
   117  func resourceDnsRecordSetRead(d *schema.ResourceData, meta interface{}) error {
   118  	config := meta.(*Config)
   119  
   120  	project, err := getProject(d, config)
   121  	if err != nil {
   122  		return err
   123  	}
   124  
   125  	zone := d.Get("managed_zone").(string)
   126  
   127  	// name and type are effectively the 'key'
   128  	name := d.Get("name").(string)
   129  	dnsType := d.Get("type").(string)
   130  
   131  	resp, err := config.clientDns.ResourceRecordSets.List(
   132  		project, zone).Name(name).Type(dnsType).Do()
   133  	if err != nil {
   134  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   135  			log.Printf("[WARN] Removing DNS Record Set %q because it's gone", d.Get("name").(string))
   136  			// The resource doesn't exist anymore
   137  			d.SetId("")
   138  
   139  			return nil
   140  		}
   141  
   142  		return fmt.Errorf("Error reading DNS RecordSet: %#v", err)
   143  	}
   144  	if len(resp.Rrsets) == 0 {
   145  		// The resource doesn't exist anymore
   146  		d.SetId("")
   147  		return nil
   148  	}
   149  
   150  	if len(resp.Rrsets) > 1 {
   151  		return fmt.Errorf("Only expected 1 record set, got %d", len(resp.Rrsets))
   152  	}
   153  
   154  	d.Set("ttl", resp.Rrsets[0].Ttl)
   155  	d.Set("rrdatas", resp.Rrsets[0].Rrdatas)
   156  
   157  	return nil
   158  }
   159  
   160  func resourceDnsRecordSetDelete(d *schema.ResourceData, meta interface{}) error {
   161  	config := meta.(*Config)
   162  
   163  	project, err := getProject(d, config)
   164  	if err != nil {
   165  		return err
   166  	}
   167  
   168  	zone := d.Get("managed_zone").(string)
   169  
   170  	rrdatasCount := d.Get("rrdatas.#").(int)
   171  
   172  	// Build the change
   173  	chg := &dns.Change{
   174  		Deletions: []*dns.ResourceRecordSet{
   175  			&dns.ResourceRecordSet{
   176  				Name:    d.Get("name").(string),
   177  				Type:    d.Get("type").(string),
   178  				Ttl:     int64(d.Get("ttl").(int)),
   179  				Rrdatas: make([]string, rrdatasCount),
   180  			},
   181  		},
   182  	}
   183  
   184  	for i := 0; i < rrdatasCount; i++ {
   185  		rrdata := fmt.Sprintf("rrdatas.%d", i)
   186  		chg.Deletions[0].Rrdatas[i] = d.Get(rrdata).(string)
   187  	}
   188  	log.Printf("[DEBUG] DNS Record delete request: %#v", chg)
   189  	chg, err = config.clientDns.Changes.Create(project, zone, chg).Do()
   190  	if err != nil {
   191  		return fmt.Errorf("Error deleting DNS RecordSet: %s", err)
   192  	}
   193  
   194  	w := &DnsChangeWaiter{
   195  		Service:     config.clientDns,
   196  		Change:      chg,
   197  		Project:     project,
   198  		ManagedZone: zone,
   199  	}
   200  	state := w.Conf()
   201  	state.Delay = 10 * time.Second
   202  	state.Timeout = 10 * time.Minute
   203  	state.MinTimeout = 2 * time.Second
   204  	_, err = state.WaitForState()
   205  	if err != nil {
   206  		return fmt.Errorf("Error waiting for Google DNS change: %s", err)
   207  	}
   208  
   209  	d.SetId("")
   210  	return nil
   211  }