github.com/ezbercih/terraform@v0.1.1-0.20140729011846-3c33865e0839/builtin/providers/heroku/resource_heroku_domain.go (about) 1 package heroku 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/bgentry/heroku-go" 8 "github.com/hashicorp/terraform/helper/config" 9 "github.com/hashicorp/terraform/helper/diff" 10 "github.com/hashicorp/terraform/terraform" 11 ) 12 13 func resource_heroku_domain_create( 14 s *terraform.ResourceState, 15 d *terraform.ResourceDiff, 16 meta interface{}) (*terraform.ResourceState, error) { 17 p := meta.(*ResourceProvider) 18 client := p.client 19 20 // Merge the diff into the state so that we have all the attributes 21 // properly. 22 rs := s.MergeDiff(d) 23 24 app := rs.Attributes["app"] 25 hostname := rs.Attributes["hostname"] 26 27 log.Printf("[DEBUG] Domain create configuration: %#v, %#v", app, hostname) 28 29 do, err := client.DomainCreate(app, hostname) 30 31 if err != nil { 32 return s, err 33 } 34 35 rs.ID = do.Id 36 rs.Attributes["hostname"] = do.Hostname 37 rs.Attributes["cname"] = fmt.Sprintf("%s.herokuapp.com", app) 38 39 log.Printf("[INFO] Domain ID: %s", rs.ID) 40 41 return rs, nil 42 } 43 44 func resource_heroku_domain_update( 45 s *terraform.ResourceState, 46 d *terraform.ResourceDiff, 47 meta interface{}) (*terraform.ResourceState, error) { 48 49 panic("Cannot update domain") 50 51 return nil, nil 52 } 53 54 func resource_heroku_domain_destroy( 55 s *terraform.ResourceState, 56 meta interface{}) error { 57 p := meta.(*ResourceProvider) 58 client := p.client 59 60 log.Printf("[INFO] Deleting Domain: %s", s.ID) 61 62 // Destroy the app 63 err := client.DomainDelete(s.Attributes["app"], s.ID) 64 65 if err != nil { 66 return fmt.Errorf("Error deleting domain: %s", err) 67 } 68 69 return nil 70 } 71 72 func resource_heroku_domain_refresh( 73 s *terraform.ResourceState, 74 meta interface{}) (*terraform.ResourceState, error) { 75 p := meta.(*ResourceProvider) 76 client := p.client 77 78 domain, err := resource_heroku_domain_retrieve(s.Attributes["app"], s.ID, client) 79 if err != nil { 80 return nil, err 81 } 82 83 s.Attributes["hostname"] = domain.Hostname 84 s.Attributes["cname"] = fmt.Sprintf("%s.herokuapp.com", s.Attributes["app"]) 85 86 return s, nil 87 } 88 89 func resource_heroku_domain_diff( 90 s *terraform.ResourceState, 91 c *terraform.ResourceConfig, 92 meta interface{}) (*terraform.ResourceDiff, error) { 93 94 b := &diff.ResourceBuilder{ 95 Attrs: map[string]diff.AttrType{ 96 "hostname": diff.AttrTypeCreate, 97 "app": diff.AttrTypeCreate, 98 }, 99 100 ComputedAttrs: []string{ 101 "cname", 102 }, 103 } 104 105 return b.Diff(s, c) 106 } 107 108 func resource_heroku_domain_retrieve(app string, id string, client *heroku.Client) (*heroku.Domain, error) { 109 domain, err := client.DomainInfo(app, id) 110 111 if err != nil { 112 return nil, fmt.Errorf("Error retrieving domain: %s", err) 113 } 114 115 return domain, nil 116 } 117 118 func resource_heroku_domain_validation() *config.Validator { 119 return &config.Validator{ 120 Required: []string{ 121 "hostname", 122 "app", 123 }, 124 Optional: []string{}, 125 } 126 }