github.com/minamijoyo/terraform@v0.7.8-0.20161029001309-18b3736ba44b/builtin/providers/cloudflare/resource_cloudflare_record.go (about) 1 package cloudflare 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/cloudflare/cloudflare-go" 8 "github.com/hashicorp/terraform/helper/schema" 9 ) 10 11 func resourceCloudFlareRecord() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourceCloudFlareRecordCreate, 14 Read: resourceCloudFlareRecordRead, 15 Update: resourceCloudFlareRecordUpdate, 16 Delete: resourceCloudFlareRecordDelete, 17 18 SchemaVersion: 1, 19 MigrateState: resourceCloudFlareRecordMigrateState, 20 Schema: map[string]*schema.Schema{ 21 "domain": &schema.Schema{ 22 Type: schema.TypeString, 23 Required: true, 24 }, 25 26 "name": &schema.Schema{ 27 Type: schema.TypeString, 28 Required: true, 29 }, 30 31 "hostname": &schema.Schema{ 32 Type: schema.TypeString, 33 Computed: true, 34 }, 35 36 "type": &schema.Schema{ 37 Type: schema.TypeString, 38 Required: true, 39 ForceNew: true, 40 }, 41 42 "value": &schema.Schema{ 43 Type: schema.TypeString, 44 Required: true, 45 }, 46 47 "ttl": &schema.Schema{ 48 Type: schema.TypeInt, 49 Optional: true, 50 Computed: true, 51 }, 52 53 "priority": &schema.Schema{ 54 Type: schema.TypeInt, 55 Optional: true, 56 }, 57 58 "proxied": &schema.Schema{ 59 Default: false, 60 Optional: true, 61 Type: schema.TypeBool, 62 }, 63 64 "zone_id": &schema.Schema{ 65 Type: schema.TypeString, 66 Computed: true, 67 }, 68 }, 69 } 70 } 71 72 func resourceCloudFlareRecordCreate(d *schema.ResourceData, meta interface{}) error { 73 client := meta.(*cloudflare.API) 74 75 newRecord := cloudflare.DNSRecord{ 76 Type: d.Get("type").(string), 77 Name: d.Get("name").(string), 78 Content: d.Get("value").(string), 79 Proxied: d.Get("proxied").(bool), 80 ZoneName: d.Get("domain").(string), 81 } 82 83 if priority, ok := d.GetOk("priority"); ok { 84 newRecord.Priority = priority.(int) 85 } 86 87 if ttl, ok := d.GetOk("ttl"); ok { 88 newRecord.TTL = ttl.(int) 89 } 90 91 zoneId, err := client.ZoneIDByName(newRecord.ZoneName) 92 if err != nil { 93 return fmt.Errorf("Error finding zone %q: %s", newRecord.ZoneName, err) 94 } 95 96 d.Set("zone_id", zoneId) 97 newRecord.ZoneID = zoneId 98 99 log.Printf("[DEBUG] CloudFlare Record create configuration: %#v", newRecord) 100 101 r, err := client.CreateDNSRecord(zoneId, newRecord) 102 if err != nil { 103 return fmt.Errorf("Failed to create record: %s", err) 104 } 105 106 // In the Event that the API returns an empty DNS Record, we verify that the 107 // ID returned is not the default "" 108 if r.Result.ID == "" { 109 return fmt.Errorf("Failed to find record in Creat response; Record was empty") 110 } 111 112 d.SetId(r.Result.ID) 113 114 log.Printf("[INFO] CloudFlare Record ID: %s", d.Id()) 115 116 return resourceCloudFlareRecordRead(d, meta) 117 } 118 119 func resourceCloudFlareRecordRead(d *schema.ResourceData, meta interface{}) error { 120 client := meta.(*cloudflare.API) 121 domain := d.Get("domain").(string) 122 123 zoneId, err := client.ZoneIDByName(domain) 124 if err != nil { 125 return fmt.Errorf("Error finding zone %q: %s", domain, err) 126 } 127 128 record, err := client.DNSRecord(zoneId, d.Id()) 129 if err != nil { 130 return err 131 } 132 133 d.SetId(record.ID) 134 d.Set("hostname", record.Name) 135 d.Set("type", record.Type) 136 d.Set("value", record.Content) 137 d.Set("ttl", record.TTL) 138 d.Set("priority", record.Priority) 139 d.Set("proxied", record.Proxied) 140 d.Set("zone_id", zoneId) 141 142 return nil 143 } 144 145 func resourceCloudFlareRecordUpdate(d *schema.ResourceData, meta interface{}) error { 146 client := meta.(*cloudflare.API) 147 148 updateRecord := cloudflare.DNSRecord{ 149 ID: d.Id(), 150 Type: d.Get("type").(string), 151 Name: d.Get("name").(string), 152 Content: d.Get("value").(string), 153 ZoneName: d.Get("domain").(string), 154 Proxied: false, 155 } 156 157 if priority, ok := d.GetOk("priority"); ok { 158 updateRecord.Priority = priority.(int) 159 } 160 161 if proxied, ok := d.GetOk("proxied"); ok { 162 updateRecord.Proxied = proxied.(bool) 163 } 164 165 if ttl, ok := d.GetOk("ttl"); ok { 166 updateRecord.TTL = ttl.(int) 167 } 168 169 zoneId, err := client.ZoneIDByName(updateRecord.ZoneName) 170 if err != nil { 171 return fmt.Errorf("Error finding zone %q: %s", updateRecord.ZoneName, err) 172 } 173 174 updateRecord.ZoneID = zoneId 175 176 log.Printf("[DEBUG] CloudFlare Record update configuration: %#v", updateRecord) 177 err = client.UpdateDNSRecord(zoneId, d.Id(), updateRecord) 178 if err != nil { 179 return fmt.Errorf("Failed to update CloudFlare Record: %s", err) 180 } 181 182 return resourceCloudFlareRecordRead(d, meta) 183 } 184 185 func resourceCloudFlareRecordDelete(d *schema.ResourceData, meta interface{}) error { 186 client := meta.(*cloudflare.API) 187 domain := d.Get("domain").(string) 188 189 zoneId, err := client.ZoneIDByName(domain) 190 if err != nil { 191 return fmt.Errorf("Error finding zone %q: %s", domain, err) 192 } 193 194 log.Printf("[INFO] Deleting CloudFlare Record: %s, %s", domain, d.Id()) 195 196 err = client.DeleteDNSRecord(zoneId, d.Id()) 197 if err != nil { 198 return fmt.Errorf("Error deleting CloudFlare Record: %s", err) 199 } 200 201 return nil 202 }