github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/azurerm/resource_arm_dns_a_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 resourceArmDnsARecord() *schema.Resource {
    12  	return &schema.Resource{
    13  		Create: resourceArmDnsARecordCreate,
    14  		Read:   resourceArmDnsARecordRead,
    15  		Update: resourceArmDnsARecordCreate,
    16  		Delete: resourceArmDnsARecordDelete,
    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  			"records": &schema.Schema{
    40  				Type:     schema.TypeSet,
    41  				Required: true,
    42  				Elem:     &schema.Schema{Type: schema.TypeString},
    43  				Set:      schema.HashString,
    44  			},
    45  
    46  			"ttl": &schema.Schema{
    47  				Type:     schema.TypeInt,
    48  				Required: true,
    49  			},
    50  
    51  			"tags": tagsSchema(),
    52  		},
    53  	}
    54  }
    55  
    56  func resourceArmDnsARecordCreate(d *schema.ResourceData, meta interface{}) error {
    57  	client := meta.(*ArmClient)
    58  	rivieraClient := client.rivieraClient
    59  
    60  	tags := d.Get("tags").(map[string]interface{})
    61  	expandedTags := expandTags(tags)
    62  
    63  	createCommand := &dns.CreateARecordSet{
    64  		Name:              d.Get("name").(string),
    65  		Location:          "global",
    66  		ResourceGroupName: d.Get("resource_group_name").(string),
    67  		ZoneName:          d.Get("zone_name").(string),
    68  		TTL:               d.Get("ttl").(int),
    69  		Tags:              *expandedTags,
    70  	}
    71  
    72  	recordStrings := d.Get("records").(*schema.Set).List()
    73  	records := make([]dns.ARecord, len(recordStrings))
    74  	for i, v := range recordStrings {
    75  		records[i] = dns.ARecord{
    76  			IPv4Address: v.(string),
    77  		}
    78  	}
    79  	createCommand.ARecords = records
    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 A Record: %s", err)
    87  	}
    88  	if !createResponse.IsSuccessful() {
    89  		return fmt.Errorf("Error creating DNS A Record: %s", createResponse.Error)
    90  	}
    91  
    92  	readRequest := rivieraClient.NewRequest()
    93  	readRequest.Command = &dns.GetARecordSet{
    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 A Record: %s", err)
   102  	}
   103  	if !readResponse.IsSuccessful() {
   104  		return fmt.Errorf("Error reading DNS A Record: %s", readResponse.Error)
   105  	}
   106  
   107  	resp := readResponse.Parsed.(*dns.GetARecordSetResponse)
   108  	d.SetId(resp.ID)
   109  
   110  	return resourceArmDnsARecordRead(d, meta)
   111  }
   112  
   113  func resourceArmDnsARecordRead(d *schema.ResourceData, meta interface{}) error {
   114  	client := meta.(*ArmClient)
   115  	rivieraClient := client.rivieraClient
   116  
   117  	id, err := parseAzureResourceID(d.Id())
   118  	if err != nil {
   119  		return err
   120  	}
   121  
   122  	readRequest := rivieraClient.NewRequestForURI(d.Id())
   123  	readRequest.Command = &dns.GetARecordSet{}
   124  
   125  	readResponse, err := readRequest.Execute()
   126  	if err != nil {
   127  		return fmt.Errorf("Error reading DNS A Record: %s", err)
   128  	}
   129  	if !readResponse.IsSuccessful() {
   130  		log.Printf("[INFO] Error reading DNS A Record %q - removing from state", d.Id())
   131  		d.SetId("")
   132  		return fmt.Errorf("Error reading DNS A Record: %s", readResponse.Error)
   133  	}
   134  
   135  	resp := readResponse.Parsed.(*dns.GetARecordSetResponse)
   136  
   137  	d.Set("name", resp.Name)
   138  	d.Set("resource_group_name", id.ResourceGroup)
   139  	d.Set("zone_name", id.Path["dnszones"])
   140  	d.Set("ttl", resp.TTL)
   141  
   142  	if resp.ARecords != nil {
   143  		records := make([]string, 0, len(resp.ARecords))
   144  		for _, record := range resp.ARecords {
   145  			records = append(records, record.IPv4Address)
   146  		}
   147  
   148  		if err := d.Set("records", records); err != nil {
   149  			return err
   150  		}
   151  	}
   152  
   153  	flattenAndSetTags(d, &resp.Tags)
   154  
   155  	return nil
   156  }
   157  
   158  func resourceArmDnsARecordDelete(d *schema.ResourceData, meta interface{}) error {
   159  	client := meta.(*ArmClient)
   160  	rivieraClient := client.rivieraClient
   161  
   162  	deleteRequest := rivieraClient.NewRequestForURI(d.Id())
   163  	deleteRequest.Command = &dns.DeleteRecordSet{
   164  		RecordSetType: "A",
   165  	}
   166  
   167  	deleteResponse, err := deleteRequest.Execute()
   168  	if err != nil {
   169  		return fmt.Errorf("Error deleting DNS A Record: %s", err)
   170  	}
   171  	if !deleteResponse.IsSuccessful() {
   172  		return fmt.Errorf("Error deleting DNS A Record: %s", deleteResponse.Error)
   173  	}
   174  
   175  	return nil
   176  }