github.com/bengesoff/terraform@v0.3.1-0.20141018223233-b25a53629922/builtin/providers/cloudflare/resource_cloudflare_record.go (about) 1 package cloudflare 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/config" 8 "github.com/hashicorp/terraform/helper/diff" 9 "github.com/hashicorp/terraform/terraform" 10 "github.com/pearkes/cloudflare" 11 ) 12 13 func resource_cloudflare_record_create( 14 s *terraform.InstanceState, 15 d *terraform.InstanceDiff, 16 meta interface{}) (*terraform.InstanceState, 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 var err error 25 26 newRecord := cloudflare.CreateRecord{ 27 Name: rs.Attributes["name"], 28 Priority: rs.Attributes["priority"], 29 Type: rs.Attributes["type"], 30 Content: rs.Attributes["value"], 31 Ttl: rs.Attributes["ttl"], 32 } 33 34 log.Printf("[DEBUG] record create configuration: %#v", newRecord) 35 36 rec, err := client.CreateRecord(rs.Attributes["domain"], &newRecord) 37 38 if err != nil { 39 return nil, fmt.Errorf("Failed to create record: %s", err) 40 } 41 42 rs.ID = rec.Id 43 log.Printf("[INFO] record ID: %s", rs.ID) 44 45 record, err := resource_cloudflare_record_retrieve(rs.Attributes["domain"], rs.ID, client) 46 if err != nil { 47 return nil, fmt.Errorf("Couldn't find record: %s", err) 48 } 49 50 return resource_cloudflare_record_update_state(rs, record) 51 } 52 53 func resource_cloudflare_record_update( 54 s *terraform.InstanceState, 55 d *terraform.InstanceDiff, 56 meta interface{}) (*terraform.InstanceState, error) { 57 p := meta.(*ResourceProvider) 58 client := p.client 59 rs := s.MergeDiff(d) 60 61 // Cloudflare requires we send all values 62 // for an update request, so we just 63 // merge out diff and send the current 64 // state of affairs to them 65 updateRecord := cloudflare.UpdateRecord{ 66 Name: rs.Attributes["name"], 67 Content: rs.Attributes["value"], 68 Type: rs.Attributes["type"], 69 Ttl: rs.Attributes["ttl"], 70 Priority: rs.Attributes["priority"], 71 } 72 73 log.Printf("[DEBUG] record update configuration: %#v", updateRecord) 74 75 err := client.UpdateRecord(rs.Attributes["domain"], rs.ID, &updateRecord) 76 if err != nil { 77 return rs, fmt.Errorf("Failed to update record: %s", err) 78 } 79 80 record, err := resource_cloudflare_record_retrieve(rs.Attributes["domain"], rs.ID, client) 81 if err != nil { 82 return rs, fmt.Errorf("Couldn't find record: %s", err) 83 } 84 85 return resource_cloudflare_record_update_state(rs, record) 86 } 87 88 func resource_cloudflare_record_destroy( 89 s *terraform.InstanceState, 90 meta interface{}) error { 91 p := meta.(*ResourceProvider) 92 client := p.client 93 94 log.Printf("[INFO] Deleting record: %s, %s", s.Attributes["domain"], s.ID) 95 96 err := client.DestroyRecord(s.Attributes["domain"], s.ID) 97 98 if err != nil { 99 return fmt.Errorf("Error deleting record: %s", err) 100 } 101 102 return nil 103 } 104 105 func resource_cloudflare_record_refresh( 106 s *terraform.InstanceState, 107 meta interface{}) (*terraform.InstanceState, error) { 108 p := meta.(*ResourceProvider) 109 client := p.client 110 111 rec, err := resource_cloudflare_record_retrieve(s.Attributes["domain"], s.ID, client) 112 if err != nil { 113 return nil, err 114 } 115 116 return resource_cloudflare_record_update_state(s, rec) 117 } 118 119 func resource_cloudflare_record_diff( 120 s *terraform.InstanceState, 121 c *terraform.ResourceConfig, 122 meta interface{}) (*terraform.InstanceDiff, error) { 123 124 b := &diff.ResourceBuilder{ 125 Attrs: map[string]diff.AttrType{ 126 "domain": diff.AttrTypeCreate, 127 "name": diff.AttrTypeUpdate, 128 "value": diff.AttrTypeUpdate, 129 "ttl": diff.AttrTypeUpdate, 130 "type": diff.AttrTypeUpdate, 131 "priority": diff.AttrTypeUpdate, 132 }, 133 134 ComputedAttrs: []string{ 135 "priority", 136 "ttl", 137 "hostname", 138 }, 139 140 ComputedAttrsUpdate: []string{}, 141 } 142 143 return b.Diff(s, c) 144 } 145 146 func resource_cloudflare_record_update_state( 147 s *terraform.InstanceState, 148 rec *cloudflare.Record) (*terraform.InstanceState, error) { 149 150 s.Attributes["name"] = rec.Name 151 s.Attributes["value"] = rec.Value 152 s.Attributes["type"] = rec.Type 153 s.Attributes["ttl"] = rec.Ttl 154 s.Attributes["priority"] = rec.Priority 155 s.Attributes["hostname"] = rec.FullName 156 157 return s, nil 158 } 159 160 func resource_cloudflare_record_retrieve(domain string, id string, client *cloudflare.Client) (*cloudflare.Record, error) { 161 record, err := client.RetrieveRecord(domain, id) 162 if err != nil { 163 return nil, err 164 } 165 166 return record, nil 167 } 168 169 func resource_cloudflare_record_validation() *config.Validator { 170 return &config.Validator{ 171 Required: []string{ 172 "domain", 173 "name", 174 "value", 175 "type", 176 }, 177 Optional: []string{ 178 "ttl", 179 "priority", 180 }, 181 } 182 }