github.com/bengesoff/terraform@v0.3.1-0.20141018223233-b25a53629922/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/config" 9 "github.com/hashicorp/terraform/helper/diff" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 "github.com/mitchellh/goamz/route53" 13 ) 14 15 func resource_aws_r53_zone_validation() *config.Validator { 16 return &config.Validator{ 17 Required: []string{ 18 "name", 19 }, 20 } 21 } 22 23 func resource_aws_r53_zone_create( 24 s *terraform.InstanceState, 25 d *terraform.InstanceDiff, 26 meta interface{}) (*terraform.InstanceState, error) { 27 p := meta.(*ResourceProvider) 28 r53 := p.route53 29 30 // Merge the diff into the state so that we have all the attributes 31 // properly. 32 rs := s.MergeDiff(d) 33 34 req := &route53.CreateHostedZoneRequest{ 35 Name: rs.Attributes["name"], 36 Comment: "Managed by Terraform", 37 } 38 log.Printf("[DEBUG] Creating Route53 hosted zone: %s", req.Name) 39 resp, err := r53.CreateHostedZone(req) 40 if err != nil { 41 return rs, err 42 } 43 44 // Store the zone_id 45 zone := route53.CleanZoneID(resp.HostedZone.ID) 46 rs.ID = zone 47 rs.Attributes["zone_id"] = zone 48 49 // Wait until we are done initializing 50 wait := resource.StateChangeConf{ 51 Delay: 30 * time.Second, 52 Pending: []string{"PENDING"}, 53 Target: "INSYNC", 54 Timeout: 10 * time.Minute, 55 MinTimeout: 5 * time.Second, 56 Refresh: func() (result interface{}, state string, err error) { 57 return resource_aws_r53_wait(r53, resp.ChangeInfo.ID) 58 }, 59 } 60 _, err = wait.WaitForState() 61 if err != nil { 62 return rs, err 63 } 64 return rs, nil 65 } 66 67 // resource_aws_r53_wait checks the status of a change 68 func resource_aws_r53_wait(r53 *route53.Route53, ref string) (result interface{}, state string, err error) { 69 status, err := r53.GetChange(ref) 70 if err != nil { 71 return nil, "UNKNOWN", err 72 } 73 return true, status, nil 74 } 75 76 func resource_aws_r53_zone_destroy( 77 s *terraform.InstanceState, 78 meta interface{}) error { 79 p := meta.(*ResourceProvider) 80 r53 := p.route53 81 82 log.Printf("[DEBUG] Deleting Route53 hosted zone: %s (ID: %s)", 83 s.Attributes["name"], s.Attributes["zone_id"]) 84 _, err := r53.DeleteHostedZone(s.Attributes["zone_id"]) 85 if err != nil { 86 return err 87 } 88 return nil 89 } 90 91 func resource_aws_r53_zone_refresh( 92 s *terraform.InstanceState, 93 meta interface{}) (*terraform.InstanceState, error) { 94 p := meta.(*ResourceProvider) 95 r53 := p.route53 96 97 _, err := r53.GetHostedZone(s.Attributes["zone_id"]) 98 if err != nil { 99 // Handle a deleted zone 100 if strings.Contains(err.Error(), "404") { 101 s.ID = "" 102 return s, nil 103 } 104 return s, err 105 } 106 return s, nil 107 } 108 109 func resource_aws_r53_zone_diff( 110 s *terraform.InstanceState, 111 c *terraform.ResourceConfig, 112 meta interface{}) (*terraform.InstanceDiff, error) { 113 114 b := &diff.ResourceBuilder{ 115 Attrs: map[string]diff.AttrType{ 116 "name": diff.AttrTypeCreate, 117 }, 118 119 ComputedAttrs: []string{ 120 "zone_id", 121 }, 122 } 123 return b.Diff(s, c) 124 }