github.com/icebourg/terraform@v0.6.5-0.20151015205227-263cc1b85535/builtin/providers/google/resource_compute_instance_group_manager.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "log" 6 7 "google.golang.org/api/compute/v1" 8 "google.golang.org/api/googleapi" 9 10 "github.com/hashicorp/terraform/helper/hashcode" 11 "github.com/hashicorp/terraform/helper/schema" 12 ) 13 14 func resourceComputeInstanceGroupManager() *schema.Resource { 15 return &schema.Resource{ 16 Create: resourceComputeInstanceGroupManagerCreate, 17 Read: resourceComputeInstanceGroupManagerRead, 18 Update: resourceComputeInstanceGroupManagerUpdate, 19 Delete: resourceComputeInstanceGroupManagerDelete, 20 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 28 "description": &schema.Schema{ 29 Type: schema.TypeString, 30 Optional: true, 31 ForceNew: true, 32 }, 33 34 "base_instance_name": &schema.Schema{ 35 Type: schema.TypeString, 36 Required: true, 37 ForceNew: true, 38 }, 39 40 "fingerprint": &schema.Schema{ 41 Type: schema.TypeString, 42 Computed: true, 43 }, 44 45 "instance_group": &schema.Schema{ 46 Type: schema.TypeString, 47 Computed: true, 48 }, 49 50 "instance_template": &schema.Schema{ 51 Type: schema.TypeString, 52 Required: true, 53 }, 54 55 "target_pools": &schema.Schema{ 56 Type: schema.TypeSet, 57 Optional: true, 58 Elem: &schema.Schema{Type: schema.TypeString}, 59 Set: func(v interface{}) int { 60 return hashcode.String(v.(string)) 61 }, 62 }, 63 64 "target_size": &schema.Schema{ 65 Type: schema.TypeInt, 66 Computed: true, 67 Optional: true, 68 }, 69 70 "zone": &schema.Schema{ 71 Type: schema.TypeString, 72 Required: true, 73 ForceNew: true, 74 }, 75 76 "self_link": &schema.Schema{ 77 Type: schema.TypeString, 78 Computed: true, 79 }, 80 }, 81 } 82 } 83 84 func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta interface{}) error { 85 config := meta.(*Config) 86 87 // Get group size, default to 1 if not given 88 var target_size int64 = 1 89 if v, ok := d.GetOk("target_size"); ok { 90 target_size = int64(v.(int)) 91 } 92 93 // Build the parameter 94 manager := &compute.InstanceGroupManager{ 95 Name: d.Get("name").(string), 96 BaseInstanceName: d.Get("base_instance_name").(string), 97 InstanceTemplate: d.Get("instance_template").(string), 98 TargetSize: target_size, 99 } 100 101 // Set optional fields 102 if v, ok := d.GetOk("description"); ok { 103 manager.Description = v.(string) 104 } 105 106 if attr := d.Get("target_pools").(*schema.Set); attr.Len() > 0 { 107 var s []string 108 for _, v := range attr.List() { 109 s = append(s, v.(string)) 110 } 111 manager.TargetPools = s 112 } 113 114 log.Printf("[DEBUG] InstanceGroupManager insert request: %#v", manager) 115 op, err := config.clientCompute.InstanceGroupManagers.Insert( 116 config.Project, d.Get("zone").(string), manager).Do() 117 if err != nil { 118 return fmt.Errorf("Error creating InstanceGroupManager: %s", err) 119 } 120 121 // It probably maybe worked, so store the ID now 122 d.SetId(manager.Name) 123 124 // Wait for the operation to complete 125 err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Creating InstanceGroupManager") 126 if err != nil { 127 return err 128 } 129 130 return resourceComputeInstanceGroupManagerRead(d, meta) 131 } 132 133 func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interface{}) error { 134 config := meta.(*Config) 135 136 manager, err := config.clientCompute.InstanceGroupManagers.Get( 137 config.Project, d.Get("zone").(string), d.Id()).Do() 138 if err != nil { 139 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 140 // The resource doesn't exist anymore 141 d.SetId("") 142 143 return nil 144 } 145 146 return fmt.Errorf("Error reading instance group manager: %s", err) 147 } 148 149 // Set computed fields 150 d.Set("fingerprint", manager.Fingerprint) 151 d.Set("instance_group", manager.InstanceGroup) 152 d.Set("target_size", manager.TargetSize) 153 d.Set("self_link", manager.SelfLink) 154 155 return nil 156 } 157 func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta interface{}) error { 158 config := meta.(*Config) 159 160 d.Partial(true) 161 162 // If target_pools changes then update 163 if d.HasChange("target_pools") { 164 var targetPools []string 165 if attr := d.Get("target_pools").(*schema.Set); attr.Len() > 0 { 166 for _, v := range attr.List() { 167 targetPools = append(targetPools, v.(string)) 168 } 169 } 170 171 // Build the parameter 172 setTargetPools := &compute.InstanceGroupManagersSetTargetPoolsRequest{ 173 Fingerprint: d.Get("fingerprint").(string), 174 TargetPools: targetPools, 175 } 176 177 op, err := config.clientCompute.InstanceGroupManagers.SetTargetPools( 178 config.Project, d.Get("zone").(string), d.Id(), setTargetPools).Do() 179 if err != nil { 180 return fmt.Errorf("Error updating InstanceGroupManager: %s", err) 181 } 182 183 // Wait for the operation to complete 184 err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager") 185 if err != nil { 186 return err 187 } 188 189 d.SetPartial("target_pools") 190 } 191 192 // If instance_template changes then update 193 if d.HasChange("instance_template") { 194 // Build the parameter 195 setInstanceTemplate := &compute.InstanceGroupManagersSetInstanceTemplateRequest{ 196 InstanceTemplate: d.Get("instance_template").(string), 197 } 198 199 op, err := config.clientCompute.InstanceGroupManagers.SetInstanceTemplate( 200 config.Project, d.Get("zone").(string), d.Id(), setInstanceTemplate).Do() 201 if err != nil { 202 return fmt.Errorf("Error updating InstanceGroupManager: %s", err) 203 } 204 205 // Wait for the operation to complete 206 err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager") 207 if err != nil { 208 return err 209 } 210 211 d.SetPartial("instance_template") 212 } 213 214 // If size changes trigger a resize 215 if d.HasChange("target_size") { 216 if v, ok := d.GetOk("target_size"); ok { 217 // Only do anything if the new size is set 218 target_size := int64(v.(int)) 219 220 op, err := config.clientCompute.InstanceGroupManagers.Resize( 221 config.Project, d.Get("zone").(string), d.Id(), target_size).Do() 222 if err != nil { 223 return fmt.Errorf("Error updating InstanceGroupManager: %s", err) 224 } 225 226 // Wait for the operation to complete 227 err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager") 228 if err != nil { 229 return err 230 } 231 } 232 233 d.SetPartial("target_size") 234 } 235 236 d.Partial(false) 237 238 return resourceComputeInstanceGroupManagerRead(d, meta) 239 } 240 241 func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error { 242 config := meta.(*Config) 243 244 zone := d.Get("zone").(string) 245 op, err := config.clientCompute.InstanceGroupManagers.Delete(config.Project, zone, d.Id()).Do() 246 if err != nil { 247 return fmt.Errorf("Error deleting instance group manager: %s", err) 248 } 249 250 // Wait for the operation to complete 251 err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Deleting InstanceGroupManager") 252 if err != nil { 253 return err 254 } 255 256 d.SetId("") 257 return nil 258 }