Skip to content

Commit 08c73f2

Browse files
modular-magiciannat-henderson
authored andcommitted
Standardize import for instance group manager. (#2946)
Signed-off-by: Modular Magician <[email protected]>
1 parent 9aa57f2 commit 08c73f2

3 files changed

+53
-108
lines changed

google/import.go

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func parseImportId(idRegexes []string, d TerraformResourceData, config *Config)
2020
re, err := regexp.Compile(idFormat)
2121

2222
if err != nil {
23+
log.Printf("[DEBUG] Could not compile %s.", idFormat)
2324
return fmt.Errorf("Import is not supported. Invalid regex formats.")
2425
}
2526

google/resource_compute_instance_group_manager.go

+50-96
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package google
33
import (
44
"fmt"
55
"log"
6-
"regexp"
76
"strings"
87
"time"
98

@@ -15,11 +14,6 @@ import (
1514
"google.golang.org/api/compute/v1"
1615
)
1716

18-
var (
19-
instanceGroupManagerIdRegex = regexp.MustCompile("^" + ProjectRegex + "/[a-z0-9-]+/[a-z0-9-]+$")
20-
instanceGroupManagerIdNameRegex = regexp.MustCompile("^[a-z0-9-]+$")
21-
)
22-
2317
func resourceComputeInstanceGroupManager() *schema.Resource {
2418
return &schema.Resource{
2519
Create: resourceComputeInstanceGroupManagerCreate,
@@ -332,7 +326,11 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
332326
}
333327

334328
// It probably maybe worked, so store the ID now
335-
d.SetId(instanceGroupManagerId{Project: project, Zone: zone, Name: manager.Name}.terraformId())
329+
id, err := replaceVars(d, config, "{{project}}/{{zone}}/{{name}}")
330+
if err != nil {
331+
return err
332+
}
333+
d.SetId(id)
336334

337335
// Wait for the operation to complete
338336
err = computeSharedOperationWait(config.clientCompute, op, project, "Creating InstanceGroupManager")
@@ -357,26 +355,21 @@ func flattenNamedPortsBeta(namedPorts []*computeBeta.NamedPort) []map[string]int
357355

358356
func getManager(d *schema.ResourceData, meta interface{}) (*computeBeta.InstanceGroupManager, error) {
359357
config := meta.(*Config)
360-
zonalID, err := parseInstanceGroupManagerId(d.Id())
361-
if err != nil {
358+
if err := parseImportId([]string{"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil {
362359
return nil, err
363360
}
364361

365-
if zonalID.Project == "" {
366-
project, err := getProject(d, config)
367-
if err != nil {
368-
return nil, err
369-
}
370-
zonalID.Project = project
362+
project, err := getProject(d, config)
363+
if err != nil {
364+
return nil, err
371365
}
372366

373-
if zonalID.Zone == "" {
374-
zonalID.Zone, _ = getZone(d, config)
375-
}
367+
zone, _ := getZone(d, config)
368+
name := d.Get("name").(string)
376369

377-
manager, err := config.clientComputeBeta.InstanceGroupManagers.Get(zonalID.Project, zonalID.Zone, zonalID.Name).Do()
370+
manager, err := config.clientComputeBeta.InstanceGroupManagers.Get(project, zone, name).Do()
378371
if err != nil {
379-
return nil, handleNotFoundError(err, d, fmt.Sprintf("Instance Group Manager %q", zonalID.Name))
372+
return nil, handleNotFoundError(err, d, fmt.Sprintf("Instance Group Manager %q", name))
380373
}
381374

382375
if manager == nil {
@@ -488,23 +481,18 @@ func performZoneUpdate(config *Config, id string, updateStrategy string, project
488481
func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta interface{}) error {
489482
config := meta.(*Config)
490483

491-
zonalID, err := parseInstanceGroupManagerId(d.Id())
492-
if err != nil {
484+
if err := parseImportId([]string{"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil {
493485
return err
494486
}
495-
if zonalID.Project == "" {
496-
zonalID.Project, err = getProject(d, config)
497-
if err != nil {
498-
return err
499-
}
500-
}
501-
if zonalID.Zone == "" {
502-
zonalID.Zone, err = getZone(d, config)
503-
if err != nil {
504-
return err
505-
}
487+
488+
project, err := getProject(d, config)
489+
if err != nil {
490+
return err
506491
}
507492

493+
zone, _ := getZone(d, config)
494+
name := d.Get("name").(string)
495+
508496
d.Partial(true)
509497

510498
// If target_pools changes then update
@@ -518,14 +506,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
518506
}
519507

520508
op, err := config.clientComputeBeta.InstanceGroupManagers.SetTargetPools(
521-
zonalID.Project, zonalID.Zone, zonalID.Name, setTargetPools).Do()
509+
project, zone, name, setTargetPools).Do()
522510

523511
if err != nil {
524512
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
525513
}
526514

527515
// Wait for the operation to complete
528-
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
516+
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
529517
if err != nil {
530518
return err
531519
}
@@ -544,14 +532,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
544532

545533
// Make the request:
546534
op, err := config.clientComputeBeta.InstanceGroups.SetNamedPorts(
547-
zonalID.Project, zonalID.Zone, zonalID.Name, setNamedPorts).Do()
535+
project, zone, name, setNamedPorts).Do()
548536

549537
if err != nil {
550538
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
551539
}
552540

553541
// Wait for the operation to complete:
554-
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
542+
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
555543
if err != nil {
556544
return err
557545
}
@@ -562,14 +550,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
562550
if d.HasChange("target_size") {
563551
targetSize := int64(d.Get("target_size").(int))
564552
op, err := config.clientComputeBeta.InstanceGroupManagers.Resize(
565-
zonalID.Project, zonalID.Zone, zonalID.Name, targetSize).Do()
553+
project, zone, name, targetSize).Do()
566554

567555
if err != nil {
568556
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
569557
}
570558

571559
// Wait for the operation to complete
572-
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
560+
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
573561
if err != nil {
574562
return err
575563
}
@@ -584,20 +572,20 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
584572
InstanceTemplate: d.Get("instance_template").(string),
585573
}
586574

587-
op, err := config.clientComputeBeta.InstanceGroupManagers.SetInstanceTemplate(zonalID.Project, zonalID.Zone, zonalID.Name, setInstanceTemplate).Do()
575+
op, err := config.clientComputeBeta.InstanceGroupManagers.SetInstanceTemplate(project, zone, name, setInstanceTemplate).Do()
588576

589577
if err != nil {
590578
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
591579
}
592580

593581
// Wait for the operation to complete
594-
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
582+
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
595583
if err != nil {
596584
return err
597585
}
598586

599587
updateStrategy := d.Get("update_strategy").(string)
600-
err = performZoneUpdate(config, zonalID.Name, updateStrategy, zonalID.Project, zonalID.Zone)
588+
err = performZoneUpdate(config, name, updateStrategy, project, zone)
601589
d.SetPartial("instance_template")
602590
}
603591

@@ -609,31 +597,23 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
609597
func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error {
610598
config := meta.(*Config)
611599

612-
zonalID, err := parseInstanceGroupManagerId(d.Id())
613-
if err != nil {
600+
if err := parseImportId([]string{"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil {
614601
return err
615602
}
616-
617-
if zonalID.Project == "" {
618-
zonalID.Project, err = getProject(d, config)
619-
if err != nil {
620-
return err
621-
}
603+
project, err := getProject(d, config)
604+
if err != nil {
605+
return err
622606
}
623607

624-
if zonalID.Zone == "" {
625-
zonalID.Zone, err = getZone(d, config)
626-
if err != nil {
627-
return err
628-
}
629-
}
608+
zone, _ := getZone(d, config)
609+
name := d.Get("name").(string)
630610

631-
op, err := config.clientComputeBeta.InstanceGroupManagers.Delete(zonalID.Project, zonalID.Zone, zonalID.Name).Do()
611+
op, err := config.clientComputeBeta.InstanceGroupManagers.Delete(project, zone, name).Do()
632612
attempt := 0
633613
for err != nil && attempt < 20 {
634614
attempt++
635615
time.Sleep(2000 * time.Millisecond)
636-
op, err = config.clientComputeBeta.InstanceGroupManagers.Delete(zonalID.Project, zonalID.Zone, zonalID.Name).Do()
616+
op, err = config.clientComputeBeta.InstanceGroupManagers.Delete(project, zone, name).Do()
637617
}
638618

639619
if err != nil {
@@ -643,15 +623,15 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
643623
currentSize := int64(d.Get("target_size").(int))
644624

645625
// Wait for the operation to complete
646-
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Deleting InstanceGroupManager")
626+
err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting InstanceGroupManager")
647627

648628
for err != nil && currentSize > 0 {
649629
if !strings.Contains(err.Error(), "timeout") {
650630
return err
651631
}
652632

653633
instanceGroup, err := config.clientComputeBeta.InstanceGroups.Get(
654-
zonalID.Project, zonalID.Zone, zonalID.Name).Do()
634+
project, zone, name).Do()
655635
if err != nil {
656636
return fmt.Errorf("Error getting instance group size: %s", err)
657637
}
@@ -664,7 +644,7 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
664644

665645
log.Printf("[INFO] timeout occurred, but instance group is shrinking (%d < %d)", instanceGroupSize, currentSize)
666646
currentSize = instanceGroupSize
667-
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Deleting InstanceGroupManager")
647+
err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting InstanceGroupManager")
668648
}
669649

670650
d.SetId("")
@@ -673,43 +653,17 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
673653

674654
func resourceInstanceGroupManagerStateImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
675655
d.Set("wait_for_instances", false)
676-
zonalID, err := parseInstanceGroupManagerId(d.Id())
677-
if err != nil {
656+
config := meta.(*Config)
657+
if err := parseImportId([]string{"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil {
678658
return nil, err
679659
}
680-
if zonalID.Zone == "" || zonalID.Project == "" {
681-
return nil, fmt.Errorf("Invalid instance group manager import ID. Expecting {projectId}/{zone}/{name}.")
682-
}
683-
d.Set("project", zonalID.Project)
684-
d.Set("zone", zonalID.Zone)
685-
d.Set("name", zonalID.Name)
686-
return []*schema.ResourceData{d}, nil
687-
}
688-
689-
type instanceGroupManagerId struct {
690-
Project string
691-
Zone string
692-
Name string
693-
}
694-
695-
func (i instanceGroupManagerId) terraformId() string {
696-
return fmt.Sprintf("%s/%s/%s", i.Project, i.Zone, i.Name)
697-
}
698660

699-
func parseInstanceGroupManagerId(id string) (*instanceGroupManagerId, error) {
700-
switch {
701-
case instanceGroupManagerIdRegex.MatchString(id):
702-
parts := strings.Split(id, "/")
703-
return &instanceGroupManagerId{
704-
Project: parts[0],
705-
Zone: parts[1],
706-
Name: parts[2],
707-
}, nil
708-
case instanceGroupManagerIdNameRegex.MatchString(id):
709-
return &instanceGroupManagerId{
710-
Name: id,
711-
}, nil
712-
default:
713-
return nil, fmt.Errorf("Invalid instance group manager specifier. Expecting either {projectId}/{zone}/{name} or {name}, where {projectId} and {zone} will be derived from the provider.")
661+
// Replace import id for the resource id
662+
id, err := replaceVars(d, config, "{{project}}/{{zone}}/{{name}}")
663+
if err != nil {
664+
return nil, fmt.Errorf("Error constructing id: %s", err)
714665
}
666+
d.SetId(id)
667+
668+
return []*schema.ResourceData{d}, nil
715669
}

google/resource_compute_instance_group_manager_test.go

+2-12
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,8 @@ func testAccCheckInstanceGroupManagerDestroy(s *terraform.State) error {
185185
if rs.Type != "google_compute_instance_group_manager" {
186186
continue
187187
}
188-
id, err := parseInstanceGroupManagerId(rs.Primary.ID)
189-
if err != nil {
190-
return err
191-
}
192-
if id.Project == "" {
193-
id.Project = config.Project
194-
}
195-
if id.Zone == "" {
196-
id.Zone = rs.Primary.Attributes["zone"]
197-
}
198-
_, err = config.clientCompute.InstanceGroupManagers.Get(
199-
id.Project, id.Zone, id.Name).Do()
188+
_, err := config.clientCompute.InstanceGroupManagers.Get(
189+
config.Project, rs.Primary.Attributes["zone"], rs.Primary.Attributes["name"]).Do()
200190
if err == nil {
201191
return fmt.Errorf("InstanceGroupManager still exists")
202192
}

0 commit comments

Comments
 (0)