@@ -3,6 +3,7 @@ package google
33import (
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+
1723func 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
373379func 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
528540func 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
683702func 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
839867func 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