github.com/peterbale/terraform@v0.9.0-beta2.0.20170315142748-5723acd55547/builtin/providers/azurerm/resource_arm_dns_srv_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 resourceArmDnsSrvRecord() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceArmDnsSrvRecordCreate, 16 Read: resourceArmDnsSrvRecordRead, 17 Update: resourceArmDnsSrvRecordCreate, 18 Delete: resourceArmDnsSrvRecordDelete, 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 "priority": &schema.Schema{ 47 Type: schema.TypeInt, 48 Required: true, 49 }, 50 51 "weight": &schema.Schema{ 52 Type: schema.TypeInt, 53 Required: true, 54 }, 55 56 "port": &schema.Schema{ 57 Type: schema.TypeInt, 58 Required: true, 59 }, 60 61 "target": &schema.Schema{ 62 Type: schema.TypeString, 63 Required: true, 64 }, 65 }, 66 }, 67 Set: resourceArmDnsSrvRecordHash, 68 }, 69 70 "ttl": &schema.Schema{ 71 Type: schema.TypeInt, 72 Required: true, 73 }, 74 75 "tags": tagsSchema(), 76 }, 77 } 78 } 79 80 func resourceArmDnsSrvRecordCreate(d *schema.ResourceData, meta interface{}) error { 81 client := meta.(*ArmClient) 82 rivieraClient := client.rivieraClient 83 84 tags := d.Get("tags").(map[string]interface{}) 85 expandedTags := expandTags(tags) 86 87 createCommand := &dns.CreateSRVRecordSet{ 88 Name: d.Get("name").(string), 89 Location: "global", 90 ResourceGroupName: d.Get("resource_group_name").(string), 91 ZoneName: d.Get("zone_name").(string), 92 TTL: d.Get("ttl").(int), 93 Tags: *expandedTags, 94 } 95 96 srvRecords, recordErr := expandAzureRmDnsSrvRecord(d) 97 if recordErr != nil { 98 return fmt.Errorf("Error Building Azure RM SRV Record: %s", recordErr) 99 } 100 createCommand.SRVRecords = srvRecords 101 102 createRequest := rivieraClient.NewRequest() 103 createRequest.Command = createCommand 104 105 createResponse, err := createRequest.Execute() 106 if err != nil { 107 return fmt.Errorf("Error creating DNS SRV Record: %s", err) 108 } 109 if !createResponse.IsSuccessful() { 110 return fmt.Errorf("Error creating DNS SRV Record: %s", createResponse.Error) 111 } 112 113 readRequest := rivieraClient.NewRequest() 114 readRequest.Command = &dns.GetSRVRecordSet{ 115 Name: d.Get("name").(string), 116 ResourceGroupName: d.Get("resource_group_name").(string), 117 ZoneName: d.Get("zone_name").(string), 118 } 119 120 readResponse, err := readRequest.Execute() 121 if err != nil { 122 return fmt.Errorf("Error reading DNS SRV Record: %s", err) 123 } 124 if !readResponse.IsSuccessful() { 125 return fmt.Errorf("Error reading DNS SRV Record: %s", readResponse.Error) 126 } 127 128 resp := readResponse.Parsed.(*dns.GetSRVRecordSetResponse) 129 d.SetId(resp.ID) 130 131 return resourceArmDnsSrvRecordRead(d, meta) 132 } 133 134 func resourceArmDnsSrvRecordRead(d *schema.ResourceData, meta interface{}) error { 135 client := meta.(*ArmClient) 136 rivieraClient := client.rivieraClient 137 138 id, err := parseAzureResourceID(d.Id()) 139 if err != nil { 140 return err 141 } 142 143 readRequest := rivieraClient.NewRequestForURI(d.Id()) 144 readRequest.Command = &dns.GetSRVRecordSet{} 145 146 readResponse, err := readRequest.Execute() 147 if err != nil { 148 return fmt.Errorf("Error reading DNS SRV Record: %s", err) 149 } 150 if !readResponse.IsSuccessful() { 151 log.Printf("[INFO] Error reading DNS SRV Record %q - removing from state", d.Id()) 152 d.SetId("") 153 return fmt.Errorf("Error reading DNS SRV Record: %s", readResponse.Error) 154 } 155 156 resp := readResponse.Parsed.(*dns.GetSRVRecordSetResponse) 157 158 d.Set("name", resp.Name) 159 d.Set("resource_group_name", id.ResourceGroup) 160 d.Set("zone_name", id.Path["dnszones"]) 161 d.Set("ttl", resp.TTL) 162 163 if err := d.Set("record", flattenAzureRmDnsSrvRecord(resp.SRVRecords)); err != nil { 164 log.Printf("[INFO] Error setting the Azure RM SRV Record State: %s", err) 165 return err 166 } 167 168 flattenAndSetTags(d, &resp.Tags) 169 170 return nil 171 } 172 173 func resourceArmDnsSrvRecordDelete(d *schema.ResourceData, meta interface{}) error { 174 client := meta.(*ArmClient) 175 rivieraClient := client.rivieraClient 176 177 deleteRequest := rivieraClient.NewRequestForURI(d.Id()) 178 deleteRequest.Command = &dns.DeleteRecordSet{ 179 RecordSetType: "SRV", 180 } 181 182 deleteResponse, err := deleteRequest.Execute() 183 if err != nil { 184 return fmt.Errorf("Error deleting DNS SRV Record: %s", err) 185 } 186 if !deleteResponse.IsSuccessful() { 187 return fmt.Errorf("Error deleting DNS SRV Record: %s", deleteResponse.Error) 188 } 189 190 return nil 191 } 192 193 func expandAzureRmDnsSrvRecord(d *schema.ResourceData) ([]dns.SRVRecord, error) { 194 config := d.Get("record").(*schema.Set).List() 195 records := make([]dns.SRVRecord, 0, len(config)) 196 197 for _, pRaw := range config { 198 data := pRaw.(map[string]interface{}) 199 200 srvRecord := dns.SRVRecord{ 201 Priority: data["priority"].(int), 202 Weight: data["weight"].(int), 203 Port: data["port"].(int), 204 Target: data["target"].(string), 205 } 206 207 records = append(records, srvRecord) 208 209 } 210 211 return records, nil 212 213 } 214 215 func flattenAzureRmDnsSrvRecord(records []dns.SRVRecord) []map[string]interface{} { 216 217 result := make([]map[string]interface{}, 0, len(records)) 218 for _, record := range records { 219 result = append(result, map[string]interface{}{ 220 "priority": record.Priority, 221 "weight": record.Weight, 222 "port": record.Port, 223 "target": record.Target, 224 }) 225 } 226 return result 227 228 } 229 230 func resourceArmDnsSrvRecordHash(v interface{}) int { 231 var buf bytes.Buffer 232 m := v.(map[string]interface{}) 233 buf.WriteString(fmt.Sprintf("%d-", m["priority"].(int))) 234 buf.WriteString(fmt.Sprintf("%d-", m["weight"].(int))) 235 buf.WriteString(fmt.Sprintf("%d-", m["port"].(int))) 236 buf.WriteString(fmt.Sprintf("%s-", m["target"].(string))) 237 238 return hashcode.String(buf.String()) 239 }