github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/google/resource_dns_record_set.go (about)

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