github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/builtin/providers/aws/resource_aws_route53_zone.go (about)

     1  package aws
     2  
     3  import (
     4  	"log"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  
    11  	"github.com/hashicorp/aws-sdk-go/aws"
    12  	"github.com/hashicorp/aws-sdk-go/gen/route53"
    13  )
    14  
    15  func resourceAwsRoute53Zone() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceAwsRoute53ZoneCreate,
    18  		Read:   resourceAwsRoute53ZoneRead,
    19  		Delete: resourceAwsRoute53ZoneDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  
    28  			"zone_id": &schema.Schema{
    29  				Type:     schema.TypeString,
    30  				Computed: true,
    31  			},
    32  		},
    33  	}
    34  }
    35  
    36  func resourceAwsRoute53ZoneCreate(d *schema.ResourceData, meta interface{}) error {
    37  	r53 := meta.(*AWSClient).r53conn
    38  
    39  	comment := &route53.HostedZoneConfig{Comment: aws.String("Managed by Terraform")}
    40  	req := &route53.CreateHostedZoneRequest{
    41  		Name:             aws.String(d.Get("name").(string)),
    42  		HostedZoneConfig: comment,
    43  		CallerReference:  aws.String(time.Now().Format(time.RFC3339Nano)),
    44  	}
    45  
    46  	log.Printf("[DEBUG] Creating Route53 hosted zone: %s", *req.Name)
    47  	resp, err := r53.CreateHostedZone(req)
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	// Store the zone_id
    53  	zone := cleanZoneID(*resp.HostedZone.ID)
    54  	d.Set("zone_id", zone)
    55  	d.SetId(zone)
    56  
    57  	// Wait until we are done initializing
    58  	wait := resource.StateChangeConf{
    59  		Delay:      30 * time.Second,
    60  		Pending:    []string{"PENDING"},
    61  		Target:     "INSYNC",
    62  		Timeout:    10 * time.Minute,
    63  		MinTimeout: 2 * time.Second,
    64  		Refresh: func() (result interface{}, state string, err error) {
    65  			changeRequest := &route53.GetChangeRequest{
    66  				ID: aws.String(cleanChangeID(*resp.ChangeInfo.ID)),
    67  			}
    68  			return resourceAwsGoRoute53Wait(r53, changeRequest)
    69  		},
    70  	}
    71  	_, err = wait.WaitForState()
    72  	if err != nil {
    73  		return err
    74  	}
    75  	return nil
    76  }
    77  
    78  func resourceAwsRoute53ZoneRead(d *schema.ResourceData, meta interface{}) error {
    79  	r53 := meta.(*AWSClient).r53conn
    80  	_, err := r53.GetHostedZone(&route53.GetHostedZoneRequest{ID: aws.String(d.Id())})
    81  	if err != nil {
    82  		// Handle a deleted zone
    83  		if strings.Contains(err.Error(), "404") {
    84  			d.SetId("")
    85  			return nil
    86  		}
    87  		return err
    88  	}
    89  
    90  	return nil
    91  }
    92  
    93  func resourceAwsRoute53ZoneDelete(d *schema.ResourceData, meta interface{}) error {
    94  	r53 := meta.(*AWSClient).r53conn
    95  
    96  	log.Printf("[DEBUG] Deleting Route53 hosted zone: %s (ID: %s)",
    97  		d.Get("name").(string), d.Id())
    98  	_, err := r53.DeleteHostedZone(&route53.DeleteHostedZoneRequest{ID: aws.String(d.Id())})
    99  	if err != nil {
   100  		return err
   101  	}
   102  
   103  	return nil
   104  }
   105  
   106  func resourceAwsGoRoute53Wait(r53 *route53.Route53, ref *route53.GetChangeRequest) (result interface{}, state string, err error) {
   107  
   108  	status, err := r53.GetChange(ref)
   109  	if err != nil {
   110  		return nil, "UNKNOWN", err
   111  	}
   112  	return true, *status.ChangeInfo.Status, nil
   113  }
   114  
   115  // cleanChangeID is used to remove the leading /change/
   116  func cleanChangeID(ID string) string {
   117  	return cleanPrefix(ID, "/change/")
   118  }
   119  
   120  // cleanZoneID is used to remove the leading /hostedzone/
   121  func cleanZoneID(ID string) string {
   122  	return cleanPrefix(ID, "/hostedzone/")
   123  }
   124  
   125  // cleanPrefix removes a string prefix from an ID
   126  func cleanPrefix(ID, prefix string) string {
   127  	if strings.HasPrefix(ID, prefix) {
   128  		ID = strings.TrimPrefix(ID, prefix)
   129  	}
   130  	return ID
   131  }