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