github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/azurerm/resource_arm_dns_txt_record.go (about)

     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  		Importer: &schema.ResourceImporter{
    18  			State: schema.ImportStatePassthrough,
    19  		},
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  
    28  			"resource_group_name": &schema.Schema{
    29  				Type:     schema.TypeString,
    30  				Required: true,
    31  				ForceNew: true,
    32  			},
    33  
    34  			"zone_name": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Required: true,
    37  			},
    38  
    39  			"record": &schema.Schema{
    40  				Type:     schema.TypeSet,
    41  				Required: true,
    42  				Elem: &schema.Resource{
    43  					Schema: map[string]*schema.Schema{
    44  						"value": &schema.Schema{
    45  							Type:     schema.TypeString,
    46  							Required: true,
    47  						},
    48  					},
    49  				},
    50  			},
    51  
    52  			"ttl": &schema.Schema{
    53  				Type:     schema.TypeInt,
    54  				Required: true,
    55  			},
    56  
    57  			"tags": tagsSchema(),
    58  		},
    59  	}
    60  }
    61  
    62  func resourceArmDnsTxtRecordCreate(d *schema.ResourceData, meta interface{}) error {
    63  	client := meta.(*ArmClient)
    64  	rivieraClient := client.rivieraClient
    65  
    66  	tags := d.Get("tags").(map[string]interface{})
    67  	expandedTags := expandTags(tags)
    68  
    69  	createCommand := &dns.CreateTXTRecordSet{
    70  		Name:              d.Get("name").(string),
    71  		Location:          "global",
    72  		ResourceGroupName: d.Get("resource_group_name").(string),
    73  		ZoneName:          d.Get("zone_name").(string),
    74  		TTL:               d.Get("ttl").(int),
    75  		Tags:              *expandedTags,
    76  	}
    77  
    78  	txtRecords, recordErr := expandAzureRmDnsTxtRecords(d)
    79  	if recordErr != nil {
    80  		return fmt.Errorf("Error Building list of Azure RM Txt Records: %s", recordErr)
    81  	}
    82  	createCommand.TXTRecords = txtRecords
    83  
    84  	createRequest := rivieraClient.NewRequest()
    85  	createRequest.Command = createCommand
    86  
    87  	createResponse, err := createRequest.Execute()
    88  	if err != nil {
    89  		return fmt.Errorf("Error creating DNS TXT Record: %s", err)
    90  	}
    91  	if !createResponse.IsSuccessful() {
    92  		return fmt.Errorf("Error creating DNS TXT Record: %s", createResponse.Error)
    93  	}
    94  
    95  	readRequest := rivieraClient.NewRequest()
    96  	readRequest.Command = &dns.GetTXTRecordSet{
    97  		Name:              d.Get("name").(string),
    98  		ResourceGroupName: d.Get("resource_group_name").(string),
    99  		ZoneName:          d.Get("zone_name").(string),
   100  	}
   101  
   102  	readResponse, err := readRequest.Execute()
   103  	if err != nil {
   104  		return fmt.Errorf("Error reading DNS TXT Record: %s", err)
   105  	}
   106  	if !readResponse.IsSuccessful() {
   107  		return fmt.Errorf("Error reading DNS TXT Record: %s", readResponse.Error)
   108  	}
   109  
   110  	resp := readResponse.Parsed.(*dns.GetTXTRecordSetResponse)
   111  	d.SetId(resp.ID)
   112  
   113  	return resourceArmDnsTxtRecordRead(d, meta)
   114  }
   115  
   116  func resourceArmDnsTxtRecordRead(d *schema.ResourceData, meta interface{}) error {
   117  	client := meta.(*ArmClient)
   118  	rivieraClient := client.rivieraClient
   119  
   120  	id, err := parseAzureResourceID(d.Id())
   121  	if err != nil {
   122  		return err
   123  	}
   124  
   125  	readRequest := rivieraClient.NewRequestForURI(d.Id())
   126  	readRequest.Command = &dns.GetTXTRecordSet{}
   127  
   128  	readResponse, err := readRequest.Execute()
   129  	if err != nil {
   130  		return fmt.Errorf("Error reading DNS TXT Record: %s", err)
   131  	}
   132  	if !readResponse.IsSuccessful() {
   133  		log.Printf("[INFO] Error reading DNS TXT Record %q - removing from state", d.Id())
   134  		d.SetId("")
   135  		return fmt.Errorf("Error reading DNS TXT Record: %s", readResponse.Error)
   136  	}
   137  
   138  	resp := readResponse.Parsed.(*dns.GetTXTRecordSetResponse)
   139  
   140  	d.Set("name", resp.Name)
   141  	d.Set("resource_group_name", id.ResourceGroup)
   142  	d.Set("zone_name", id.Path["dnszones"])
   143  	d.Set("ttl", resp.TTL)
   144  
   145  	if resp.TXTRecords != nil {
   146  		if err := d.Set("record", flattenAzureRmDnsTxtRecords(resp.TXTRecords)); err != nil {
   147  			log.Printf("[INFO] Error setting the Azure RM TXT Record State: %s", err)
   148  			return err
   149  		}
   150  	}
   151  
   152  	flattenAndSetTags(d, &resp.Tags)
   153  
   154  	return nil
   155  }
   156  
   157  func resourceArmDnsTxtRecordDelete(d *schema.ResourceData, meta interface{}) error {
   158  	client := meta.(*ArmClient)
   159  	rivieraClient := client.rivieraClient
   160  
   161  	deleteRequest := rivieraClient.NewRequestForURI(d.Id())
   162  	deleteRequest.Command = &dns.DeleteRecordSet{
   163  		RecordSetType: "TXT",
   164  	}
   165  
   166  	deleteResponse, err := deleteRequest.Execute()
   167  	if err != nil {
   168  		return fmt.Errorf("Error deleting DNS TXT Record: %s", err)
   169  	}
   170  	if !deleteResponse.IsSuccessful() {
   171  		return fmt.Errorf("Error deleting DNS TXT Record: %s", deleteResponse.Error)
   172  	}
   173  
   174  	return nil
   175  }
   176  
   177  func expandAzureRmDnsTxtRecords(d *schema.ResourceData) ([]dns.TXTRecord, error) {
   178  	configs := d.Get("record").(*schema.Set).List()
   179  	txtRecords := make([]dns.TXTRecord, 0, len(configs))
   180  
   181  	for _, configRaw := range configs {
   182  		data := configRaw.(map[string]interface{})
   183  
   184  		txtRecord := dns.TXTRecord{
   185  			Value: data["value"].(string),
   186  		}
   187  
   188  		txtRecords = append(txtRecords, txtRecord)
   189  
   190  	}
   191  
   192  	return txtRecords, nil
   193  
   194  }
   195  
   196  func flattenAzureRmDnsTxtRecords(records []dns.TXTRecord) []map[string]interface{} {
   197  	result := make([]map[string]interface{}, 0, len(records))
   198  	for _, record := range records {
   199  		txtRecord := make(map[string]interface{})
   200  		txtRecord["value"] = record.Value
   201  
   202  		result = append(result, txtRecord)
   203  	}
   204  	return result
   205  }