Skip to content

Commit

Permalink
New resource: azurerm_private_dns_zone (#3718)
Browse files Browse the repository at this point in the history
Fixes #3714
  • Loading branch information
timja authored and katbyte committed Jun 27, 2019
1 parent 3c21de6 commit 0025db8
Show file tree
Hide file tree
Showing 14 changed files with 3,593 additions and 0 deletions.
13 changes: 13 additions & 0 deletions azurerm/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import (
signalrSvc "github.com/Azure/azure-sdk-for-go/services/preview/signalr/mgmt/2018-03-01-preview/signalr"
"github.com/Azure/azure-sdk-for-go/services/preview/sql/mgmt/2015-05-01-preview/sql"
MsSql "github.com/Azure/azure-sdk-for-go/services/preview/sql/mgmt/2017-10-01-preview/sql"
privateDnsSvc "github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
iotdps "github.com/Azure/azure-sdk-for-go/services/provisioningservices/mgmt/2018-01-22/iothub"
recoveryservicesSvc "github.com/Azure/azure-sdk-for-go/services/recoveryservices/mgmt/2016-06-01/recoveryservices"
backupSvc "github.com/Azure/azure-sdk-for-go/services/recoveryservices/mgmt/2017-07-01/backup"
Expand Down Expand Up @@ -85,6 +86,7 @@ import (
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/msi"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/notificationhub"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/policy"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/privatedns"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/recoveryservices"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/redis"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/relay"
Expand Down Expand Up @@ -132,6 +134,7 @@ type ArmClient struct {
devSpace *devspace.Client
devTestLabs *devtestlabs.Client
dns *dns.Client
privateDns *privatedns.Client
eventGrid *eventgrid.Client
eventhub *eventhub.Client
hdinsight *hdinsight.Client
Expand Down Expand Up @@ -400,6 +403,7 @@ func getArmClient(c *authentication.Config, skipProviderRegistration bool, partn
client.registerRecoveryServiceClients(endpoint, c.SubscriptionID, auth)
client.registerPolicyClients(endpoint, c.SubscriptionID, auth)
client.registerManagementGroupClients(endpoint, auth)
client.registerPrivateDNSClient(endpoint, c.SubscriptionID, auth)
client.registerRedisClients(endpoint, c.SubscriptionID, auth)
client.registerRelayClients(endpoint, c.SubscriptionID, auth)
client.registerResourcesClients(endpoint, c.SubscriptionID, auth)
Expand Down Expand Up @@ -996,6 +1000,15 @@ func (c *ArmClient) registerOperationalInsightsClients(endpoint, subscriptionId
}
}

func (c *ArmClient) registerPrivateDNSClient(endpoint, subscriptionId string, auth autorest.Authorizer) {
privateZonesClient := privateDnsSvc.NewPrivateZonesClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&privateZonesClient.Client, auth)

c.privateDns = &privatedns.Client{
PrivateZonesClient: privateZonesClient,
}
}

func (c *ArmClient) registerRecoveryServiceClients(endpoint, subscriptionId string, auth autorest.Authorizer) {
vaultsClient := recoveryservicesSvc.NewVaultsClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&vaultsClient.Client, auth)
Expand Down
9 changes: 9 additions & 0 deletions azurerm/internal/services/privatedns/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package privatedns

import (
"github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
)

type Client struct {
PrivateZonesClient privatedns.PrivateZonesClient
}
1 change: 1 addition & 0 deletions azurerm/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ func Provider() terraform.ResourceProvider {
"azurerm_postgresql_firewall_rule": resourceArmPostgreSQLFirewallRule(),
"azurerm_postgresql_server": resourceArmPostgreSQLServer(),
"azurerm_postgresql_virtual_network_rule": resourceArmPostgreSQLVirtualNetworkRule(),
"azurerm_private_dns_zone": resourceArmPrivateDnsZone(),
"azurerm_public_ip": resourceArmPublicIp(),
"azurerm_public_ip_prefix": resourceArmPublicIpPrefix(),
"azurerm_recovery_services_protected_vm": resourceArmRecoveryServicesProtectedVm(),
Expand Down
191 changes: 191 additions & 0 deletions azurerm/resource_arm_private_dns_zone.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
package azurerm

import (
"fmt"

"time"

"github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/response"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func resourceArmPrivateDnsZone() *schema.Resource {
return &schema.Resource{
Create: resourceArmPrivateDnsZoneCreateUpdate,
Read: resourceArmPrivateDnsZoneRead,
Update: resourceArmPrivateDnsZoneCreateUpdate,
Delete: resourceArmPrivateDnsZoneDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},

"number_of_record_sets": {
Type: schema.TypeInt,
Computed: true,
},

"max_number_of_record_sets": {
Type: schema.TypeInt,
Computed: true,
},

"max_number_of_virtual_network_links": {
Type: schema.TypeInt,
Computed: true,
},

"max_number_of_virtual_network_links_with_registration": {
Type: schema.TypeInt,
Computed: true,
},

"resource_group_name": azure.SchemaResourceGroupNameDiffSuppress(),

"tags": tagsSchema(),
},
}
}

func resourceArmPrivateDnsZoneCreateUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).privateDns.PrivateZonesClient
ctx := meta.(*ArmClient).StopContext

name := d.Get("name").(string)
resGroup := d.Get("resource_group_name").(string)

if requireResourcesToBeImported && d.IsNewResource() {
existing, err := client.Get(ctx, resGroup, name)
if err != nil {
if !utils.ResponseWasNotFound(existing.Response) {
return fmt.Errorf("error checking for presence of existing Private DNS Zone %q (Resource Group %q): %s", name, resGroup, err)
}
}

if existing.ID != nil && *existing.ID != "" {
return tf.ImportAsExistsError("azurerm_private_dns_zone", *existing.ID)
}
}

location := "global"
tags := d.Get("tags").(map[string]interface{})

parameters := privatedns.PrivateZone{
Location: &location,
Tags: expandTags(tags),
}

etag := ""
ifNoneMatch := "" // set to empty to allow updates to records after creation

_, err := client.CreateOrUpdate(ctx, resGroup, name, parameters, etag, ifNoneMatch)
if err != nil {
return fmt.Errorf("error creating/updating Private DNS Zone %q (Resource Group %q): %s", name, resGroup, err)
}

time.Sleep(time.Second * 10) // resource is slow to create / update, retry covers the create, sleeping to make update more reliable
if err := resource.Retry(120*time.Second, retryPrivateDnsZonesClientGet(resGroup, name, meta)); err != nil {
return fmt.Errorf("error waiting for Private DNS Zone %q to become available: %+v", name, err)
}

resp, err := client.Get(ctx, resGroup, name)
if err != nil {
return fmt.Errorf("error retrieving Private DNS Zone %q (Resource Group %q): %s", name, resGroup, err)
}

if resp.ID == nil {
return fmt.Errorf("cannot read Private DNS Zone %q (Resource Group %q) ID", name, resGroup)
}

d.SetId(*resp.ID)

return resourceArmPrivateDnsZoneRead(d, meta)
}

func retryPrivateDnsZonesClientGet(resGroup string, name string, meta interface{}) func() *resource.RetryError {
return func() *resource.RetryError {
client := meta.(*ArmClient).privateDns.PrivateZonesClient
ctx := meta.(*ArmClient).StopContext

if _, err := client.Get(ctx, resGroup, name); err != nil {
return resource.RetryableError(err)
}

return nil
}
}

func resourceArmPrivateDnsZoneRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).privateDns.PrivateZonesClient
ctx := meta.(*ArmClient).StopContext

id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}

resGroup := id.ResourceGroup
name := id.Path["privateDnsZones"]

resp, err := client.Get(ctx, resGroup, name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
d.SetId("")
return nil
}
return fmt.Errorf("error reading Private DNS Zone %q (Resource Group %q): %+v", name, resGroup, err)
}

d.Set("name", name)
d.Set("resource_group_name", resGroup)
d.Set("number_of_record_sets", resp.NumberOfRecordSets)
d.Set("max_number_of_record_sets", resp.MaxNumberOfRecordSets)
d.Set("max_number_of_virtual_network_links", resp.MaxNumberOfVirtualNetworkLinks)
d.Set("max_number_of_virtual_network_links_with_registration", resp.MaxNumberOfVirtualNetworkLinksWithRegistration)

flattenAndSetTags(d, resp.Tags)

return nil
}

func resourceArmPrivateDnsZoneDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).privateDns.PrivateZonesClient
ctx := meta.(*ArmClient).StopContext

id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}

resGroup := id.ResourceGroup
name := id.Path["privateDnsZones"]

etag := ""
future, err := client.Delete(ctx, resGroup, name, etag)
if err != nil {
if response.WasNotFound(future.Response()) {
return nil
}
return fmt.Errorf("error deleting Private DNS Zone %s (resource group %s): %+v", name, resGroup, err)
}

if err = future.WaitForCompletionRef(ctx, client.Client); err != nil {
if response.WasNotFound(future.Response()) {
return nil
}
return fmt.Errorf("error deleting Private DNS Zone %s (resource group %s): %+v", name, resGroup, err)
}

return nil
}
Loading

0 comments on commit 0025db8

Please sign in to comment.