Skip to content

Commit a58799f

Browse files
committed
2 parents df005d9 + 06d12b3 commit a58799f

6 files changed

Lines changed: 368 additions & 968 deletions

build/inspec

Submodule inspec updated 83 files

build/terraform

provider/terraform/resources/resource_compute_instance_group_manager.go

Lines changed: 114 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package google
33
import (
44
"fmt"
55
"log"
6+
"regexp"
67
"strings"
78
"time"
89

@@ -14,6 +15,11 @@ import (
1415
"google.golang.org/api/compute/v1"
1516
)
1617

18+
var (
19+
instanceGroupManagerIdRegex = regexp.MustCompile("^" + ProjectRegex + "/[a-z0-9-]+/[a-z0-9-]+$")
20+
instanceGroupManagerIdNameRegex = regexp.MustCompile("^[a-z0-9-]+$")
21+
)
22+
1723
func resourceComputeInstanceGroupManager() *schema.Resource {
1824
return &schema.Resource{
1925
Create: resourceComputeInstanceGroupManagerCreate,
@@ -322,7 +328,7 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
322328
}
323329

324330
// It probably maybe worked, so store the ID now
325-
d.SetId(manager.Name)
331+
d.SetId(instanceGroupManagerId{Project: project, Zone: zone, Name: manager.Name}.terraformId())
326332

327333
// Wait for the operation to complete
328334
err = computeSharedOperationWait(config.clientCompute, op, project, "Creating InstanceGroupManager")
@@ -372,39 +378,45 @@ func flattenFixedOrPercent(fixedOrPercent *computeBeta.FixedOrPercent) []map[str
372378

373379
func getManager(d *schema.ResourceData, meta interface{}) (*computeBeta.InstanceGroupManager, error) {
374380
config := meta.(*Config)
375-
376-
project, err := getProject(d, config)
381+
zonalID, err := parseInstanceGroupManagerId(d.Id())
377382
if err != nil {
378383
return nil, err
379384
}
380-
381-
region, err := getRegion(d, config)
382-
if err != nil {
383-
return nil, err
385+
if zonalID.Project == "" {
386+
project, err := getProject(d, config)
387+
if err != nil {
388+
return nil, err
389+
}
390+
zonalID.Project = project
391+
}
392+
if zonalID.Zone == "" {
393+
zonalID.Zone, _ = getZone(d, config)
384394
}
385395

386396
getInstanceGroupManager := func(zone string) (interface{}, error) {
387-
return config.clientComputeBeta.InstanceGroupManagers.Get(project, zone, d.Id()).Do()
397+
return config.clientComputeBeta.InstanceGroupManagers.Get(zonalID.Project, zone, zonalID.Name).Do()
388398
}
389399

390400
var manager *computeBeta.InstanceGroupManager
391-
var e error
392-
if zone, _ := getZone(d, config); zone != "" {
393-
manager, e = config.clientComputeBeta.InstanceGroupManagers.Get(project, zone, d.Id()).Do()
394-
395-
if e != nil {
396-
return nil, handleNotFoundError(e, d, fmt.Sprintf("Instance Group Manager %q", d.Get("name").(string)))
397-
}
398-
} else {
401+
if zonalID.Zone == "" {
399402
// If the resource was imported, the only info we have is the ID. Try to find the resource
400403
// by searching in the region of the project.
401-
var resource interface{}
402-
resource, e = getZonalBetaResourceFromRegion(getInstanceGroupManager, region, config.clientComputeBeta, project)
403-
if e != nil {
404-
return nil, e
404+
region, err := getRegion(d, config)
405+
if err != nil {
406+
return nil, err
407+
}
408+
resource, err := getZonalBetaResourceFromRegion(getInstanceGroupManager, region, config.clientComputeBeta, zonalID.Project)
409+
if err != nil {
410+
return nil, err
411+
}
412+
if resource != nil {
413+
manager = resource.(*computeBeta.InstanceGroupManager)
414+
}
415+
} else {
416+
manager, err = config.clientComputeBeta.InstanceGroupManagers.Get(zonalID.Project, zonalID.Zone, zonalID.Name).Do()
417+
if err != nil {
418+
return nil, handleNotFoundError(err, d, fmt.Sprintf("Instance Group Manager %q", zonalID.Name))
405419
}
406-
407-
manager = resource.(*computeBeta.InstanceGroupManager)
408420
}
409421

410422
if manager == nil {
@@ -528,14 +540,21 @@ func performZoneUpdate(config *Config, id string, updateStrategy string, rolling
528540
func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta interface{}) error {
529541
config := meta.(*Config)
530542

531-
project, err := getProject(d, config)
543+
zonalID, err := parseInstanceGroupManagerId(d.Id())
532544
if err != nil {
533545
return err
534546
}
535-
536-
zone, err := getZone(d, config)
537-
if err != nil {
538-
return err
547+
if zonalID.Project == "" {
548+
zonalID.Project, err = getProject(d, config)
549+
if err != nil {
550+
return err
551+
}
552+
}
553+
if zonalID.Zone == "" {
554+
zonalID.Zone, err = getZone(d, config)
555+
if err != nil {
556+
return err
557+
}
539558
}
540559

541560
d.Partial(true)
@@ -555,14 +574,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
555574
}
556575

557576
op, err := config.clientComputeBeta.InstanceGroupManagers.SetTargetPools(
558-
project, zone, d.Id(), setTargetPools).Do()
577+
zonalID.Project, zonalID.Zone, zonalID.Name, setTargetPools).Do()
559578

560579
if err != nil {
561580
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
562581
}
563582

564583
// Wait for the operation to complete
565-
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
584+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
566585
if err != nil {
567586
return err
568587
}
@@ -581,14 +600,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
581600

582601
// Make the request:
583602
op, err := config.clientComputeBeta.InstanceGroups.SetNamedPorts(
584-
project, zone, d.Id(), setNamedPorts).Do()
603+
zonalID.Project, zonalID.Zone, zonalID.Name, setNamedPorts).Do()
585604

586605
if err != nil {
587606
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
588607
}
589608

590609
// Wait for the operation to complete:
591-
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
610+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
592611
if err != nil {
593612
return err
594613
}
@@ -599,14 +618,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
599618
if d.HasChange("target_size") {
600619
targetSize := int64(d.Get("target_size").(int))
601620
op, err := config.clientComputeBeta.InstanceGroupManagers.Resize(
602-
project, zone, d.Id(), targetSize).Do()
621+
zonalID.Project, zonalID.Zone, zonalID.Name, targetSize).Do()
603622

604623
if err != nil {
605624
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
606625
}
607626

608627
// Wait for the operation to complete
609-
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
628+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
610629
if err != nil {
611630
return err
612631
}
@@ -622,14 +641,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
622641
}
623642

624643
op, err := config.clientComputeBeta.InstanceGroupManagers.SetAutoHealingPolicies(
625-
project, zone, d.Id(), setAutoHealingPoliciesRequest).Do()
644+
zonalID.Project, zonalID.Zone, zonalID.Name, setAutoHealingPoliciesRequest).Do()
626645

627646
if err != nil {
628647
return fmt.Errorf("Error updating AutoHealingPolicies: %s", err)
629648
}
630649

631650
// Wait for the operation to complete
632-
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating AutoHealingPolicies")
651+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating AutoHealingPolicies")
633652
if err != nil {
634653
return err
635654
}
@@ -644,21 +663,21 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
644663
InstanceTemplate: d.Get("instance_template").(string),
645664
}
646665

647-
op, err := config.clientComputeBeta.InstanceGroupManagers.SetInstanceTemplate(project, zone, d.Id(), setInstanceTemplate).Do()
666+
op, err := config.clientComputeBeta.InstanceGroupManagers.SetInstanceTemplate(zonalID.Project, zonalID.Zone, zonalID.Name, setInstanceTemplate).Do()
648667

649668
if err != nil {
650669
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
651670
}
652671

653672
// Wait for the operation to complete
654-
err = computeSharedOperationWait(config.clientCompute, op, project, "Updating InstanceGroupManager")
673+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Updating InstanceGroupManager")
655674
if err != nil {
656675
return err
657676
}
658677

659678
updateStrategy := d.Get("update_strategy").(string)
660679
rollingUpdatePolicy := expandUpdatePolicy(d.Get("rolling_update_policy").([]interface{}))
661-
err = performZoneUpdate(config, d.Id(), updateStrategy, rollingUpdatePolicy, nil, project, zone)
680+
err = performZoneUpdate(config, zonalID.Name, updateStrategy, rollingUpdatePolicy, nil, zonalID.Project, zonalID.Zone)
662681
d.SetPartial("instance_template")
663682
}
664683

@@ -667,7 +686,7 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
667686
updateStrategy := d.Get("update_strategy").(string)
668687
rollingUpdatePolicy := expandUpdatePolicy(d.Get("rolling_update_policy").([]interface{}))
669688
versions := expandVersions(d.Get("version").([]interface{}))
670-
err = performZoneUpdate(config, d.Id(), updateStrategy, rollingUpdatePolicy, versions, project, zone)
689+
err = performZoneUpdate(config, zonalID.Name, updateStrategy, rollingUpdatePolicy, versions, zonalID.Project, zonalID.Zone)
671690
if err != nil {
672691
return err
673692
}
@@ -683,22 +702,31 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
683702
func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error {
684703
config := meta.(*Config)
685704

686-
project, err := getProject(d, config)
705+
zonalID, err := parseInstanceGroupManagerId(d.Id())
687706
if err != nil {
688707
return err
689708
}
690709

691-
zone, err := getZone(d, config)
692-
if err != nil {
693-
return err
710+
if zonalID.Project == "" {
711+
zonalID.Project, err = getProject(d, config)
712+
if err != nil {
713+
return err
714+
}
715+
}
716+
717+
if zonalID.Zone == "" {
718+
zonalID.Zone, err = getZone(d, config)
719+
if err != nil {
720+
return err
721+
}
694722
}
695723

696-
op, err := config.clientComputeBeta.InstanceGroupManagers.Delete(project, zone, d.Id()).Do()
724+
op, err := config.clientComputeBeta.InstanceGroupManagers.Delete(zonalID.Project, zonalID.Zone, zonalID.Name).Do()
697725
attempt := 0
698726
for err != nil && attempt < 20 {
699727
attempt++
700728
time.Sleep(2000 * time.Millisecond)
701-
op, err = config.clientComputeBeta.InstanceGroupManagers.Delete(project, zone, d.Id()).Do()
729+
op, err = config.clientComputeBeta.InstanceGroupManagers.Delete(zonalID.Project, zonalID.Zone, zonalID.Name).Do()
702730
}
703731

704732
if err != nil {
@@ -708,15 +736,15 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
708736
currentSize := int64(d.Get("target_size").(int))
709737

710738
// Wait for the operation to complete
711-
err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting InstanceGroupManager")
739+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Deleting InstanceGroupManager")
712740

713741
for err != nil && currentSize > 0 {
714742
if !strings.Contains(err.Error(), "timeout") {
715743
return err
716744
}
717745

718746
instanceGroup, err := config.clientComputeBeta.InstanceGroups.Get(
719-
project, zone, d.Id()).Do()
747+
zonalID.Project, zonalID.Zone, zonalID.Name).Do()
720748
if err != nil {
721749
return fmt.Errorf("Error getting instance group size: %s", err)
722750
}
@@ -729,7 +757,7 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
729757

730758
log.Printf("[INFO] timeout occured, but instance group is shrinking (%d < %d)", instanceGroupSize, currentSize)
731759
currentSize = instanceGroupSize
732-
err = computeSharedOperationWait(config.clientCompute, op, project, "Deleting InstanceGroupManager")
760+
err = computeSharedOperationWait(config.clientCompute, op, zonalID.Project, "Deleting InstanceGroupManager")
733761
}
734762

735763
d.SetId("")
@@ -838,5 +866,43 @@ func flattenAutoHealingPolicies(autoHealingPolicies []*computeBeta.InstanceGroup
838866

839867
func resourceInstanceGroupManagerStateImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
840868
d.Set("wait_for_instances", false)
869+
zonalID, err := parseInstanceGroupManagerId(d.Id())
870+
if err != nil {
871+
return nil, err
872+
}
873+
if zonalID.Zone == "" || zonalID.Project == "" {
874+
return nil, fmt.Errorf("Invalid instance group manager import ID. Expecting {projectId}/{zone}/{name}.")
875+
}
876+
d.Set("project", zonalID.Project)
877+
d.Set("zone", zonalID.Zone)
878+
d.Set("name", zonalID.Name)
841879
return []*schema.ResourceData{d}, nil
842880
}
881+
882+
type instanceGroupManagerId struct {
883+
Project string
884+
Zone string
885+
Name string
886+
}
887+
888+
func (i instanceGroupManagerId) terraformId() string {
889+
return fmt.Sprintf("%s/%s/%s", i.Project, i.Zone, i.Name)
890+
}
891+
892+
func parseInstanceGroupManagerId(id string) (*instanceGroupManagerId, error) {
893+
switch {
894+
case instanceGroupManagerIdRegex.MatchString(id):
895+
parts := strings.Split(id, "/")
896+
return &instanceGroupManagerId{
897+
Project: parts[0],
898+
Zone: parts[1],
899+
Name: parts[2],
900+
}, nil
901+
case instanceGroupManagerIdNameRegex.MatchString(id):
902+
return &instanceGroupManagerId{
903+
Name: id,
904+
}, nil
905+
default:
906+
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.")
907+
}
908+
}

0 commit comments

Comments
 (0)