Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

azurerm_private_dns_ptr_record - new resource type (#4691) #4703

Merged
merged 9 commits into from
Oct 31, 2019
1 change: 1 addition & 0 deletions azurerm/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ func Provider() terraform.ResourceProvider {
"azurerm_private_dns_zone": resourceArmPrivateDnsZone(),
"azurerm_private_dns_a_record": resourceArmPrivateDnsARecord(),
"azurerm_private_dns_cname_record": resourceArmPrivateDnsCNameRecord(),
"azurerm_private_dns_ptr_record": resourceArmPrivateDnsPtrRecord(),
"azurerm_private_dns_zone_virtual_network_link": resourceArmPrivateDnsZoneVirtualNetworkLink(),
"azurerm_proximity_placement_group": resourceArmProximityPlacementGroup(),
"azurerm_public_ip": resourceArmPublicIp(),
Expand Down
212 changes: 212 additions & 0 deletions azurerm/resource_arm_private_dns_ptr_record.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
package azurerm

import (
"fmt"
"time"

"github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/features"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func resourceArmPrivateDnsPtrRecord() *schema.Resource {
return &schema.Resource{
Create: resourceArmPrivateDnsPtrRecordCreateUpdate,
Read: resourceArmPrivateDnsPtrRecordRead,
Update: resourceArmPrivateDnsPtrRecordCreateUpdate,
Delete: resourceArmPrivateDnsPtrRecordDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(30 * time.Minute),
Read: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(30 * time.Minute),
Delete: schema.DefaultTimeout(30 * time.Minute),
},

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

// TODO: make this case sensitive once the API's fixed https://github.com/Azure/azure-rest-api-specs/issues/6641
"resource_group_name": azure.SchemaResourceGroupNameDiffSuppress(),

"zone_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validate.NoEmptyStrings,
},

"records": {
Type: schema.TypeSet,
Required: true,
Elem: &schema.Schema{Type: schema.TypeString},
Set: schema.HashString,
},

"ttl": {
Type: schema.TypeInt,
Required: true,
ValidateFunc: validation.IntBetween(1, 2147483647),
},

"tags": tags.Schema(),
},
}
}

func resourceArmPrivateDnsPtrRecordCreateUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).PrivateDns.RecordSetsClient
ctx, cancel := timeouts.ForCreateUpdate(meta.(*ArmClient).StopContext, d)
defer cancel()

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

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

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

ttl := int64(d.Get("ttl").(int))
t := d.Get("tags").(map[string]interface{})

parameters := privatedns.RecordSet{
Name: &name,
RecordSetProperties: &privatedns.RecordSetProperties{
Metadata: tags.Expand(t),
TTL: &ttl,
PtrRecords: expandAzureRmPrivateDnsPtrRecords(d),
},
}

eTag := ""
ifNoneMatch := "" // set to empty to allow updates to records after creation
if _, err := client.CreateOrUpdate(ctx, resGroup, zoneName, privatedns.PTR, name, parameters, eTag, ifNoneMatch); err != nil {
return fmt.Errorf("Error creating/updating Private DNS PTR Record %q (Zone %q / Resource Group %q): %s", name, zoneName, resGroup, err)
}

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

if resp.ID == nil {
return fmt.Errorf("Cannot read Private DNS PTR Record %s (resource group %s) ID", name, resGroup)
}

d.SetId(*resp.ID)

return resourceArmPrivateDnsPtrRecordRead(d, meta)
}

func resourceArmPrivateDnsPtrRecordRead(d *schema.ResourceData, meta interface{}) error {
dnsClient := meta.(*ArmClient).PrivateDns.RecordSetsClient
ctx, cancel := timeouts.ForRead(meta.(*ArmClient).StopContext, d)
defer cancel()

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

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

resp, err := dnsClient.Get(ctx, resGroup, zoneName, privatedns.PTR, name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
d.SetId("")
return nil
}
return fmt.Errorf("Error reading Private DNS PTR record %s: %+v", name, err)
}

d.Set("name", name)
d.Set("resource_group_name", resGroup)
d.Set("zone_name", zoneName)
d.Set("ttl", resp.TTL)

if props := resp.RecordSetProperties; props != nil {
if err := d.Set("records", flattenAzureRmPrivateDnsPtrRecords(resp.PtrRecords)); err != nil {
return fmt.Errorf("Error setting `records`: %+v", err)
}
}

return tags.FlattenAndSet(d, resp.Metadata)
}

func resourceArmPrivateDnsPtrRecordDelete(d *schema.ResourceData, meta interface{}) error {
dnsClient := meta.(*ArmClient).PrivateDns.RecordSetsClient
ctx, cancel := timeouts.ForDelete(meta.(*ArmClient).StopContext, d)
defer cancel()

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

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

_, err = dnsClient.Delete(ctx, resGroup, zoneName, privatedns.PTR, name, "")
if err != nil {
return fmt.Errorf("Error deleting Private DNS PTR Record %s: %+v", name, err)
}

return nil
}

func flattenAzureRmPrivateDnsPtrRecords(records *[]privatedns.PtrRecord) []string {
results := make([]string, 0)

if records != nil {
for _, record := range *records {
if record.Ptrdname == nil {
continue
}
results = append(results, *record.Ptrdname)
phires marked this conversation as resolved.
Show resolved Hide resolved
}
}

return results
}

func expandAzureRmPrivateDnsPtrRecords(d *schema.ResourceData) *[]privatedns.PtrRecord {
recordStrings := d.Get("records").(*schema.Set).List()
records := make([]privatedns.PtrRecord, len(recordStrings))

for i, v := range recordStrings {
fqdn := v.(string)
records[i] = privatedns.PtrRecord{
Ptrdname: &fqdn,
}
}

return &records
}
Loading