@@ -4,11 +4,10 @@ import (
44 "fmt"
55 "log"
66 "strings"
7-
8- "google.golang.org/api/compute/v1"
9- "google.golang.org/api/googleapi"
7+ "time"
108
119 "github.com/hashicorp/terraform/helper/schema"
10+ "google.golang.org/api/compute/v1"
1211)
1312
1413func resourceComputeInstanceGroupManager () * schema.Resource {
@@ -17,6 +16,9 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
1716 Read : resourceComputeInstanceGroupManagerRead ,
1817 Update : resourceComputeInstanceGroupManagerUpdate ,
1918 Delete : resourceComputeInstanceGroupManagerDelete ,
19+ Importer : & schema.ResourceImporter {
20+ State : schema .ImportStatePassthrough ,
21+ },
2022
2123 Schema : map [string ]* schema.Schema {
2224 "base_instance_name" : & schema.Schema {
@@ -80,6 +82,7 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
8082 Type : schema .TypeString ,
8183 Optional : true ,
8284 ForceNew : true ,
85+ Computed : true ,
8386 },
8487
8588 "self_link" : & schema.Schema {
@@ -184,6 +187,18 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
184187 return resourceComputeInstanceGroupManagerRead (d , meta )
185188}
186189
190+ func flattenNamedPorts (namedPorts []* compute.NamedPort ) []map [string ]interface {} {
191+ result := make ([]map [string ]interface {}, 0 , len (namedPorts ))
192+ for _ , namedPort := range namedPorts {
193+ namedPortMap := make (map [string ]interface {})
194+ namedPortMap ["name" ] = namedPort .Name
195+ namedPortMap ["port" ] = namedPort .Port
196+ result = append (result , namedPortMap )
197+ }
198+ return result
199+
200+ }
201+
187202func resourceComputeInstanceGroupManagerRead (d * schema.ResourceData , meta interface {}) error {
188203 config := meta .(* Config )
189204
@@ -192,26 +207,42 @@ func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interf
192207 return err
193208 }
194209
195- manager , err := config .clientCompute .InstanceGroupManagers .Get (
196- project , d .Get ("zone" ).(string ), d .Id ()).Do ()
210+ region , err := getRegion (d , config )
197211 if err != nil {
198- if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
199- log .Printf ("[WARN] Removing Instance Group Manager %q because it's gone" , d .Get ("name" ).(string ))
200- // The resource doesn't exist anymore
201- d .SetId ("" )
202-
203- return nil
204- }
212+ return err
213+ }
205214
206- return fmt .Errorf ("Error reading instance group manager: %s" , err )
215+ getInstanceGroupManager := func (zone string ) (interface {}, error ) {
216+ return config .clientCompute .InstanceGroupManagers .Get (project , zone , d .Id ()).Do ()
207217 }
208218
209- // Set computed fields
210- d .Set ("named_port" , manager .NamedPorts )
219+ resource , err := getZonalResourceFromRegion (getInstanceGroupManager , region , config .clientCompute , project )
220+ if err != nil {
221+ return err
222+ }
223+ if resource == nil {
224+ log .Printf ("[WARN] Removing Instance Group Manager %q because it's gone" , d .Get ("name" ).(string ))
225+ // The resource doesn't exist anymore
226+ d .SetId ("" )
227+ return nil
228+ }
229+ manager := resource .(* compute.InstanceGroupManager )
230+
231+ zoneUrl := strings .Split (manager .Zone , "/" )
232+ d .Set ("base_instance_name" , manager .BaseInstanceName )
233+ d .Set ("instance_template" , manager .InstanceTemplate )
234+ d .Set ("name" , manager .Name )
235+ d .Set ("zone" , zoneUrl [len (zoneUrl )- 1 ])
236+ d .Set ("description" , manager .Description )
237+ d .Set ("project" , project )
238+ d .Set ("target_size" , manager .TargetSize )
239+ d .Set ("target_pools" , manager .TargetPools )
240+ d .Set ("named_port" , flattenNamedPorts (manager .NamedPorts ))
211241 d .Set ("fingerprint" , manager .Fingerprint )
212242 d .Set ("instance_group" , manager .InstanceGroup )
213243 d .Set ("target_size" , manager .TargetSize )
214244 d .Set ("self_link" , manager .SelfLink )
245+ d .Set ("update_strategy" , "RESTART" ) //this field doesn't match the manager api, set to default value
215246
216247 return nil
217248}
@@ -368,6 +399,12 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
368399
369400 zone := d .Get ("zone" ).(string )
370401 op , err := config .clientCompute .InstanceGroupManagers .Delete (project , zone , d .Id ()).Do ()
402+ attempt := 0
403+ for err != nil && attempt < 20 {
404+ attempt ++
405+ time .Sleep (2000 * time .Millisecond )
406+ op , err = config .clientCompute .InstanceGroupManagers .Delete (project , zone , d .Id ()).Do ()
407+ }
371408 if err != nil {
372409 return fmt .Errorf ("Error deleting instance group manager: %s" , err )
373410 }
0 commit comments