github.com/minamijoyo/terraform@v0.7.8-0.20161029001309-18b3736ba44b/builtin/providers/ultradns/resource_ultradns_record.go (about)

     1  package ultradns
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"github.com/Ensighten/udnssdk"
    10  	"github.com/hashicorp/terraform/helper/schema"
    11  )
    12  
    13  type rRSetResource struct {
    14  	OwnerName string
    15  	RRType    string
    16  	RData     []string
    17  	TTL       int
    18  	Profile   *udnssdk.StringProfile
    19  	Zone      string
    20  }
    21  
    22  func newRRSetResource(d *schema.ResourceData) (rRSetResource, error) {
    23  	r := rRSetResource{}
    24  
    25  	if attr, ok := d.GetOk("name"); ok {
    26  		r.OwnerName = attr.(string)
    27  	}
    28  
    29  	if attr, ok := d.GetOk("type"); ok {
    30  		r.RRType = attr.(string)
    31  	}
    32  
    33  	if attr, ok := d.GetOk("zone"); ok {
    34  		r.Zone = attr.(string)
    35  	}
    36  
    37  	if attr, ok := d.GetOk("rdata"); ok {
    38  		rdata := attr.([]interface{})
    39  		r.RData = make([]string, len(rdata))
    40  		for i, j := range rdata {
    41  			r.RData[i] = j.(string)
    42  		}
    43  	}
    44  
    45  	if attr, ok := d.GetOk("ttl"); ok {
    46  		r.TTL, _ = strconv.Atoi(attr.(string))
    47  	}
    48  
    49  	return r, nil
    50  }
    51  
    52  func (r rRSetResource) RRSetKey() udnssdk.RRSetKey {
    53  	return udnssdk.RRSetKey{
    54  		Zone: r.Zone,
    55  		Type: r.RRType,
    56  		Name: r.OwnerName,
    57  	}
    58  }
    59  
    60  func (r rRSetResource) RRSet() udnssdk.RRSet {
    61  	return udnssdk.RRSet{
    62  		OwnerName: r.OwnerName,
    63  		RRType:    r.RRType,
    64  		RData:     r.RData,
    65  		TTL:       r.TTL,
    66  	}
    67  }
    68  
    69  func (r rRSetResource) ID() string {
    70  	return fmt.Sprintf("%s.%s", r.OwnerName, r.Zone)
    71  }
    72  
    73  func populateResourceDataFromRRSet(r udnssdk.RRSet, d *schema.ResourceData) error {
    74  	zone := d.Get("zone")
    75  	// ttl
    76  	d.Set("ttl", r.TTL)
    77  	// rdata
    78  	err := d.Set("rdata", r.RData)
    79  	if err != nil {
    80  		return fmt.Errorf("ultradns_record.rdata set failed: %#v", err)
    81  	}
    82  	// hostname
    83  	if r.OwnerName == "" {
    84  		d.Set("hostname", zone)
    85  	} else {
    86  		if strings.HasSuffix(r.OwnerName, ".") {
    87  			d.Set("hostname", r.OwnerName)
    88  		} else {
    89  			d.Set("hostname", fmt.Sprintf("%s.%s", r.OwnerName, zone))
    90  		}
    91  	}
    92  	return nil
    93  }
    94  
    95  func resourceUltraDNSRecord() *schema.Resource {
    96  	return &schema.Resource{
    97  		Create: resourceUltraDNSRecordCreate,
    98  		Read:   resourceUltraDNSRecordRead,
    99  		Update: resourceUltraDNSRecordUpdate,
   100  		Delete: resourceUltraDNSRecordDelete,
   101  
   102  		Schema: map[string]*schema.Schema{
   103  			// Required
   104  			"zone": &schema.Schema{
   105  				Type:     schema.TypeString,
   106  				Required: true,
   107  				ForceNew: true,
   108  			},
   109  			"name": &schema.Schema{
   110  				Type:     schema.TypeString,
   111  				Required: true,
   112  				ForceNew: true,
   113  			},
   114  			"type": &schema.Schema{
   115  				Type:     schema.TypeString,
   116  				Required: true,
   117  				ForceNew: true,
   118  			},
   119  			"rdata": &schema.Schema{
   120  				Type:     schema.TypeList,
   121  				Required: true,
   122  				Elem:     &schema.Schema{Type: schema.TypeString},
   123  			},
   124  			// Optional
   125  			"ttl": &schema.Schema{
   126  				Type:     schema.TypeString,
   127  				Optional: true,
   128  				Default:  "3600",
   129  			},
   130  			// Computed
   131  			"hostname": &schema.Schema{
   132  				Type:     schema.TypeString,
   133  				Computed: true,
   134  			},
   135  		},
   136  	}
   137  }
   138  
   139  func resourceUltraDNSRecordCreate(d *schema.ResourceData, meta interface{}) error {
   140  	client := meta.(*udnssdk.Client)
   141  
   142  	r, err := newRRSetResource(d)
   143  	if err != nil {
   144  		return err
   145  	}
   146  
   147  	log.Printf("[INFO] ultradns_record create: %#v", r.RRSet())
   148  	_, err = client.RRSets.Create(r.RRSetKey(), r.RRSet())
   149  	if err != nil {
   150  		return fmt.Errorf("Failed to create UltraDNS RRSet: %s", err)
   151  	}
   152  
   153  	d.SetId(r.ID())
   154  	log.Printf("[INFO] ultradns_record.id: %s", d.Id())
   155  
   156  	return resourceUltraDNSRecordRead(d, meta)
   157  }
   158  
   159  func resourceUltraDNSRecordRead(d *schema.ResourceData, meta interface{}) error {
   160  	client := meta.(*udnssdk.Client)
   161  
   162  	r, err := newRRSetResource(d)
   163  	if err != nil {
   164  		return err
   165  	}
   166  
   167  	rrsets, err := client.RRSets.Select(r.RRSetKey())
   168  	if err != nil {
   169  		uderr, ok := err.(*udnssdk.ErrorResponseList)
   170  		if ok {
   171  			for _, r := range uderr.Responses {
   172  				// 70002 means Records Not Found
   173  				if r.ErrorCode == 70002 {
   174  					d.SetId("")
   175  					return nil
   176  				}
   177  				return fmt.Errorf("ultradns_record not found: %s", err)
   178  			}
   179  		}
   180  		return fmt.Errorf("ultradns_record not found: %s", err)
   181  	}
   182  	rec := rrsets[0]
   183  	return populateResourceDataFromRRSet(rec, d)
   184  }
   185  
   186  func resourceUltraDNSRecordUpdate(d *schema.ResourceData, meta interface{}) error {
   187  	client := meta.(*udnssdk.Client)
   188  
   189  	r, err := newRRSetResource(d)
   190  	if err != nil {
   191  		return err
   192  	}
   193  
   194  	log.Printf("[INFO] ultradns_record update: %#v", r.RRSet())
   195  	_, err = client.RRSets.Update(r.RRSetKey(), r.RRSet())
   196  	if err != nil {
   197  		return fmt.Errorf("ultradns_record update failed: %s", err)
   198  	}
   199  
   200  	return resourceUltraDNSRecordRead(d, meta)
   201  }
   202  
   203  func resourceUltraDNSRecordDelete(d *schema.ResourceData, meta interface{}) error {
   204  	client := meta.(*udnssdk.Client)
   205  
   206  	r, err := newRRSetResource(d)
   207  	if err != nil {
   208  		return err
   209  	}
   210  
   211  	log.Printf("[INFO] ultradns_record delete: %#v", r.RRSet())
   212  	_, err = client.RRSets.Delete(r.RRSetKey())
   213  	if err != nil {
   214  		return fmt.Errorf("ultradns_record delete failed: %s", err)
   215  	}
   216  
   217  	return nil
   218  }