github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/clc/resource_clc_load_balancer.go (about) 1 package clc 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 clc "github.com/CenturyLinkCloud/clc-sdk" 9 "github.com/CenturyLinkCloud/clc-sdk/lb" 10 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/helper/schema" 13 ) 14 15 func resourceCLCLoadBalancer() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceCLCLoadBalancerCreate, 18 Read: resourceCLCLoadBalancerRead, 19 Update: resourceCLCLoadBalancerUpdate, 20 Delete: resourceCLCLoadBalancerDelete, 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 }, 26 "data_center": &schema.Schema{ 27 Type: schema.TypeString, 28 Required: true, 29 }, 30 "description": &schema.Schema{ 31 Type: schema.TypeString, 32 Required: true, 33 }, 34 // optional 35 "status": &schema.Schema{ 36 Type: schema.TypeString, 37 Optional: true, 38 Default: "enabled", 39 }, 40 // computed 41 "ip_address": &schema.Schema{ 42 Type: schema.TypeString, 43 Computed: true, 44 }, 45 }, 46 } 47 } 48 49 func resourceCLCLoadBalancerCreate(d *schema.ResourceData, meta interface{}) error { 50 client := meta.(*clc.Client) 51 dc := d.Get("data_center").(string) 52 name := d.Get("name").(string) 53 desc := d.Get("description").(string) 54 status := d.Get("status").(string) 55 r1 := lb.LoadBalancer{ 56 Name: name, 57 Description: desc, 58 Status: status, 59 } 60 l, err := client.LB.Create(dc, r1) 61 if err != nil { 62 return fmt.Errorf("Failed creating load balancer under %v/%v: %v", dc, name, err) 63 } 64 d.SetId(l.ID) 65 return resource.Retry(1*time.Minute, func() *resource.RetryError { 66 _, err := client.LB.Get(dc, l.ID) 67 if err != nil { 68 return resource.RetryableError(err) 69 } 70 err = resourceCLCLoadBalancerRead(d, meta) 71 if err != nil { 72 return resource.NonRetryableError(err) 73 } 74 return nil 75 }) 76 } 77 78 func resourceCLCLoadBalancerRead(d *schema.ResourceData, meta interface{}) error { 79 client := meta.(*clc.Client) 80 dc := d.Get("data_center").(string) 81 id := d.Id() 82 resp, err := client.LB.Get(dc, id) 83 if err != nil { 84 log.Printf("[INFO] Failed finding load balancer %v/%v. Marking destroyed", dc, id) 85 d.SetId("") 86 return nil 87 } 88 d.Set("description", resp.Description) 89 d.Set("ip_address", resp.IPaddress) 90 d.Set("status", resp.Status) 91 d.Set("pools", resp.Pools) 92 d.Set("links", resp.Links) 93 return nil 94 } 95 96 func resourceCLCLoadBalancerUpdate(d *schema.ResourceData, meta interface{}) error { 97 update := lb.LoadBalancer{} 98 client := meta.(*clc.Client) 99 dc := d.Get("data_center").(string) 100 id := d.Id() 101 102 if d.HasChange("name") { 103 update.Name = d.Get("name").(string) 104 } 105 if d.HasChange("description") { 106 update.Description = d.Get("description").(string) 107 } 108 if d.HasChange("status") { 109 update.Status = d.Get("status").(string) 110 } 111 if update.Name != "" || update.Description != "" || update.Status != "" { 112 update.Name = d.Get("name").(string) // required on every PUT 113 err := client.LB.Update(dc, id, update) 114 if err != nil { 115 return fmt.Errorf("Failed updating load balancer under %v/%v: %v", dc, id, err) 116 } 117 } 118 return resourceCLCLoadBalancerRead(d, meta) 119 } 120 121 func resourceCLCLoadBalancerDelete(d *schema.ResourceData, meta interface{}) error { 122 client := meta.(*clc.Client) 123 dc := d.Get("data_center").(string) 124 id := d.Id() 125 err := client.LB.Delete(dc, id) 126 if err != nil { 127 return fmt.Errorf("Failed deleting loadbalancer %v: %v", id, err) 128 } 129 return nil 130 }