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

     1  package azurerm
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"log"
     7  
     8  	"github.com/hashicorp/terraform/helper/hashcode"
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  	"github.com/jen20/riviera/dns"
    11  )
    12  
    13  func resourceArmDnsSrvRecord() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceArmDnsSrvRecordCreate,
    16  		Read:   resourceArmDnsSrvRecordRead,
    17  		Update: resourceArmDnsSrvRecordCreate,
    18  		Delete: resourceArmDnsSrvRecordDelete,
    19  		Importer: &schema.ResourceImporter{
    20  			State: schema.ImportStatePassthrough,
    21  		},
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"name": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  				ForceNew: true,
    28  			},
    29  
    30  			"resource_group_name": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Required: true,
    33  				ForceNew: true,
    34  			},
    35  
    36  			"zone_name": &schema.Schema{
    37  				Type:     schema.TypeString,
    38  				Required: true,
    39  			},
    40  
    41  			"record": &schema.Schema{
    42  				Type:     schema.TypeSet,
    43  				Required: true,
    44  				Elem: &schema.Resource{
    45  					Schema: map[string]*schema.Schema{
    46  						"priority": &schema.Schema{
    47  							Type:     schema.TypeInt,
    48  							Required: true,
    49  						},
    50  
    51  						"weight": &schema.Schema{
    52  							Type:     schema.TypeInt,
    53  							Required: true,
    54  						},
    55  
    56  						"port": &schema.Schema{
    57  							Type:     schema.TypeInt,
    58  							Required: true,
    59  						},
    60  
    61  						"target": &schema.Schema{
    62  							Type:     schema.TypeString,
    63  							Required: true,
    64  						},
    65  					},
    66  				},
    67  				Set: resourceArmDnsSrvRecordHash,
    68  			},
    69  
    70  			"ttl": &schema.Schema{
    71  				Type:     schema.TypeInt,
    72  				Required: true,
    73  			},
    74  
    75  			"tags": tagsSchema(),
    76  		},
    77  	}
    78  }
    79  
    80  func resourceArmDnsSrvRecordCreate(d *schema.ResourceData, meta interface{}) error {
    81  	client := meta.(*ArmClient)
    82  	rivieraClient := client.rivieraClient
    83  
    84  	tags := d.Get("tags").(map[string]interface{})
    85  	expandedTags := expandTags(tags)
    86  
    87  	createCommand := &dns.CreateSRVRecordSet{
    88  		Name:              d.Get("name").(string),
    89  		Location:          "global",
    90  		ResourceGroupName: d.Get("resource_group_name").(string),
    91  		ZoneName:          d.Get("zone_name").(string),
    92  		TTL:               d.Get("ttl").(int),
    93  		Tags:              *expandedTags,
    94  	}
    95  
    96  	srvRecords, recordErr := expandAzureRmDnsSrvRecord(d)
    97  	if recordErr != nil {
    98  		return fmt.Errorf("Error Building Azure RM SRV Record: %s", recordErr)
    99  	}
   100  	createCommand.SRVRecords = srvRecords
   101  
   102  	createRequest := rivieraClient.NewRequest()
   103  	createRequest.Command = createCommand
   104  
   105  	createResponse, err := createRequest.Execute()
   106  	if err != nil {
   107  		return fmt.Errorf("Error creating DNS SRV Record: %s", err)
   108  	}
   109  	if !createResponse.IsSuccessful() {
   110  		return fmt.Errorf("Error creating DNS SRV Record: %s", createResponse.Error)
   111  	}
   112  
   113  	readRequest := rivieraClient.NewRequest()
   114  	readRequest.Command = &dns.GetSRVRecordSet{
   115  		Name:              d.Get("name").(string),
   116  		ResourceGroupName: d.Get("resource_group_name").(string),
   117  		ZoneName:          d.Get("zone_name").(string),
   118  	}
   119  
   120  	readResponse, err := readRequest.Execute()
   121  	if err != nil {
   122  		return fmt.Errorf("Error reading DNS SRV Record: %s", err)
   123  	}
   124  	if !readResponse.IsSuccessful() {
   125  		return fmt.Errorf("Error reading DNS SRV Record: %s", readResponse.Error)
   126  	}
   127  
   128  	resp := readResponse.Parsed.(*dns.GetSRVRecordSetResponse)
   129  	d.SetId(resp.ID)
   130  
   131  	return resourceArmDnsSrvRecordRead(d, meta)
   132  }
   133  
   134  func resourceArmDnsSrvRecordRead(d *schema.ResourceData, meta interface{}) error {
   135  	client := meta.(*ArmClient)
   136  	rivieraClient := client.rivieraClient
   137  
   138  	id, err := parseAzureResourceID(d.Id())
   139  	if err != nil {
   140  		return err
   141  	}
   142  
   143  	readRequest := rivieraClient.NewRequestForURI(d.Id())
   144  	readRequest.Command = &dns.GetSRVRecordSet{}
   145  
   146  	readResponse, err := readRequest.Execute()
   147  	if err != nil {
   148  		return fmt.Errorf("Error reading DNS SRV Record: %s", err)
   149  	}
   150  	if !readResponse.IsSuccessful() {
   151  		log.Printf("[INFO] Error reading DNS SRV Record %q - removing from state", d.Id())
   152  		d.SetId("")
   153  		return fmt.Errorf("Error reading DNS SRV Record: %s", readResponse.Error)
   154  	}
   155  
   156  	resp := readResponse.Parsed.(*dns.GetSRVRecordSetResponse)
   157  
   158  	d.Set("name", resp.Name)
   159  	d.Set("resource_group_name", id.ResourceGroup)
   160  	d.Set("zone_name", id.Path["dnszones"])
   161  	d.Set("ttl", resp.TTL)
   162  
   163  	if err := d.Set("record", flattenAzureRmDnsSrvRecord(resp.SRVRecords)); err != nil {
   164  		log.Printf("[INFO] Error setting the Azure RM SRV Record State: %s", err)
   165  		return err
   166  	}
   167  
   168  	flattenAndSetTags(d, &resp.Tags)
   169  
   170  	return nil
   171  }
   172  
   173  func resourceArmDnsSrvRecordDelete(d *schema.ResourceData, meta interface{}) error {
   174  	client := meta.(*ArmClient)
   175  	rivieraClient := client.rivieraClient
   176  
   177  	deleteRequest := rivieraClient.NewRequestForURI(d.Id())
   178  	deleteRequest.Command = &dns.DeleteRecordSet{
   179  		RecordSetType: "SRV",
   180  	}
   181  
   182  	deleteResponse, err := deleteRequest.Execute()
   183  	if err != nil {
   184  		return fmt.Errorf("Error deleting DNS SRV Record: %s", err)
   185  	}
   186  	if !deleteResponse.IsSuccessful() {
   187  		return fmt.Errorf("Error deleting DNS SRV Record: %s", deleteResponse.Error)
   188  	}
   189  
   190  	return nil
   191  }
   192  
   193  func expandAzureRmDnsSrvRecord(d *schema.ResourceData) ([]dns.SRVRecord, error) {
   194  	config := d.Get("record").(*schema.Set).List()
   195  	records := make([]dns.SRVRecord, 0, len(config))
   196  
   197  	for _, pRaw := range config {
   198  		data := pRaw.(map[string]interface{})
   199  
   200  		srvRecord := dns.SRVRecord{
   201  			Priority: data["priority"].(int),
   202  			Weight:   data["weight"].(int),
   203  			Port:     data["port"].(int),
   204  			Target:   data["target"].(string),
   205  		}
   206  
   207  		records = append(records, srvRecord)
   208  
   209  	}
   210  
   211  	return records, nil
   212  
   213  }
   214  
   215  func flattenAzureRmDnsSrvRecord(records []dns.SRVRecord) []map[string]interface{} {
   216  
   217  	result := make([]map[string]interface{}, 0, len(records))
   218  	for _, record := range records {
   219  		result = append(result, map[string]interface{}{
   220  			"priority": record.Priority,
   221  			"weight":   record.Weight,
   222  			"port":     record.Port,
   223  			"target":   record.Target,
   224  		})
   225  	}
   226  	return result
   227  
   228  }
   229  
   230  func resourceArmDnsSrvRecordHash(v interface{}) int {
   231  	var buf bytes.Buffer
   232  	m := v.(map[string]interface{})
   233  	buf.WriteString(fmt.Sprintf("%d-", m["priority"].(int)))
   234  	buf.WriteString(fmt.Sprintf("%d-", m["weight"].(int)))
   235  	buf.WriteString(fmt.Sprintf("%d-", m["port"].(int)))
   236  	buf.WriteString(fmt.Sprintf("%s-", m["target"].(string)))
   237  
   238  	return hashcode.String(buf.String())
   239  }