2017-09-09 00:02:32 +00:00
package google
import (
2018-03-09 19:04:09 +00:00
"fmt"
"log"
2018-10-16 23:53:48 +00:00
"regexp"
2018-03-09 19:04:09 +00:00
"strings"
"time"
"github.com/hashicorp/terraform/helper/hashcode"
2017-12-14 21:35:39 +00:00
"github.com/hashicorp/terraform/helper/resource"
2017-09-09 00:02:32 +00:00
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/helper/validation"
2018-10-24 22:04:58 +00:00
2017-09-09 00:02:32 +00:00
computeBeta "google.golang.org/api/compute/v0.beta"
)
2018-10-16 23:53:48 +00:00
var (
regionInstanceGroupManagerIdRegex = regexp . MustCompile ( "^" + ProjectRegex + "/[a-z0-9-]+/[a-z0-9-]+$" )
regionInstanceGroupManagerIdNameRegex = regexp . MustCompile ( "^[a-z0-9-]+$" )
)
2017-09-09 00:02:32 +00:00
func resourceComputeRegionInstanceGroupManager ( ) * schema . Resource {
return & schema . Resource {
Create : resourceComputeRegionInstanceGroupManagerCreate ,
Read : resourceComputeRegionInstanceGroupManagerRead ,
Update : resourceComputeRegionInstanceGroupManagerUpdate ,
Delete : resourceComputeRegionInstanceGroupManagerDelete ,
Importer : & schema . ResourceImporter {
2018-03-21 19:39:12 +00:00
State : resourceRegionInstanceGroupManagerStateImporter ,
2017-09-09 00:02:32 +00:00
} ,
2017-12-14 21:35:39 +00:00
Timeouts : & schema . ResourceTimeout {
Create : schema . DefaultTimeout ( 5 * time . Minute ) ,
Update : schema . DefaultTimeout ( 5 * time . Minute ) ,
Delete : schema . DefaultTimeout ( 15 * time . Minute ) ,
} ,
2017-09-09 00:02:32 +00:00
Schema : map [ string ] * schema . Schema {
"base_instance_name" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
ForceNew : true ,
} ,
"instance_template" : & schema . Schema {
Type : schema . TypeString ,
2018-07-25 20:21:20 +00:00
Optional : true ,
2017-09-09 00:02:32 +00:00
DiffSuppressFunc : compareSelfLinkRelativePaths ,
} ,
2018-07-25 20:21:20 +00:00
"version" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeList ,
Optional : true ,
Computed : true ,
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-07-25 20:21:20 +00:00
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"name" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-07-25 20:21:20 +00:00
} ,
"instance_template" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-07-25 20:21:20 +00:00
DiffSuppressFunc : compareSelfLinkRelativePaths ,
} ,
"target_size" : & schema . Schema {
Type : schema . TypeList ,
Optional : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-07-25 20:21:20 +00:00
MaxItems : 1 ,
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"fixed" : & schema . Schema {
Type : schema . TypeInt ,
Optional : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-07-25 20:21:20 +00:00
} ,
"percent" : & schema . Schema {
Type : schema . TypeInt ,
Optional : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-07-25 20:21:20 +00:00
ValidateFunc : validation . IntBetween ( 0 , 100 ) ,
} ,
} ,
} ,
} ,
} ,
} ,
} ,
2017-09-09 00:02:32 +00:00
"name" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
ForceNew : true ,
} ,
"region" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
ForceNew : true ,
} ,
"description" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
} ,
"fingerprint" : & schema . Schema {
Type : schema . TypeString ,
Computed : true ,
} ,
"instance_group" : & schema . Schema {
Type : schema . TypeString ,
Computed : true ,
} ,
"named_port" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeSet ,
2017-09-09 00:02:32 +00:00
Optional : true ,
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"name" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
} ,
"port" : & schema . Schema {
Type : schema . TypeInt ,
Required : true ,
} ,
} ,
} ,
} ,
"project" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
Computed : true ,
} ,
"self_link" : & schema . Schema {
Type : schema . TypeString ,
Computed : true ,
} ,
2018-03-23 20:51:30 +00:00
"update_strategy" : & schema . Schema {
Type : schema . TypeString ,
2018-11-20 23:35:04 +00:00
Deprecated : "This field is deprecated as it has no functionality anymore. It will be removed in 3.0.0." ,
2018-03-23 20:51:30 +00:00
Optional : true ,
2018-11-20 23:35:04 +00:00
Computed : true ,
2018-03-23 20:51:30 +00:00
ValidateFunc : validation . StringInSlice ( [ ] string { "NONE" , "ROLLING_UPDATE" } , false ) ,
} ,
2017-09-09 00:02:32 +00:00
"target_pools" : & schema . Schema {
Type : schema . TypeSet ,
Optional : true ,
Elem : & schema . Schema {
Type : schema . TypeString ,
} ,
Set : selfLinkRelativePathHash ,
} ,
"target_size" : & schema . Schema {
Type : schema . TypeInt ,
Computed : true ,
Optional : true ,
} ,
2017-12-14 21:35:39 +00:00
// If true, the resource will report ready only after no instances are being created.
// This will not block future reads if instances are being recreated, and it respects
// the "createNoRetry" parameter that's available for this resource.
"wait_for_instances" : & schema . Schema {
Type : schema . TypeBool ,
Optional : true ,
Default : false ,
} ,
2017-09-09 00:02:32 +00:00
"auto_healing_policies" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeList ,
Optional : true ,
MaxItems : 1 ,
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2017-09-09 00:02:32 +00:00
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"health_check" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2017-09-09 00:02:32 +00:00
DiffSuppressFunc : compareSelfLinkRelativePaths ,
} ,
"initial_delay_sec" : & schema . Schema {
Type : schema . TypeInt ,
Required : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2017-09-09 00:02:32 +00:00
ValidateFunc : validation . IntBetween ( 0 , 3600 ) ,
} ,
} ,
} ,
} ,
2018-03-09 19:04:09 +00:00
"distribution_policy_zones" : & schema . Schema {
Type : schema . TypeSet ,
Optional : true ,
ForceNew : true ,
Computed : true ,
Set : hashZoneFromSelfLinkOrResourceName ,
Elem : & schema . Schema {
Type : schema . TypeString ,
DiffSuppressFunc : compareSelfLinkOrResourceName ,
} ,
} ,
2018-03-23 20:51:30 +00:00
"rolling_update_policy" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
Computed : true ,
Type : schema . TypeList ,
Optional : true ,
MaxItems : 1 ,
2018-03-23 20:51:30 +00:00
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"minimal_action" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-03-23 20:51:30 +00:00
ValidateFunc : validation . StringInSlice ( [ ] string { "RESTART" , "REPLACE" } , false ) ,
} ,
"type" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-03-23 20:51:30 +00:00
ValidateFunc : validation . StringInSlice ( [ ] string { "OPPORTUNISTIC" , "PROACTIVE" } , false ) ,
} ,
"max_surge_fixed" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeInt ,
Optional : true ,
Computed : true ,
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-03-23 20:51:30 +00:00
} ,
"max_surge_percent" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeInt ,
Optional : true ,
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
ValidateFunc : validation . IntBetween ( 0 , 100 ) ,
2018-03-23 20:51:30 +00:00
} ,
"max_unavailable_fixed" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeInt ,
Optional : true ,
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-03-23 20:51:30 +00:00
} ,
"max_unavailable_percent" : & schema . Schema {
2018-11-20 23:35:04 +00:00
Type : schema . TypeInt ,
Optional : true ,
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
ValidateFunc : validation . IntBetween ( 0 , 100 ) ,
2018-03-23 20:51:30 +00:00
} ,
"min_ready_sec" : & schema . Schema {
Type : schema . TypeInt ,
2018-11-20 23:35:04 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
2018-03-23 20:51:30 +00:00
Optional : true ,
ValidateFunc : validation . IntBetween ( 0 , 3600 ) ,
} ,
} ,
} ,
} ,
2017-09-09 00:02:32 +00:00
} ,
}
}
func resourceComputeRegionInstanceGroupManagerCreate ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-10-16 23:53:48 +00:00
region , err := getRegion ( d , config )
if err != nil {
return err
}
2017-09-09 00:02:32 +00:00
manager := & computeBeta . InstanceGroupManager {
2018-11-20 23:35:04 +00:00
Name : d . Get ( "name" ) . ( string ) ,
Description : d . Get ( "description" ) . ( string ) ,
BaseInstanceName : d . Get ( "base_instance_name" ) . ( string ) ,
InstanceTemplate : d . Get ( "instance_template" ) . ( string ) ,
TargetSize : int64 ( d . Get ( "target_size" ) . ( int ) ) ,
NamedPorts : getNamedPortsBeta ( d . Get ( "named_port" ) . ( * schema . Set ) . List ( ) ) ,
TargetPools : convertStringSet ( d . Get ( "target_pools" ) . ( * schema . Set ) ) ,
DistributionPolicy : expandDistributionPolicy ( d . Get ( "distribution_policy_zones" ) . ( * schema . Set ) ) ,
2017-09-09 00:02:32 +00:00
// Force send TargetSize to allow size of 0.
ForceSendFields : [ ] string { "TargetSize" } ,
}
2018-10-16 23:53:48 +00:00
op , err := config . clientComputeBeta . RegionInstanceGroupManagers . Insert ( project , region , manager ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
return fmt . Errorf ( "Error creating RegionInstanceGroupManager: %s" , err )
}
2018-10-16 23:53:48 +00:00
d . SetId ( regionInstanceGroupManagerId { Project : project , Region : region , Name : manager . Name } . terraformId ( ) )
2017-09-09 00:02:32 +00:00
// Wait for the operation to complete
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Creating InstanceGroupManager" )
2017-09-09 00:02:32 +00:00
if err != nil {
return err
}
2017-12-14 21:35:39 +00:00
return resourceComputeRegionInstanceGroupManagerRead ( d , config )
2017-09-09 00:02:32 +00:00
}
2017-12-14 21:35:39 +00:00
type getInstanceManagerFunc func ( * schema . ResourceData , interface { } ) ( * computeBeta . InstanceGroupManager , error )
2018-03-20 21:20:43 +00:00
func getRegionalManager ( d * schema . ResourceData , meta interface { } ) ( * computeBeta . InstanceGroupManager , error ) {
2017-09-09 00:02:32 +00:00
config := meta . ( * Config )
2018-10-16 23:53:48 +00:00
regionalID , err := parseRegionInstanceGroupManagerId ( d . Id ( ) )
2017-09-09 00:02:32 +00:00
if err != nil {
2017-12-14 21:35:39 +00:00
return nil , err
2017-09-09 00:02:32 +00:00
}
2018-10-16 23:53:48 +00:00
if regionalID . Project == "" {
regionalID . Project , err = getProject ( d , config )
if err != nil {
return nil , err
}
}
if regionalID . Region == "" {
regionalID . Region , err = getRegion ( d , config )
if err != nil {
return nil , err
}
2018-05-08 18:23:35 +00:00
}
2017-09-09 00:02:32 +00:00
2018-10-16 23:53:48 +00:00
manager , err := config . clientComputeBeta . RegionInstanceGroupManagers . Get ( regionalID . Project , regionalID . Region , regionalID . Name ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
2018-10-16 23:53:48 +00:00
return nil , handleNotFoundError ( err , d , fmt . Sprintf ( "Region Instance Manager %q" , regionalID . Name ) )
2017-09-09 00:02:32 +00:00
}
2018-05-09 18:24:40 +00:00
2017-12-14 21:35:39 +00:00
return manager , nil
}
func waitForInstancesRefreshFunc ( f getInstanceManagerFunc , d * schema . ResourceData , meta interface { } ) resource . StateRefreshFunc {
return func ( ) ( interface { } , string , error ) {
m , err := f ( d , meta )
if err != nil {
log . Printf ( "[WARNING] Error in fetching manager while waiting for instances to come up: %s\n" , err )
return nil , "error" , err
}
2018-03-20 21:20:43 +00:00
if done := m . CurrentActions . None ; done < m . TargetSize {
return done , "creating" , nil
2017-12-14 21:35:39 +00:00
} else {
2018-03-20 21:20:43 +00:00
return done , "created" , nil
2017-12-14 21:35:39 +00:00
}
}
}
func resourceComputeRegionInstanceGroupManagerRead ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2018-03-20 21:20:43 +00:00
manager , err := getRegionalManager ( d , meta )
2018-10-19 16:36:14 +00:00
if err != nil {
2017-12-14 21:35:39 +00:00
return err
}
2018-10-19 16:36:14 +00:00
if manager == nil {
log . Printf ( "[WARN] Region Instance Group Manager %q not found, removing from state." , d . Id ( ) )
d . SetId ( "" )
return nil
}
2017-12-14 21:35:39 +00:00
2018-10-16 23:53:48 +00:00
regionalID , err := parseRegionInstanceGroupManagerId ( d . Id ( ) )
2017-12-14 21:35:39 +00:00
if err != nil {
return err
}
2018-10-16 23:53:48 +00:00
if regionalID . Project == "" {
regionalID . Project , err = getProject ( d , config )
if err != nil {
return err
}
}
2017-09-09 00:02:32 +00:00
d . Set ( "base_instance_name" , manager . BaseInstanceName )
2018-10-19 16:36:14 +00:00
d . Set ( "instance_template" , ConvertSelfLinkToV1 ( manager . InstanceTemplate ) )
2018-11-20 23:35:04 +00:00
2017-09-09 00:02:32 +00:00
d . Set ( "name" , manager . Name )
d . Set ( "region" , GetResourceNameFromSelfLink ( manager . Region ) )
d . Set ( "description" , manager . Description )
2018-10-16 23:53:48 +00:00
d . Set ( "project" , regionalID . Project )
2017-09-09 00:02:32 +00:00
d . Set ( "target_size" , manager . TargetSize )
2018-10-19 16:36:14 +00:00
if err := d . Set ( "target_pools" , manager . TargetPools ) ; err != nil {
return fmt . Errorf ( "Error setting target_pools in state: %s" , err . Error ( ) )
}
if err := d . Set ( "named_port" , flattenNamedPortsBeta ( manager . NamedPorts ) ) ; err != nil {
return fmt . Errorf ( "Error setting named_port in state: %s" , err . Error ( ) )
}
2017-09-09 00:02:32 +00:00
d . Set ( "fingerprint" , manager . Fingerprint )
2018-05-30 22:25:07 +00:00
d . Set ( "instance_group" , ConvertSelfLinkToV1 ( manager . InstanceGroup ) )
2018-03-09 19:04:09 +00:00
if err := d . Set ( "distribution_policy_zones" , flattenDistributionPolicy ( manager . DistributionPolicy ) ) ; err != nil {
return err
}
2017-09-09 00:02:32 +00:00
d . Set ( "self_link" , ConvertSelfLinkToV1 ( manager . SelfLink ) )
2018-11-20 23:35:04 +00:00
// When we make a list Removed, we see a permadiff from `field_name.#: "" => "<computed>"`. Set to nil in Read so we see no diff.
d . Set ( "version" , nil )
d . Set ( "rolling_update_policy" , nil )
2017-09-09 00:02:32 +00:00
2017-12-14 21:35:39 +00:00
if d . Get ( "wait_for_instances" ) . ( bool ) {
conf := resource . StateChangeConf {
Pending : [ ] string { "creating" , "error" } ,
Target : [ ] string { "created" } ,
2018-03-20 21:20:43 +00:00
Refresh : waitForInstancesRefreshFunc ( getRegionalManager , d , meta ) ,
2017-12-14 21:35:39 +00:00
Timeout : d . Timeout ( schema . TimeoutCreate ) ,
}
_ , err := conf . WaitForState ( )
2018-03-20 21:20:43 +00:00
if err != nil {
return err
}
2017-12-14 21:35:39 +00:00
}
2017-09-09 00:02:32 +00:00
return nil
}
func resourceComputeRegionInstanceGroupManagerUpdate ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-10-16 23:53:48 +00:00
region , err := getRegion ( d , config )
if err != nil {
return err
}
2017-09-09 00:02:32 +00:00
d . Partial ( true )
if d . HasChange ( "target_pools" ) {
targetPools := convertStringSet ( d . Get ( "target_pools" ) . ( * schema . Set ) )
// Build the parameter
setTargetPools := & computeBeta . RegionInstanceGroupManagersSetTargetPoolsRequest {
Fingerprint : d . Get ( "fingerprint" ) . ( string ) ,
TargetPools : targetPools ,
}
2018-05-09 18:24:40 +00:00
op , err := config . clientComputeBeta . RegionInstanceGroupManagers . SetTargetPools (
2018-10-16 23:53:48 +00:00
project , region , d . Get ( "name" ) . ( string ) , setTargetPools ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
return fmt . Errorf ( "Error updating RegionInstanceGroupManager: %s" , err )
}
// Wait for the operation to complete
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Updating RegionInstanceGroupManager" )
2017-09-09 00:02:32 +00:00
if err != nil {
return err
}
d . SetPartial ( "target_pools" )
}
if d . HasChange ( "instance_template" ) {
// Build the parameter
setInstanceTemplate := & computeBeta . RegionInstanceGroupManagersSetTemplateRequest {
InstanceTemplate : d . Get ( "instance_template" ) . ( string ) ,
}
2018-05-09 18:24:40 +00:00
op , err := config . clientComputeBeta . RegionInstanceGroupManagers . SetInstanceTemplate (
2018-10-16 23:53:48 +00:00
project , region , d . Get ( "name" ) . ( string ) , setInstanceTemplate ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
return fmt . Errorf ( "Error updating RegionInstanceGroupManager: %s" , err )
}
// Wait for the operation to complete
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Updating InstanceGroupManager" )
2017-09-09 00:02:32 +00:00
if err != nil {
return err
}
2018-07-25 20:21:20 +00:00
d . SetPartial ( "instance_template" )
}
2017-09-09 00:02:32 +00:00
if d . HasChange ( "named_port" ) {
// Build the parameters for a "SetNamedPorts" request:
2018-11-20 23:35:04 +00:00
namedPorts := getNamedPortsBeta ( d . Get ( "named_port" ) . ( * schema . Set ) . List ( ) )
2017-09-09 00:02:32 +00:00
setNamedPorts := & computeBeta . RegionInstanceGroupsSetNamedPortsRequest {
NamedPorts : namedPorts ,
}
// Make the request:
2018-05-09 18:24:40 +00:00
op , err := config . clientComputeBeta . RegionInstanceGroups . SetNamedPorts (
2018-10-16 23:53:48 +00:00
project , region , d . Get ( "name" ) . ( string ) , setNamedPorts ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
return fmt . Errorf ( "Error updating RegionInstanceGroupManager: %s" , err )
}
// Wait for the operation to complete:
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Updating RegionInstanceGroupManager" )
2017-09-09 00:02:32 +00:00
if err != nil {
return err
}
d . SetPartial ( "named_port" )
}
if d . HasChange ( "target_size" ) {
targetSize := int64 ( d . Get ( "target_size" ) . ( int ) )
2018-05-09 18:24:40 +00:00
op , err := config . clientComputeBeta . RegionInstanceGroupManagers . Resize (
2018-10-16 23:53:48 +00:00
project , region , d . Get ( "name" ) . ( string ) , targetSize ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
return fmt . Errorf ( "Error resizing RegionInstanceGroupManager: %s" , err )
}
// Wait for the operation to complete
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Resizing RegionInstanceGroupManager" )
2017-09-09 00:02:32 +00:00
if err != nil {
return err
}
d . SetPartial ( "target_size" )
}
d . Partial ( false )
return resourceComputeRegionInstanceGroupManagerRead ( d , meta )
}
func resourceComputeRegionInstanceGroupManagerDelete ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2018-10-16 23:53:48 +00:00
regionalID , err := parseRegionInstanceGroupManagerId ( d . Id ( ) )
2017-09-09 00:02:32 +00:00
if err != nil {
return err
}
2018-10-16 23:53:48 +00:00
if regionalID . Project == "" {
regionalID . Project , err = getProject ( d , config )
if err != nil {
return err
}
}
2017-09-09 00:02:32 +00:00
2018-10-16 23:53:48 +00:00
if regionalID . Region == "" {
regionalID . Region , err = getRegion ( d , config )
if err != nil {
return err
}
}
op , err := config . clientComputeBeta . RegionInstanceGroupManagers . Delete ( regionalID . Project , regionalID . Region , regionalID . Name ) . Do ( )
2017-09-09 00:02:32 +00:00
if err != nil {
return fmt . Errorf ( "Error deleting region instance group manager: %s" , err )
}
// Wait for the operation to complete
2018-10-16 23:53:48 +00:00
err = computeSharedOperationWaitTime ( config . clientCompute , op , regionalID . Project , int ( d . Timeout ( schema . TimeoutDelete ) . Minutes ( ) ) , "Deleting RegionInstanceGroupManager" )
2017-09-09 00:02:32 +00:00
d . SetId ( "" )
return nil
}
2018-03-09 19:04:09 +00:00
func expandDistributionPolicy ( configured * schema . Set ) * computeBeta . DistributionPolicy {
if configured . Len ( ) == 0 {
return nil
}
distributionPolicyZoneConfigs := make ( [ ] * computeBeta . DistributionPolicyZoneConfiguration , 0 , configured . Len ( ) )
for _ , raw := range configured . List ( ) {
data := raw . ( string )
distributionPolicyZoneConfig := computeBeta . DistributionPolicyZoneConfiguration {
Zone : "zones/" + data ,
}
distributionPolicyZoneConfigs = append ( distributionPolicyZoneConfigs , & distributionPolicyZoneConfig )
}
return & computeBeta . DistributionPolicy { Zones : distributionPolicyZoneConfigs }
}
func flattenDistributionPolicy ( distributionPolicy * computeBeta . DistributionPolicy ) [ ] string {
zones := make ( [ ] string , 0 )
if distributionPolicy != nil {
for _ , zone := range distributionPolicy . Zones {
zones = append ( zones , zone . Zone )
}
}
return zones
}
func hashZoneFromSelfLinkOrResourceName ( value interface { } ) int {
parts := strings . Split ( value . ( string ) , "/" )
resource := parts [ len ( parts ) - 1 ]
return hashcode . String ( resource )
}
2018-03-21 19:39:12 +00:00
func resourceRegionInstanceGroupManagerStateImporter ( d * schema . ResourceData , meta interface { } ) ( [ ] * schema . ResourceData , error ) {
d . Set ( "wait_for_instances" , false )
2018-10-16 23:53:48 +00:00
regionalID , err := parseRegionInstanceGroupManagerId ( d . Id ( ) )
if err != nil {
return nil , err
}
d . Set ( "project" , regionalID . Project )
d . Set ( "region" , regionalID . Region )
d . Set ( "name" , regionalID . Name )
2018-03-21 19:39:12 +00:00
return [ ] * schema . ResourceData { d } , nil
}
2018-10-16 23:53:48 +00:00
type regionInstanceGroupManagerId struct {
Project string
Region string
Name string
}
func ( r regionInstanceGroupManagerId ) terraformId ( ) string {
return fmt . Sprintf ( "%s/%s/%s" , r . Project , r . Region , r . Name )
}
func parseRegionInstanceGroupManagerId ( id string ) ( * regionInstanceGroupManagerId , error ) {
switch {
case regionInstanceGroupManagerIdRegex . MatchString ( id ) :
parts := strings . Split ( id , "/" )
return & regionInstanceGroupManagerId {
Project : parts [ 0 ] ,
Region : parts [ 1 ] ,
Name : parts [ 2 ] ,
} , nil
case regionInstanceGroupManagerIdNameRegex . MatchString ( id ) :
return & regionInstanceGroupManagerId {
Name : id ,
} , nil
default :
return nil , fmt . Errorf ( "Invalid region instance group manager specifier. Expecting either {projectId}/{region}/{name} or {name}, where {projectId} and {region} will be derived from the provider." )
}
}