Skip to content

Commit da1cf0d

Browse files
committed
provider/google: Support Import of'google_compute_instance_group_manager'
1 parent 8d8b186 commit da1cf0d

3 files changed

Lines changed: 122 additions & 20 deletions

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package google
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform/helper/acctest"
8+
"github.com/hashicorp/terraform/helper/resource"
9+
)
10+
11+
func TestAccInstanceGroupManager_importBasic(t *testing.T) {
12+
resourceName1 := "google_compute_instance_group_manager.igm-basic"
13+
resourceName2 := "google_compute_instance_group_manager.igm-no-tp"
14+
template := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
15+
target := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
16+
igm1 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
17+
igm2 := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
18+
19+
resource.Test(t, resource.TestCase{
20+
PreCheck: func() { testAccPreCheck(t) },
21+
Providers: testAccProviders,
22+
CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
23+
Steps: []resource.TestStep{
24+
resource.TestStep{
25+
Config: testAccInstanceGroupManager_basic(template, target, igm1, igm2),
26+
},
27+
28+
resource.TestStep{
29+
ResourceName: resourceName1,
30+
ImportState: true,
31+
ImportStateVerify: true,
32+
},
33+
34+
resource.TestStep{
35+
ResourceName: resourceName2,
36+
ImportState: true,
37+
ImportStateVerify: true,
38+
},
39+
},
40+
})
41+
}
42+
43+
func TestAccInstanceGroupManager_importUpdate(t *testing.T) {
44+
resourceName := "google_compute_instance_group_manager.igm-update"
45+
template := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
46+
target := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
47+
igm := fmt.Sprintf("igm-test-%s", acctest.RandString(10))
48+
49+
resource.Test(t, resource.TestCase{
50+
PreCheck: func() { testAccPreCheck(t) },
51+
Providers: testAccProviders,
52+
CheckDestroy: testAccCheckInstanceGroupManagerDestroy,
53+
Steps: []resource.TestStep{
54+
resource.TestStep{
55+
Config: testAccInstanceGroupManager_update(template, target, igm),
56+
},
57+
58+
resource.TestStep{
59+
ResourceName: resourceName,
60+
ImportState: true,
61+
ImportStateVerify: true,
62+
},
63+
},
64+
})
65+
}

builtin/providers/google/resource_compute_instance_group_manager.go

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1413
func 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+
187202
func 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
}

builtin/providers/google/resource_compute_instance_group_manager_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func testAccInstanceGroupManager_basic(template, target, igm1, igm2 string) stri
277277
tags = ["foo", "bar"]
278278
279279
disk {
280-
source_image = "debian-cloud/debian-7-wheezy-v20160301"
280+
source_image = "debian-7-wheezy-v20160301"
281281
auto_delete = true
282282
boot = true
283283
}
@@ -331,7 +331,7 @@ func testAccInstanceGroupManager_update(template, target, igm string) string {
331331
tags = ["foo", "bar"]
332332
333333
disk {
334-
source_image = "debian-cloud/debian-7-wheezy-v20160301"
334+
source_image = "debian-7-wheezy-v20160301"
335335
auto_delete = true
336336
boot = true
337337
}
@@ -380,7 +380,7 @@ func testAccInstanceGroupManager_update2(template1, target, template2, igm strin
380380
tags = ["foo", "bar"]
381381
382382
disk {
383-
source_image = "debian-cloud/debian-7-wheezy-v20160301"
383+
source_image = "debian-7-wheezy-v20160301"
384384
auto_delete = true
385385
boot = true
386386
}
@@ -411,7 +411,7 @@ func testAccInstanceGroupManager_update2(template1, target, template2, igm strin
411411
tags = ["foo", "bar"]
412412
413413
disk {
414-
source_image = "debian-cloud/debian-7-wheezy-v20160301"
414+
source_image = "debian-7-wheezy-v20160301"
415415
auto_delete = true
416416
boot = true
417417
}
@@ -456,7 +456,7 @@ func testAccInstanceGroupManager_updateLifecycle(tag, igm string) string {
456456
tags = ["%s"]
457457
458458
disk {
459-
source_image = "debian-cloud/debian-7-wheezy-v20160301"
459+
source_image = "debian-7-wheezy-v20160301"
460460
auto_delete = true
461461
boot = true
462462
}

0 commit comments

Comments
 (0)