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 }