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 }