github.com/peterbale/terraform@v0.9.0-beta2.0.20170315142748-5723acd55547/builtin/providers/azurerm/resource_arm_dns_mx_record.go (about) 1 package azurerm 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 8 "github.com/hashicorp/terraform/helper/hashcode" 9 "github.com/hashicorp/terraform/helper/schema" 10 "github.com/jen20/riviera/dns" 11 ) 12 13 func resourceArmDnsMxRecord() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceArmDnsMxRecordCreate, 16 Read: resourceArmDnsMxRecordRead, 17 Update: resourceArmDnsMxRecordCreate, 18 Delete: resourceArmDnsMxRecordDelete, 19 Importer: &schema.ResourceImporter{ 20 State: schema.ImportStatePassthrough, 21 }, 22 23 Schema: map[string]*schema.Schema{ 24 "name": &schema.Schema{ 25 Type: schema.TypeString, 26 Required: true, 27 ForceNew: true, 28 }, 29 30 "resource_group_name": &schema.Schema{ 31 Type: schema.TypeString, 32 Required: true, 33 ForceNew: true, 34 }, 35 36 "zone_name": &schema.Schema{ 37 Type: schema.TypeString, 38 Required: true, 39 }, 40 41 "record": &schema.Schema{ 42 Type: schema.TypeSet, 43 Required: true, 44 Elem: &schema.Resource{ 45 Schema: map[string]*schema.Schema{ 46 "preference": &schema.Schema{ 47 Type: schema.TypeString, 48 Required: true, 49 }, 50 51 "exchange": &schema.Schema{ 52 Type: schema.TypeString, 53 Required: true, 54 }, 55 }, 56 }, 57 Set: resourceArmDnsMxRecordHash, 58 }, 59 60 "ttl": &schema.Schema{ 61 Type: schema.TypeInt, 62 Required: true, 63 }, 64 65 "tags": tagsSchema(), 66 }, 67 } 68 } 69 70 func resourceArmDnsMxRecordCreate(d *schema.ResourceData, meta interface{}) error { 71 client := meta.(*ArmClient) 72 rivieraClient := client.rivieraClient 73 74 tags := d.Get("tags").(map[string]interface{}) 75 expandedTags := expandTags(tags) 76 77 createCommand := &dns.CreateMXRecordSet{ 78 Name: d.Get("name").(string), 79 Location: "global", 80 ResourceGroupName: d.Get("resource_group_name").(string), 81 ZoneName: d.Get("zone_name").(string), 82 TTL: d.Get("ttl").(int), 83 Tags: *expandedTags, 84 } 85 86 mxRecords, recordErr := expandAzureRmDnsMxRecord(d) 87 if recordErr != nil { 88 return fmt.Errorf("Error Building Azure RM MX Record: %s", recordErr) 89 } 90 createCommand.MXRecords = mxRecords 91 92 createRequest := rivieraClient.NewRequest() 93 createRequest.Command = createCommand 94 95 createResponse, err := createRequest.Execute() 96 if err != nil { 97 return fmt.Errorf("Error creating DNS MX Record: %s", err) 98 } 99 if !createResponse.IsSuccessful() { 100 return fmt.Errorf("Error creating DNS MX Record: %s", createResponse.Error) 101 } 102 103 readRequest := rivieraClient.NewRequest() 104 readRequest.Command = &dns.GetMXRecordSet{ 105 Name: d.Get("name").(string), 106 ResourceGroupName: d.Get("resource_group_name").(string), 107 ZoneName: d.Get("zone_name").(string), 108 } 109 110 readResponse, err := readRequest.Execute() 111 if err != nil { 112 return fmt.Errorf("Error reading DNS MX Record: %s", err) 113 } 114 if !readResponse.IsSuccessful() { 115 return fmt.Errorf("Error reading DNS MX Record: %s", readResponse.Error) 116 } 117 118 resp := readResponse.Parsed.(*dns.GetMXRecordSetResponse) 119 d.SetId(resp.ID) 120 121 return resourceArmDnsMxRecordRead(d, meta) 122 } 123 124 func resourceArmDnsMxRecordRead(d *schema.ResourceData, meta interface{}) error { 125 client := meta.(*ArmClient) 126 rivieraClient := client.rivieraClient 127 128 id, err := parseAzureResourceID(d.Id()) 129 if err != nil { 130 return err 131 } 132 133 readRequest := rivieraClient.NewRequestForURI(d.Id()) 134 readRequest.Command = &dns.GetMXRecordSet{} 135 136 readResponse, err := readRequest.Execute() 137 if err != nil { 138 return fmt.Errorf("Error reading DNS MX Record: %s", err) 139 } 140 if !readResponse.IsSuccessful() { 141 log.Printf("[INFO] Error reading DNS MX Record %q - removing from state", d.Id()) 142 d.SetId("") 143 return fmt.Errorf("Error reading DNS MX Record: %s", readResponse.Error) 144 } 145 146 resp := readResponse.Parsed.(*dns.GetMXRecordSetResponse) 147 148 d.Set("name", resp.Name) 149 d.Set("resource_group_name", id.ResourceGroup) 150 d.Set("zone_name", id.Path["dnszones"]) 151 d.Set("ttl", resp.TTL) 152 153 if err := d.Set("record", flattenAzureRmDnsMxRecord(resp.MXRecords)); err != nil { 154 log.Printf("[INFO] Error setting the Azure RM MX Record State: %s", err) 155 return err 156 } 157 158 flattenAndSetTags(d, &resp.Tags) 159 160 return nil 161 } 162 163 func resourceArmDnsMxRecordDelete(d *schema.ResourceData, meta interface{}) error { 164 client := meta.(*ArmClient) 165 rivieraClient := client.rivieraClient 166 167 deleteRequest := rivieraClient.NewRequestForURI(d.Id()) 168 deleteRequest.Command = &dns.DeleteRecordSet{ 169 RecordSetType: "MX", 170 } 171 172 deleteResponse, err := deleteRequest.Execute() 173 if err != nil { 174 return fmt.Errorf("Error deleting DNS MX Record: %s", err) 175 } 176 if !deleteResponse.IsSuccessful() { 177 return fmt.Errorf("Error deleting DNS MX Record: %s", deleteResponse.Error) 178 } 179 180 return nil 181 } 182 183 func expandAzureRmDnsMxRecord(d *schema.ResourceData) ([]dns.MXRecord, error) { 184 config := d.Get("record").(*schema.Set).List() 185 records := make([]dns.MXRecord, 0, len(config)) 186 187 for _, pRaw := range config { 188 data := pRaw.(map[string]interface{}) 189 190 mxrecord := dns.MXRecord{ 191 Preference: data["preference"].(string), 192 Exchange: data["exchange"].(string), 193 } 194 195 records = append(records, mxrecord) 196 197 } 198 199 return records, nil 200 201 } 202 203 func flattenAzureRmDnsMxRecord(records []dns.MXRecord) []map[string]interface{} { 204 205 result := make([]map[string]interface{}, 0, len(records)) 206 for _, record := range records { 207 result = append(result, map[string]interface{}{ 208 "preference": record.Preference, 209 "exchange": record.Exchange, 210 }) 211 } 212 return result 213 214 } 215 216 func resourceArmDnsMxRecordHash(v interface{}) int { 217 var buf bytes.Buffer 218 m := v.(map[string]interface{}) 219 buf.WriteString(fmt.Sprintf("%s-", m["preference"].(string))) 220 buf.WriteString(fmt.Sprintf("%s-", m["exchange"].(string))) 221 222 return hashcode.String(buf.String()) 223 }