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 }