github.com/danrjohnson/terraform@v0.7.0-rc2.0.20160627135212-d0fc1fa086ff/builtin/providers/azurerm/resource_arm_dns_txt_record.go (about) 1 package azurerm 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "github.com/jen20/riviera/dns" 9 ) 10 11 func resourceArmDnsTxtRecord() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourceArmDnsTxtRecordCreate, 14 Read: resourceArmDnsTxtRecordRead, 15 Update: resourceArmDnsTxtRecordCreate, 16 Delete: resourceArmDnsTxtRecordDelete, 17 18 Schema: map[string]*schema.Schema{ 19 "name": &schema.Schema{ 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 25 "resource_group_name": &schema.Schema{ 26 Type: schema.TypeString, 27 Required: true, 28 ForceNew: true, 29 }, 30 31 "zone_name": &schema.Schema{ 32 Type: schema.TypeString, 33 Required: true, 34 }, 35 36 "record": &schema.Schema{ 37 Type: schema.TypeSet, 38 Required: true, 39 Elem: &schema.Resource{ 40 Schema: map[string]*schema.Schema{ 41 "value": &schema.Schema{ 42 Type: schema.TypeString, 43 Required: true, 44 }, 45 }, 46 }, 47 }, 48 49 "ttl": &schema.Schema{ 50 Type: schema.TypeInt, 51 Required: true, 52 }, 53 54 "tags": tagsSchema(), 55 }, 56 } 57 } 58 59 func resourceArmDnsTxtRecordCreate(d *schema.ResourceData, meta interface{}) error { 60 client := meta.(*ArmClient) 61 rivieraClient := client.rivieraClient 62 63 tags := d.Get("tags").(map[string]interface{}) 64 expandedTags := expandTags(tags) 65 66 createCommand := &dns.CreateTXTRecordSet{ 67 Name: d.Get("name").(string), 68 Location: "global", 69 ResourceGroupName: d.Get("resource_group_name").(string), 70 ZoneName: d.Get("zone_name").(string), 71 TTL: d.Get("ttl").(int), 72 Tags: *expandedTags, 73 } 74 75 txtRecords, recordErr := expandAzureRmDnsTxtRecords(d) 76 if recordErr != nil { 77 return fmt.Errorf("Error Building list of Azure RM Txt Records: %s", recordErr) 78 } 79 createCommand.TXTRecords = txtRecords 80 81 createRequest := rivieraClient.NewRequest() 82 createRequest.Command = createCommand 83 84 createResponse, err := createRequest.Execute() 85 if err != nil { 86 return fmt.Errorf("Error creating DNS TXT Record: %s", err) 87 } 88 if !createResponse.IsSuccessful() { 89 return fmt.Errorf("Error creating DNS TXT Record: %s", createResponse.Error) 90 } 91 92 readRequest := rivieraClient.NewRequest() 93 readRequest.Command = &dns.GetTXTRecordSet{ 94 Name: d.Get("name").(string), 95 ResourceGroupName: d.Get("resource_group_name").(string), 96 ZoneName: d.Get("zone_name").(string), 97 } 98 99 readResponse, err := readRequest.Execute() 100 if err != nil { 101 return fmt.Errorf("Error reading DNS TXT Record: %s", err) 102 } 103 if !readResponse.IsSuccessful() { 104 return fmt.Errorf("Error reading DNS TXT Record: %s", readResponse.Error) 105 } 106 107 resp := readResponse.Parsed.(*dns.GetTXTRecordSetResponse) 108 d.SetId(resp.ID) 109 110 return resourceArmDnsTxtRecordRead(d, meta) 111 } 112 113 func resourceArmDnsTxtRecordRead(d *schema.ResourceData, meta interface{}) error { 114 client := meta.(*ArmClient) 115 rivieraClient := client.rivieraClient 116 117 readRequest := rivieraClient.NewRequestForURI(d.Id()) 118 readRequest.Command = &dns.GetTXTRecordSet{} 119 120 readResponse, err := readRequest.Execute() 121 if err != nil { 122 return fmt.Errorf("Error reading DNS TXT Record: %s", err) 123 } 124 if !readResponse.IsSuccessful() { 125 log.Printf("[INFO] Error reading DNS TXT Record %q - removing from state", d.Id()) 126 d.SetId("") 127 return fmt.Errorf("Error reading DNS TXT Record: %s", readResponse.Error) 128 } 129 130 resp := readResponse.Parsed.(*dns.GetTXTRecordSetResponse) 131 132 d.Set("ttl", resp.TTL) 133 134 if resp.TXTRecords != nil { 135 if err := d.Set("record", flattenAzureRmDnsTxtRecords(resp.TXTRecords)); err != nil { 136 log.Printf("[INFO] Error setting the Azure RM TXT Record State: %s", err) 137 return err 138 } 139 } 140 141 flattenAndSetTags(d, &resp.Tags) 142 143 return nil 144 } 145 146 func resourceArmDnsTxtRecordDelete(d *schema.ResourceData, meta interface{}) error { 147 client := meta.(*ArmClient) 148 rivieraClient := client.rivieraClient 149 150 deleteRequest := rivieraClient.NewRequestForURI(d.Id()) 151 deleteRequest.Command = &dns.DeleteRecordSet{ 152 RecordSetType: "TXT", 153 } 154 155 deleteResponse, err := deleteRequest.Execute() 156 if err != nil { 157 return fmt.Errorf("Error deleting DNS TXT Record: %s", err) 158 } 159 if !deleteResponse.IsSuccessful() { 160 return fmt.Errorf("Error deleting DNS TXT Record: %s", deleteResponse.Error) 161 } 162 163 return nil 164 } 165 166 func expandAzureRmDnsTxtRecords(d *schema.ResourceData) ([]dns.TXTRecord, error) { 167 configs := d.Get("record").(*schema.Set).List() 168 txtRecords := make([]dns.TXTRecord, 0, len(configs)) 169 170 for _, configRaw := range configs { 171 data := configRaw.(map[string]interface{}) 172 173 txtRecord := dns.TXTRecord{ 174 Value: data["value"].(string), 175 } 176 177 txtRecords = append(txtRecords, txtRecord) 178 179 } 180 181 return txtRecords, nil 182 183 } 184 185 func flattenAzureRmDnsTxtRecords(records []dns.TXTRecord) []map[string]interface{} { 186 result := make([]map[string]interface{}, 0, len(records)) 187 for _, record := range records { 188 txtRecord := make(map[string]interface{}) 189 txtRecord["value"] = record.Value 190 191 result = append(result, txtRecord) 192 } 193 return result 194 }