@@ -3,7 +3,6 @@ package google
3
3
import (
4
4
"fmt"
5
5
"log"
6
- "regexp"
7
6
"strings"
8
7
"time"
9
8
@@ -15,11 +14,6 @@ import (
15
14
"google.golang.org/api/compute/v1"
16
15
)
17
16
18
- var (
19
- instanceGroupManagerIdRegex = regexp .MustCompile ("^" + ProjectRegex + "/[a-z0-9-]+/[a-z0-9-]+$" )
20
- instanceGroupManagerIdNameRegex = regexp .MustCompile ("^[a-z0-9-]+$" )
21
- )
22
-
23
17
func resourceComputeInstanceGroupManager () * schema.Resource {
24
18
return & schema.Resource {
25
19
Create : resourceComputeInstanceGroupManagerCreate ,
@@ -332,7 +326,11 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
332
326
}
333
327
334
328
// 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 )
336
334
337
335
// Wait for the operation to complete
338
336
err = computeSharedOperationWait (config .clientCompute , op , project , "Creating InstanceGroupManager" )
@@ -357,26 +355,21 @@ func flattenNamedPortsBeta(namedPorts []*computeBeta.NamedPort) []map[string]int
357
355
358
356
func getManager (d * schema.ResourceData , meta interface {}) (* computeBeta.InstanceGroupManager , error ) {
359
357
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 {
362
359
return nil , err
363
360
}
364
361
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
371
365
}
372
366
373
- if zonalID .Zone == "" {
374
- zonalID .Zone , _ = getZone (d , config )
375
- }
367
+ zone , _ := getZone (d , config )
368
+ name := d .Get ("name" ).(string )
376
369
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 ()
378
371
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 ))
380
373
}
381
374
382
375
if manager == nil {
@@ -488,23 +481,18 @@ func performZoneUpdate(config *Config, id string, updateStrategy string, project
488
481
func resourceComputeInstanceGroupManagerUpdate (d * schema.ResourceData , meta interface {}) error {
489
482
config := meta .(* Config )
490
483
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 {
493
485
return err
494
486
}
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
506
491
}
507
492
493
+ zone , _ := getZone (d , config )
494
+ name := d .Get ("name" ).(string )
495
+
508
496
d .Partial (true )
509
497
510
498
// If target_pools changes then update
@@ -518,14 +506,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
518
506
}
519
507
520
508
op , err := config .clientComputeBeta .InstanceGroupManagers .SetTargetPools (
521
- zonalID . Project , zonalID . Zone , zonalID . Name , setTargetPools ).Do ()
509
+ project , zone , name , setTargetPools ).Do ()
522
510
523
511
if err != nil {
524
512
return fmt .Errorf ("Error updating InstanceGroupManager: %s" , err )
525
513
}
526
514
527
515
// 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" )
529
517
if err != nil {
530
518
return err
531
519
}
@@ -544,14 +532,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
544
532
545
533
// Make the request:
546
534
op , err := config .clientComputeBeta .InstanceGroups .SetNamedPorts (
547
- zonalID . Project , zonalID . Zone , zonalID . Name , setNamedPorts ).Do ()
535
+ project , zone , name , setNamedPorts ).Do ()
548
536
549
537
if err != nil {
550
538
return fmt .Errorf ("Error updating InstanceGroupManager: %s" , err )
551
539
}
552
540
553
541
// 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" )
555
543
if err != nil {
556
544
return err
557
545
}
@@ -562,14 +550,14 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
562
550
if d .HasChange ("target_size" ) {
563
551
targetSize := int64 (d .Get ("target_size" ).(int ))
564
552
op , err := config .clientComputeBeta .InstanceGroupManagers .Resize (
565
- zonalID . Project , zonalID . Zone , zonalID . Name , targetSize ).Do ()
553
+ project , zone , name , targetSize ).Do ()
566
554
567
555
if err != nil {
568
556
return fmt .Errorf ("Error updating InstanceGroupManager: %s" , err )
569
557
}
570
558
571
559
// 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" )
573
561
if err != nil {
574
562
return err
575
563
}
@@ -584,20 +572,20 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
584
572
InstanceTemplate : d .Get ("instance_template" ).(string ),
585
573
}
586
574
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 ()
588
576
589
577
if err != nil {
590
578
return fmt .Errorf ("Error updating InstanceGroupManager: %s" , err )
591
579
}
592
580
593
581
// 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" )
595
583
if err != nil {
596
584
return err
597
585
}
598
586
599
587
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 )
601
589
d .SetPartial ("instance_template" )
602
590
}
603
591
@@ -609,31 +597,23 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
609
597
func resourceComputeInstanceGroupManagerDelete (d * schema.ResourceData , meta interface {}) error {
610
598
config := meta .(* Config )
611
599
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 {
614
601
return err
615
602
}
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
622
606
}
623
607
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 )
630
610
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 ()
632
612
attempt := 0
633
613
for err != nil && attempt < 20 {
634
614
attempt ++
635
615
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 ()
637
617
}
638
618
639
619
if err != nil {
@@ -643,15 +623,15 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
643
623
currentSize := int64 (d .Get ("target_size" ).(int ))
644
624
645
625
// 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" )
647
627
648
628
for err != nil && currentSize > 0 {
649
629
if ! strings .Contains (err .Error (), "timeout" ) {
650
630
return err
651
631
}
652
632
653
633
instanceGroup , err := config .clientComputeBeta .InstanceGroups .Get (
654
- zonalID . Project , zonalID . Zone , zonalID . Name ).Do ()
634
+ project , zone , name ).Do ()
655
635
if err != nil {
656
636
return fmt .Errorf ("Error getting instance group size: %s" , err )
657
637
}
@@ -664,7 +644,7 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
664
644
665
645
log .Printf ("[INFO] timeout occurred, but instance group is shrinking (%d < %d)" , instanceGroupSize , currentSize )
666
646
currentSize = instanceGroupSize
667
- err = computeSharedOperationWait (config .clientCompute , op , zonalID . Project , "Deleting InstanceGroupManager" )
647
+ err = computeSharedOperationWait (config .clientCompute , op , project , "Deleting InstanceGroupManager" )
668
648
}
669
649
670
650
d .SetId ("" )
@@ -673,43 +653,17 @@ func resourceComputeInstanceGroupManagerDelete(d *schema.ResourceData, meta inte
673
653
674
654
func resourceInstanceGroupManagerStateImporter (d * schema.ResourceData , meta interface {}) ([]* schema.ResourceData , error ) {
675
655
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 {
678
658
return nil , err
679
659
}
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
- }
698
660
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 )
714
665
}
666
+ d .SetId (id )
667
+
668
+ return []* schema.ResourceData {d }, nil
715
669
}
0 commit comments