Skip to content

Commit 255be73

Browse files
committed
Merge pull request hashicorp#4979 from hashicorp/f-azurerm-dns-zone
provider/azurerm: Add `azurerm_dns_zone` resource
2 parents 0340ea7 + 295bb89 commit 255be73

25 files changed

Lines changed: 1184 additions & 0 deletions

Godeps/Godeps.json

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

builtin/providers/azurerm/config.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ import (
1616
"github.com/Azure/azure-sdk-for-go/arm/storage"
1717
mainStorage "github.com/Azure/azure-sdk-for-go/storage"
1818
"github.com/hashicorp/terraform/terraform"
19+
riviera "github.com/jen20/riviera/azure"
1920
)
2021

2122
// ArmClient contains the handles to all the specific Azure Resource Manager
2223
// resource classes' respective clients.
2324
type ArmClient struct {
25+
rivieraClient *riviera.Client
26+
2427
availSetClient compute.AvailabilitySetsClient
2528
usageOpsClient compute.UsageOperationsClient
2629
vmExtensionImageClient compute.VirtualMachineExtensionImagesClient
@@ -110,6 +113,18 @@ func (c *Config) getArmClient() (*ArmClient, error) {
110113
// client declarations:
111114
client := ArmClient{}
112115

116+
rivieraClient, err := riviera.NewClient(&riviera.AzureResourceManagerCredentials{
117+
ClientID: c.ClientID,
118+
ClientSecret: c.ClientSecret,
119+
TenantID: c.TenantID,
120+
SubscriptionID: c.SubscriptionID,
121+
})
122+
if err != nil {
123+
return nil, fmt.Errorf("Error creating Riviera client: %s", err)
124+
}
125+
126+
client.rivieraClient = rivieraClient
127+
113128
// NOTE: these declarations should be left separate for clarity should the
114129
// clients be wished to be configured with custom Responders/PollingModess etc...
115130
asc := compute.NewAvailabilitySetsClient(c.SubscriptionID)

builtin/providers/azurerm/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ func Provider() terraform.ResourceProvider {
6060
"azurerm_storage_container": resourceArmStorageContainer(),
6161
"azurerm_storage_blob": resourceArmStorageBlob(),
6262
"azurerm_storage_queue": resourceArmStorageQueue(),
63+
"azurerm_dns_zone": resourceArmDnsZone(),
6364
},
6465
ConfigureFunc: providerConfigure,
6566
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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 resourceArmDnsZone() *schema.Resource {
12+
return &schema.Resource{
13+
Create: resourceArmDnsZoneCreate,
14+
Read: resourceArmDnsZoneRead,
15+
Update: resourceArmDnsZoneCreate,
16+
Delete: resourceArmDnsZoneDelete,
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+
"number_of_record_sets": &schema.Schema{
32+
Type: schema.TypeString,
33+
Optional: true,
34+
Computed: true,
35+
},
36+
37+
"max_number_of_record_sets": &schema.Schema{
38+
Type: schema.TypeString,
39+
Optional: true,
40+
Computed: true,
41+
},
42+
},
43+
}
44+
}
45+
46+
func resourceArmDnsZoneCreate(d *schema.ResourceData, meta interface{}) error {
47+
client := meta.(*ArmClient)
48+
rivieraClient := client.rivieraClient
49+
50+
createRequest := rivieraClient.NewRequest()
51+
createRequest.Command = &dns.CreateDNSZone{
52+
Name: d.Get("name").(string),
53+
Location: "global",
54+
ResourceGroupName: d.Get("resource_group_name").(string),
55+
}
56+
57+
createResponse, err := createRequest.Execute()
58+
if err != nil {
59+
return fmt.Errorf("Error creating DNS Zone: %s", err)
60+
}
61+
if !createResponse.IsSuccessful() {
62+
return fmt.Errorf("Error creating DNS Zone: %s", createResponse.Error)
63+
}
64+
65+
readRequest := rivieraClient.NewRequest()
66+
readRequest.Command = &dns.GetDNSZone{
67+
Name: d.Get("name").(string),
68+
ResourceGroupName: d.Get("resource_group_name").(string),
69+
}
70+
71+
readResponse, err := readRequest.Execute()
72+
if err != nil {
73+
return fmt.Errorf("Error reading DNS Zone: %s", err)
74+
}
75+
if !readResponse.IsSuccessful() {
76+
return fmt.Errorf("Error reading DNS Zone: %s", readResponse.Error)
77+
}
78+
79+
resp := readResponse.Parsed.(*dns.GetDNSZoneResponse)
80+
d.SetId(*resp.ID)
81+
82+
return resourceArmDnsZoneRead(d, meta)
83+
}
84+
85+
func resourceArmDnsZoneRead(d *schema.ResourceData, meta interface{}) error {
86+
client := meta.(*ArmClient)
87+
rivieraClient := client.rivieraClient
88+
89+
readRequest := rivieraClient.NewRequestForURI(d.Id())
90+
readRequest.Command = &dns.GetDNSZone{}
91+
92+
readResponse, err := readRequest.Execute()
93+
if err != nil {
94+
return fmt.Errorf("Error reading DNS Zone: %s", err)
95+
}
96+
if !readResponse.IsSuccessful() {
97+
log.Printf("[INFO] Error reading DNS Zone %q - removing from state", d.Id())
98+
d.SetId("")
99+
return fmt.Errorf("Error reading DNS Zone: %s", readResponse.Error)
100+
}
101+
102+
resp := readResponse.Parsed.(*dns.GetDNSZoneResponse)
103+
104+
d.Set("number_of_record_sets", resp.NumberOfRecordSets)
105+
d.Set("max_number_of_record_sets", resp.MaxNumberOfRecordSets)
106+
107+
return nil
108+
}
109+
110+
func resourceArmDnsZoneDelete(d *schema.ResourceData, meta interface{}) error {
111+
client := meta.(*ArmClient)
112+
rivieraClient := client.rivieraClient
113+
114+
deleteRequest := rivieraClient.NewRequestForURI(d.Id())
115+
deleteRequest.Command = &dns.DeleteDNSZone{}
116+
117+
deleteResponse, err := deleteRequest.Execute()
118+
if err != nil {
119+
return fmt.Errorf("Error deleting DNS Zone: %s", err)
120+
}
121+
if !deleteResponse.IsSuccessful() {
122+
return fmt.Errorf("Error deleting DNS Zone: %s", deleteResponse.Error)
123+
}
124+
125+
return nil
126+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package azurerm
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/acctest"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
"github.com/hashicorp/terraform/terraform"
10+
"github.com/jen20/riviera/dns"
11+
)
12+
13+
func TestAccAzureRMDnsZone_basic(t *testing.T) {
14+
ri := acctest.RandInt()
15+
config := fmt.Sprintf(testAccAzureRMDnsZone_basic, ri, ri)
16+
17+
resource.Test(t, resource.TestCase{
18+
PreCheck: func() { testAccPreCheck(t) },
19+
Providers: testAccProviders,
20+
CheckDestroy: testCheckAzureRMDnsZoneDestroy,
21+
Steps: []resource.TestStep{
22+
resource.TestStep{
23+
Config: config,
24+
Check: resource.ComposeTestCheckFunc(
25+
testCheckAzureRMDnsZoneExists("azurerm_dns_zone.test"),
26+
),
27+
},
28+
},
29+
})
30+
}
31+
32+
func testCheckAzureRMDnsZoneExists(name string) resource.TestCheckFunc {
33+
return func(s *terraform.State) error {
34+
// Ensure we have enough information in state to look up in API
35+
rs, ok := s.RootModule().Resources[name]
36+
if !ok {
37+
return fmt.Errorf("Not found: %s", name)
38+
}
39+
40+
conn := testAccProvider.Meta().(*ArmClient).rivieraClient
41+
42+
readRequest := conn.NewRequestForURI(rs.Primary.ID)
43+
readRequest.Command = &dns.GetDNSZone{}
44+
45+
readResponse, err := readRequest.Execute()
46+
if err != nil {
47+
return fmt.Errorf("Bad: GetDNSZone: %s", err)
48+
}
49+
if !readResponse.IsSuccessful() {
50+
return fmt.Errorf("Bad: GetDNSZone: %s", readResponse.Error)
51+
}
52+
53+
return nil
54+
}
55+
}
56+
57+
func testCheckAzureRMDnsZoneDestroy(s *terraform.State) error {
58+
conn := testAccProvider.Meta().(*ArmClient).rivieraClient
59+
60+
for _, rs := range s.RootModule().Resources {
61+
if rs.Type != "azurerm_dns_zone" {
62+
continue
63+
}
64+
65+
readRequest := conn.NewRequestForURI(rs.Primary.ID)
66+
readRequest.Command = &dns.GetDNSZone{}
67+
68+
readResponse, err := readRequest.Execute()
69+
if err != nil {
70+
return fmt.Errorf("Bad: GetDNSZone: %s", err)
71+
}
72+
73+
if readResponse.IsSuccessful() {
74+
return fmt.Errorf("Bad: DNS zone still exists: %s", readResponse.Error)
75+
}
76+
}
77+
78+
return nil
79+
}
80+
81+
var testAccAzureRMDnsZone_basic = `
82+
resource "azurerm_resource_group" "test" {
83+
name = "acctest_rg_%d"
84+
location = "West US"
85+
}
86+
resource "azurerm_dns_zone" "test" {
87+
name = "acctestzone%d.com"
88+
resource_group_name = "${azurerm_resource_group.test.name}"
89+
}
90+
`

0 commit comments

Comments
 (0)