github.com/bendemaree/terraform@v0.5.4-0.20150613200311-f50d97d6eee6/builtin/providers/dme/resource_dme_record.go (about) 1 package dme 2 3 import ( 4 "fmt" 5 "log" 6 "strings" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 "github.com/soniah/dnsmadeeasy" 10 ) 11 12 func resourceDMERecord() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceDMERecordCreate, 15 Read: resourceDMERecordRead, 16 Update: resourceDMERecordUpdate, 17 Delete: resourceDMERecordDelete, 18 19 Schema: map[string]*schema.Schema{ 20 // Use recordid for TF ID. 21 "domainid": &schema.Schema{ 22 Type: schema.TypeString, 23 Required: true, 24 }, 25 "name": &schema.Schema{ 26 Type: schema.TypeString, 27 Required: true, 28 }, 29 "type": &schema.Schema{ 30 Type: schema.TypeString, 31 Required: true, 32 }, 33 "value": &schema.Schema{ 34 Type: schema.TypeString, 35 Required: true, 36 }, 37 "ttl": &schema.Schema{ 38 Type: schema.TypeInt, 39 Optional: true, 40 }, 41 "mxLevel": &schema.Schema{ 42 Type: schema.TypeInt, 43 Optional: true, 44 }, 45 "weight": &schema.Schema{ 46 Type: schema.TypeInt, 47 Optional: true, 48 }, 49 "priority": &schema.Schema{ 50 Type: schema.TypeInt, 51 Optional: true, 52 }, 53 "port": &schema.Schema{ 54 Type: schema.TypeInt, 55 Optional: true, 56 }, 57 "keywords": &schema.Schema{ 58 Type: schema.TypeString, 59 Optional: true, 60 }, 61 "title": &schema.Schema{ 62 Type: schema.TypeString, 63 Optional: true, 64 }, 65 "hardLink": &schema.Schema{ 66 Type: schema.TypeBool, 67 Optional: true, 68 }, 69 "redirectType": &schema.Schema{ 70 Type: schema.TypeString, 71 Optional: true, 72 }, 73 "description": &schema.Schema{ 74 Type: schema.TypeString, 75 Optional: true, 76 }, 77 }, 78 } 79 } 80 81 func resourceDMERecordCreate(d *schema.ResourceData, meta interface{}) error { 82 client := meta.(*dnsmadeeasy.Client) 83 84 domainid := d.Get("domainid").(string) 85 log.Printf("[INFO] Creating record for domainid: %s", domainid) 86 87 cr := make(map[string]interface{}) 88 if err := getAll(d, cr); err != nil { 89 return err 90 } 91 log.Printf("[DEBUG] record create configuration: %#v", cr) 92 93 result, err := client.CreateRecord(domainid, cr) 94 if err != nil { 95 return fmt.Errorf("Failed to create record: %s", err) 96 } 97 98 d.SetId(result) 99 log.Printf("[INFO] record ID: %s", d.Id()) 100 101 return resourceDMERecordRead(d, meta) 102 } 103 104 func resourceDMERecordRead(d *schema.ResourceData, meta interface{}) error { 105 client := meta.(*dnsmadeeasy.Client) 106 107 domainid := d.Get("domainid").(string) 108 recordid := d.Id() 109 log.Printf("[INFO] Reading record for domainid: %s recordid: %s", domainid, recordid) 110 111 rec, err := client.ReadRecord(domainid, recordid) 112 if err != nil { 113 return fmt.Errorf("Couldn't find record: %s", err) 114 } 115 116 return setAll(d, rec) 117 } 118 119 func resourceDMERecordUpdate(d *schema.ResourceData, meta interface{}) error { 120 client := meta.(*dnsmadeeasy.Client) 121 122 domainid := d.Get("domainid").(string) 123 recordid := d.Id() 124 125 cr := make(map[string]interface{}) 126 if err := getAll(d, cr); err != nil { 127 return err 128 } 129 log.Printf("[DEBUG] record update configuration: %+#v", cr) 130 131 if _, err := client.UpdateRecord(domainid, recordid, cr); err != nil { 132 return fmt.Errorf("Error updating record: %s", err) 133 } 134 135 return resourceDMERecordRead(d, meta) 136 } 137 138 func resourceDMERecordDelete(d *schema.ResourceData, meta interface{}) error { 139 client := meta.(*dnsmadeeasy.Client) 140 141 domainid := d.Get("domainid").(string) 142 recordid := d.Id() 143 log.Printf("[INFO] Deleting record for domainid: %s recordid: %s", domainid, recordid) 144 145 if err := client.DeleteRecord(domainid, recordid); err != nil { 146 return fmt.Errorf("Error deleting record: %s", err) 147 } 148 149 return nil 150 } 151 152 func getAll(d *schema.ResourceData, cr map[string]interface{}) error { 153 154 if attr, ok := d.GetOk("name"); ok { 155 cr["name"] = attr.(string) 156 } 157 if attr, ok := d.GetOk("type"); ok { 158 cr["type"] = attr.(string) 159 } 160 if attr, ok := d.GetOk("ttl"); ok { 161 cr["ttl"] = int64(attr.(int)) 162 } 163 if attr, ok := d.GetOk("value"); ok { 164 cr["value"] = attr.(string) 165 } 166 167 switch strings.ToUpper(d.Get("type").(string)) { 168 case "A", "CNAME", "ANAME", "TXT", "SPF", "NS", "PTR", "AAAA": 169 // all done 170 case "MX": 171 if attr, ok := d.GetOk("mxLevel"); ok { 172 cr["mxLevel"] = int64(attr.(int)) 173 } 174 case "SRV": 175 if attr, ok := d.GetOk("priority"); ok { 176 cr["priority"] = int64(attr.(int)) 177 } 178 if attr, ok := d.GetOk("weight"); ok { 179 cr["weight"] = int64(attr.(int)) 180 } 181 if attr, ok := d.GetOk("port"); ok { 182 cr["port"] = int64(attr.(int)) 183 } 184 case "HTTPRED": 185 if attr, ok := d.GetOk("hardLink"); ok && attr.(bool) { 186 cr["hardLink"] = "true" 187 } 188 if attr, ok := d.GetOk("redirectType"); ok { 189 cr["redirectType"] = attr.(string) 190 } 191 if attr, ok := d.GetOk("title"); ok { 192 cr["title"] = attr.(string) 193 } 194 if attr, ok := d.GetOk("keywords"); ok { 195 cr["keywords"] = attr.(string) 196 } 197 if attr, ok := d.GetOk("description"); ok { 198 cr["description"] = attr.(string) 199 } 200 default: 201 return fmt.Errorf("getAll: type not found") 202 } 203 return nil 204 } 205 206 func setAll(d *schema.ResourceData, rec *dnsmadeeasy.Record) error { 207 d.Set("type", rec.Type) 208 d.Set("name", rec.Name) 209 d.Set("ttl", rec.TTL) 210 d.Set("value", rec.Value) 211 212 switch rec.Type { 213 case "A", "CNAME", "ANAME", "TXT", "SPF", "NS", "PTR": 214 // all done 215 case "AAAA": 216 // overwrite value set above - DME ipv6 is lower case 217 d.Set("value", strings.ToLower(rec.Value)) 218 case "MX": 219 d.Set("mxLevel", rec.MXLevel) 220 case "SRV": 221 d.Set("priority", rec.Priority) 222 d.Set("weight", rec.Weight) 223 d.Set("port", rec.Port) 224 case "HTTPRED": 225 d.Set("hardLink", rec.HardLink) 226 d.Set("redirectType", rec.RedirectType) 227 d.Set("title", rec.Title) 228 d.Set("keywords", rec.Keywords) 229 d.Set("description", rec.Description) 230 default: 231 return fmt.Errorf("setAll: type not found") 232 } 233 return nil 234 }