github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/azurerm/resource_arm_dns_mx_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 resourceArmDnsMxRecord() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceArmDnsMxRecordCreate,
    16  		Read:   resourceArmDnsMxRecordRead,
    17  		Update: resourceArmDnsMxRecordCreate,
    18  		Delete: resourceArmDnsMxRecordDelete,
    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  						"preference": &schema.Schema{
    47  							Type:     schema.TypeString,
    48  							Required: true,
    49  						},
    50  
    51  						"exchange": &schema.Schema{
    52  							Type:     schema.TypeString,
    53  							Required: true,
    54  						},
    55  					},
    56  				},
    57  				Set: resourceArmDnsMxRecordHash,
    58  			},
    59  
    60  			"ttl": &schema.Schema{
    61  				Type:     schema.TypeInt,
    62  				Required: true,
    63  			},
    64  
    65  			"tags": tagsSchema(),
    66  		},
    67  	}
    68  }
    69  
    70  func resourceArmDnsMxRecordCreate(d *schema.ResourceData, meta interface{}) error {
    71  	client := meta.(*ArmClient)
    72  	rivieraClient := client.rivieraClient
    73  
    74  	tags := d.Get("tags").(map[string]interface{})
    75  	expandedTags := expandTags(tags)
    76  
    77  	createCommand := &dns.CreateMXRecordSet{
    78  		Name:              d.Get("name").(string),
    79  		Location:          "global",
    80  		ResourceGroupName: d.Get("resource_group_name").(string),
    81  		ZoneName:          d.Get("zone_name").(string),
    82  		TTL:               d.Get("ttl").(int),
    83  		Tags:              *expandedTags,
    84  	}
    85  
    86  	mxRecords, recordErr := expandAzureRmDnsMxRecord(d)
    87  	if recordErr != nil {
    88  		return fmt.Errorf("Error Building Azure RM MX Record: %s", recordErr)
    89  	}
    90  	createCommand.MXRecords = mxRecords
    91  
    92  	createRequest := rivieraClient.NewRequest()
    93  	createRequest.Command = createCommand
    94  
    95  	createResponse, err := createRequest.Execute()
    96  	if err != nil {
    97  		return fmt.Errorf("Error creating DNS MX Record: %s", err)
    98  	}
    99  	if !createResponse.IsSuccessful() {
   100  		return fmt.Errorf("Error creating DNS MX Record: %s", createResponse.Error)
   101  	}
   102  
   103  	readRequest := rivieraClient.NewRequest()
   104  	readRequest.Command = &dns.GetMXRecordSet{
   105  		Name:              d.Get("name").(string),
   106  		ResourceGroupName: d.Get("resource_group_name").(string),
   107  		ZoneName:          d.Get("zone_name").(string),
   108  	}
   109  
   110  	readResponse, err := readRequest.Execute()
   111  	if err != nil {
   112  		return fmt.Errorf("Error reading DNS MX Record: %s", err)
   113  	}
   114  	if !readResponse.IsSuccessful() {
   115  		return fmt.Errorf("Error reading DNS MX Record: %s", readResponse.Error)
   116  	}
   117  
   118  	resp := readResponse.Parsed.(*dns.GetMXRecordSetResponse)
   119  	d.SetId(resp.ID)
   120  
   121  	return resourceArmDnsMxRecordRead(d, meta)
   122  }
   123  
   124  func resourceArmDnsMxRecordRead(d *schema.ResourceData, meta interface{}) error {
   125  	client := meta.(*ArmClient)
   126  	rivieraClient := client.rivieraClient
   127  
   128  	id, err := parseAzureResourceID(d.Id())
   129  	if err != nil {
   130  		return err
   131  	}
   132  
   133  	readRequest := rivieraClient.NewRequestForURI(d.Id())
   134  	readRequest.Command = &dns.GetMXRecordSet{}
   135  
   136  	readResponse, err := readRequest.Execute()
   137  	if err != nil {
   138  		return fmt.Errorf("Error reading DNS MX Record: %s", err)
   139  	}
   140  	if !readResponse.IsSuccessful() {
   141  		log.Printf("[INFO] Error reading DNS MX Record %q - removing from state", d.Id())
   142  		d.SetId("")
   143  		return fmt.Errorf("Error reading DNS MX Record: %s", readResponse.Error)
   144  	}
   145  
   146  	resp := readResponse.Parsed.(*dns.GetMXRecordSetResponse)
   147  
   148  	d.Set("name", resp.Name)
   149  	d.Set("resource_group_name", id.ResourceGroup)
   150  	d.Set("zone_name", id.Path["dnszones"])
   151  	d.Set("ttl", resp.TTL)
   152  
   153  	if err := d.Set("record", flattenAzureRmDnsMxRecord(resp.MXRecords)); err != nil {
   154  		log.Printf("[INFO] Error setting the Azure RM MX Record State: %s", err)
   155  		return err
   156  	}
   157  
   158  	flattenAndSetTags(d, &resp.Tags)
   159  
   160  	return nil
   161  }
   162  
   163  func resourceArmDnsMxRecordDelete(d *schema.ResourceData, meta interface{}) error {
   164  	client := meta.(*ArmClient)
   165  	rivieraClient := client.rivieraClient
   166  
   167  	deleteRequest := rivieraClient.NewRequestForURI(d.Id())
   168  	deleteRequest.Command = &dns.DeleteRecordSet{
   169  		RecordSetType: "MX",
   170  	}
   171  
   172  	deleteResponse, err := deleteRequest.Execute()
   173  	if err != nil {
   174  		return fmt.Errorf("Error deleting DNS MX Record: %s", err)
   175  	}
   176  	if !deleteResponse.IsSuccessful() {
   177  		return fmt.Errorf("Error deleting DNS MX Record: %s", deleteResponse.Error)
   178  	}
   179  
   180  	return nil
   181  }
   182  
   183  func expandAzureRmDnsMxRecord(d *schema.ResourceData) ([]dns.MXRecord, error) {
   184  	config := d.Get("record").(*schema.Set).List()
   185  	records := make([]dns.MXRecord, 0, len(config))
   186  
   187  	for _, pRaw := range config {
   188  		data := pRaw.(map[string]interface{})
   189  
   190  		mxrecord := dns.MXRecord{
   191  			Preference: data["preference"].(string),
   192  			Exchange:   data["exchange"].(string),
   193  		}
   194  
   195  		records = append(records, mxrecord)
   196  
   197  	}
   198  
   199  	return records, nil
   200  
   201  }
   202  
   203  func flattenAzureRmDnsMxRecord(records []dns.MXRecord) []map[string]interface{} {
   204  
   205  	result := make([]map[string]interface{}, 0, len(records))
   206  	for _, record := range records {
   207  		result = append(result, map[string]interface{}{
   208  			"preference": record.Preference,
   209  			"exchange":   record.Exchange,
   210  		})
   211  	}
   212  	return result
   213  
   214  }
   215  
   216  func resourceArmDnsMxRecordHash(v interface{}) int {
   217  	var buf bytes.Buffer
   218  	m := v.(map[string]interface{})
   219  	buf.WriteString(fmt.Sprintf("%s-", m["preference"].(string)))
   220  	buf.WriteString(fmt.Sprintf("%s-", m["exchange"].(string)))
   221  
   222  	return hashcode.String(buf.String())
   223  }