Skip to content

Commit 761308c

Browse files
committed
provider/azurerm: Add the DNS A Record Resource
1 parent 57836e0 commit 761308c

27 files changed

Lines changed: 1042 additions & 27 deletions

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
@@ -61,6 +61,7 @@ func Provider() terraform.ResourceProvider {
6161
"azurerm_storage_blob": resourceArmStorageBlob(),
6262
"azurerm_storage_queue": resourceArmStorageQueue(),
6363
"azurerm_dns_zone": resourceArmDnsZone(),
64+
"azurerm_dns_a_record": resourceArmDnsARecord(),
6465
"azurerm_sql_server": resourceArmSqlServer(),
6566
"azurerm_sql_database": resourceArmSqlDatabase(),
6667
},
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
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 resourceArmDnsARecord() *schema.Resource {
12+
return &schema.Resource{
13+
Create: resourceArmDnsARecordCreate,
14+
Read: resourceArmDnsARecordRead,
15+
Update: resourceArmDnsARecordCreate,
16+
Delete: resourceArmDnsARecordDelete,
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+
"records": &schema.Schema{
37+
Type: schema.TypeSet,
38+
Required: true,
39+
Elem: &schema.Schema{Type: schema.TypeString},
40+
Set: schema.HashString,
41+
},
42+
43+
"ttl": &schema.Schema{
44+
Type: schema.TypeInt,
45+
Required: true,
46+
},
47+
48+
"tags": tagsSchema(),
49+
},
50+
}
51+
}
52+
53+
func resourceArmDnsARecordCreate(d *schema.ResourceData, meta interface{}) error {
54+
client := meta.(*ArmClient)
55+
rivieraClient := client.rivieraClient
56+
57+
tags := d.Get("tags").(map[string]interface{})
58+
expandedTags := expandTags(tags)
59+
60+
createCommand := &dns.CreateARecordSet{
61+
Name: d.Get("name").(string),
62+
Location: "global",
63+
ResourceGroupName: d.Get("resource_group_name").(string),
64+
ZoneName: d.Get("zone_name").(string),
65+
TTL: d.Get("ttl").(int),
66+
Tags: *expandedTags,
67+
}
68+
69+
recordStrings := d.Get("records").(*schema.Set).List()
70+
records := make([]dns.ARecord, len(recordStrings))
71+
for i, v := range recordStrings {
72+
records[i] = dns.ARecord{
73+
IPv4Address: v.(string),
74+
}
75+
}
76+
createCommand.ARecords = records
77+
78+
createRequest := rivieraClient.NewRequest()
79+
createRequest.Command = createCommand
80+
81+
createResponse, err := createRequest.Execute()
82+
if err != nil {
83+
return fmt.Errorf("Error creating DNS A Record: %s", err)
84+
}
85+
if !createResponse.IsSuccessful() {
86+
return fmt.Errorf("Error creating DNS A Record: %s", createResponse.Error)
87+
}
88+
89+
readRequest := rivieraClient.NewRequest()
90+
readRequest.Command = &dns.GetARecordSet{
91+
Name: d.Get("name").(string),
92+
ResourceGroupName: d.Get("resource_group_name").(string),
93+
ZoneName: d.Get("zone_name").(string),
94+
}
95+
96+
readResponse, err := readRequest.Execute()
97+
if err != nil {
98+
return fmt.Errorf("Error reading DNS A Record: %s", err)
99+
}
100+
if !readResponse.IsSuccessful() {
101+
return fmt.Errorf("Error reading DNS A Record: %s", readResponse.Error)
102+
}
103+
104+
resp := readResponse.Parsed.(*dns.GetARecordSetResponse)
105+
d.SetId(resp.ID)
106+
107+
return resourceArmDnsARecordRead(d, meta)
108+
}
109+
110+
func resourceArmDnsARecordRead(d *schema.ResourceData, meta interface{}) error {
111+
client := meta.(*ArmClient)
112+
rivieraClient := client.rivieraClient
113+
114+
readRequest := rivieraClient.NewRequestForURI(d.Id())
115+
readRequest.Command = &dns.GetARecordSet{}
116+
117+
readResponse, err := readRequest.Execute()
118+
if err != nil {
119+
return fmt.Errorf("Error reading DNS A Record: %s", err)
120+
}
121+
if !readResponse.IsSuccessful() {
122+
log.Printf("[INFO] Error reading DNS A Record %q - removing from state", d.Id())
123+
d.SetId("")
124+
return fmt.Errorf("Error reading DNS A Record: %s", readResponse.Error)
125+
}
126+
127+
resp := readResponse.Parsed.(*dns.GetARecordSetResponse)
128+
129+
d.Set("ttl", resp.TTL)
130+
131+
if resp.ARecords != nil {
132+
records := make([]string, 0, len(resp.ARecords))
133+
for _, record := range resp.ARecords {
134+
records = append(records, record.IPv4Address)
135+
}
136+
137+
if err := d.Set("records", records); err != nil {
138+
return err
139+
}
140+
}
141+
142+
flattenAndSetTags(d, &resp.Tags)
143+
144+
return nil
145+
}
146+
147+
func resourceArmDnsARecordDelete(d *schema.ResourceData, meta interface{}) error {
148+
client := meta.(*ArmClient)
149+
rivieraClient := client.rivieraClient
150+
151+
deleteRequest := rivieraClient.NewRequestForURI(d.Id())
152+
deleteRequest.Command = &dns.DeleteRecordSet{
153+
RecordSetType: "A",
154+
}
155+
156+
deleteResponse, err := deleteRequest.Execute()
157+
if err != nil {
158+
return fmt.Errorf("Error deleting DNS A Record: %s", err)
159+
}
160+
if !deleteResponse.IsSuccessful() {
161+
return fmt.Errorf("Error deleting DNS A Record: %s", deleteResponse.Error)
162+
}
163+
164+
return nil
165+
}

0 commit comments

Comments
 (0)