Skip to content

Commit 37bc5a4

Browse files
committed
provider/azurerm: Add azurerm_dns_txt_record resource
1 parent f57ce43 commit 37bc5a4

8 files changed

Lines changed: 555 additions & 4 deletions

File tree

Godeps/Godeps.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

builtin/providers/azurerm/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func Provider() terraform.ResourceProvider {
6464
"azurerm_dns_a_record": resourceArmDnsARecord(),
6565
"azurerm_dns_aaaa_record": resourceArmDnsAAAARecord(),
6666
"azurerm_dns_cname_record": resourceArmDnsCNameRecord(),
67+
"azurerm_dns_txt_record": resourceArmDnsTxtRecord(),
6768
"azurerm_sql_server": resourceArmSqlServer(),
6869
"azurerm_sql_database": resourceArmSqlDatabase(),
6970
},
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
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+
}

0 commit comments

Comments
 (0)