github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/clc/resource_clc_group.go (about) 1 package clc 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/CenturyLinkCloud/clc-sdk" 9 "github.com/CenturyLinkCloud/clc-sdk/api" 10 "github.com/CenturyLinkCloud/clc-sdk/group" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/helper/schema" 13 ) 14 15 func resourceCLCGroup() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceCLCGroupCreate, 18 Read: resourceCLCGroupRead, 19 Update: resourceCLCGroupUpdate, 20 Delete: resourceCLCGroupDelete, 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 }, 26 "description": &schema.Schema{ 27 Type: schema.TypeString, 28 Optional: true, 29 Default: "", 30 }, 31 "parent": &schema.Schema{ 32 Type: schema.TypeString, 33 Required: true, 34 }, 35 "location_id": &schema.Schema{ 36 Type: schema.TypeString, 37 Required: true, 38 }, 39 "parent_group_id": &schema.Schema{ 40 Type: schema.TypeString, 41 Computed: true, 42 }, 43 "custom_fields": &schema.Schema{ 44 Type: schema.TypeList, 45 Optional: true, 46 Elem: &schema.Schema{Type: schema.TypeMap}, 47 }, 48 }, 49 } 50 } 51 52 func resourceCLCGroupCreate(d *schema.ResourceData, meta interface{}) error { 53 client := meta.(*clc.Client) 54 name := d.Get("name").(string) 55 desc := d.Get("description").(string) 56 parent := d.Get("parent").(string) 57 dc := d.Get("location_id").(string) 58 59 // clc doesn't enforce uniqueness by name 60 // so skip the trad'l error we'd raise 61 e, err := resolveGroupByNameOrId(name, dc, client) 62 if e != "" { 63 log.Printf("[INFO] Resolved existing group: %v => %v", name, e) 64 d.SetId(e) 65 return nil 66 } 67 68 var pgid string 69 p, err := resolveGroupByNameOrId(parent, dc, client) 70 if p != "" { 71 log.Printf("[INFO] Resolved parent group: %v => %v", parent, p) 72 pgid = p 73 } else { 74 return fmt.Errorf("Failed resolving parent group %s - %s err:%s", parent, p, err) 75 } 76 77 d.Set("parent_group_id", pgid) 78 spec := group.Group{ 79 Name: name, 80 Description: desc, 81 ParentGroupID: pgid, 82 } 83 resp, err := client.Group.Create(spec) 84 if err != nil { 85 return fmt.Errorf("Failed creating group: %s", err) 86 } 87 log.Println("[INFO] Group created") 88 d.SetId(resp.ID) 89 return nil 90 } 91 92 func resourceCLCGroupRead(d *schema.ResourceData, meta interface{}) error { 93 client := meta.(*clc.Client) 94 id := d.Id() 95 g, err := client.Group.Get(id) 96 if err != nil { 97 log.Printf("[INFO] Failed finding group: %s - %s. Marking destroyed", id, err) 98 d.SetId("") 99 return nil 100 } 101 d.Set("name", g.Name) 102 d.Set("description", g.Description) 103 d.Set("parent_group_id", g.ParentGroupID()) 104 return nil 105 } 106 107 func resourceCLCGroupUpdate(d *schema.ResourceData, meta interface{}) error { 108 client := meta.(*clc.Client) 109 id := d.Id() 110 var err error 111 var patches []api.Update 112 113 g, err := client.Group.Get(id) 114 if err != nil { 115 return fmt.Errorf("Failed fetching group: %v - %v", id, err) 116 } 117 118 if delta, orig := d.Get("name").(string), g.Name; delta != orig { 119 patches = append(patches, group.UpdateName(delta)) 120 } 121 if delta, orig := d.Get("description").(string), g.Description; delta != orig { 122 patches = append(patches, group.UpdateDescription(delta)) 123 } 124 newParent := d.Get("parent").(string) 125 pgid, err := resolveGroupByNameOrId(newParent, g.Locationid, client) 126 log.Printf("[DEBUG] PARENT current:%v new:%v resolved:%v", g.ParentGroupID(), newParent, pgid) 127 if pgid == "" { 128 return fmt.Errorf("Unable to resolve parent group %v: %v", newParent, err) 129 } else if newParent != g.ParentGroupID() { 130 patches = append(patches, group.UpdateParentGroupID(pgid)) 131 } 132 133 if len(patches) == 0 { 134 return nil 135 } 136 err = client.Group.Update(id, patches...) 137 if err != nil { 138 return fmt.Errorf("Failed updating group %v: %v", id, err) 139 } 140 return resource.Retry(1*time.Minute, func() *resource.RetryError { 141 _, err := client.Group.Get(id) 142 if err != nil { 143 return resource.RetryableError(err) 144 } 145 err = resourceCLCGroupRead(d, meta) 146 if err != nil { 147 return resource.NonRetryableError(err) 148 } 149 return nil 150 }) 151 } 152 153 func resourceCLCGroupDelete(d *schema.ResourceData, meta interface{}) error { 154 client := meta.(*clc.Client) 155 id := d.Id() 156 log.Printf("[INFO] Deleting group %v", id) 157 st, err := client.Group.Delete(id) 158 if err != nil { 159 return fmt.Errorf("Failed deleting group: %v with err: %v", id, err) 160 } 161 waitStatus(client, st.ID) 162 return nil 163 }