Skip to content

Commit

Permalink
More handwritten ids (#2527)
Browse files Browse the repository at this point in the history
* Fix cloudfunction formatting, migrate RIGM id

* Update security policy resource id

* Update target pool id format

* Add new id for container cluster

* Node pool id updates

* PR feedback, using parseImportId for container resources

* Formatting
  • Loading branch information
slevenick authored and rileykarson committed Nov 11, 2019
1 parent 8b34b16 commit 7a3f106
Show file tree
Hide file tree
Showing 12 changed files with 150 additions and 233 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,11 @@ func resourceComputeRegionInstanceGroupManagerCreate(d *schema.ResourceData, met
return fmt.Errorf("Error creating RegionInstanceGroupManager: %s", err)
}

d.SetId(regionInstanceGroupManagerId{Project: project, Region: region, Name: manager.Name}.terraformId())
id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/instanceGroupManagers/{{name}}")
if err != nil {
return fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)

// Wait for the operation to complete
timeoutInMinutes := int(d.Timeout(schema.TimeoutCreate).Minutes())
Expand All @@ -400,28 +404,20 @@ type getInstanceManagerFunc func(*schema.ResourceData, interface{}) (*computeBet
func getRegionalManager(d *schema.ResourceData, meta interface{}) (*computeBeta.InstanceGroupManager, error) {
config := meta.(*Config)

regionalID, err := parseRegionInstanceGroupManagerId(d.Id())
project, err := getProject(d, config)
if err != nil {
return nil, err
}

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
}
region, err := getRegion(d, config)
if err != nil {
return nil, err
}

manager, err := config.clientComputeBeta.RegionInstanceGroupManagers.Get(regionalID.Project, regionalID.Region, regionalID.Name).Do()
name := d.Get("name").(string)
manager, err := config.clientComputeBeta.RegionInstanceGroupManagers.Get(project, region, name).Do()
if err != nil {
return nil, handleNotFoundError(err, d, fmt.Sprintf("Region Instance Manager %q", regionalID.Name))
return nil, handleNotFoundError(err, d, fmt.Sprintf("Region Instance Manager %q", name))
}

return manager, nil
Expand Down Expand Up @@ -454,16 +450,10 @@ func resourceComputeRegionInstanceGroupManagerRead(d *schema.ResourceData, meta
return nil
}

regionalID, err := parseRegionInstanceGroupManagerId(d.Id())
project, err := getProject(d, config)
if err != nil {
return err
}
if regionalID.Project == "" {
regionalID.Project, err = getProject(d, config)
if err != nil {
return err
}
}

d.Set("base_instance_name", manager.BaseInstanceName)
<% if version == 'ga' -%>
Expand All @@ -472,7 +462,7 @@ func resourceComputeRegionInstanceGroupManagerRead(d *schema.ResourceData, meta
d.Set("name", manager.Name)
d.Set("region", GetResourceNameFromSelfLink(manager.Region))
d.Set("description", manager.Description)
d.Set("project", regionalID.Project)
d.Set("project", project)
d.Set("target_size", manager.TargetSize)
if err := d.Set("target_pools", mapStringArr(manager.TargetPools, ConvertSelfLinkToV1)); err != nil {
return fmt.Errorf("Error setting target_pools in state: %s", err.Error())
Expand Down Expand Up @@ -646,34 +636,27 @@ func resourceComputeRegionInstanceGroupManagerUpdate(d *schema.ResourceData, met
func resourceComputeRegionInstanceGroupManagerDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)

regionalID, err := parseRegionInstanceGroupManagerId(d.Id())
project, err := getProject(d, config)
if err != nil {
return err
}

if regionalID.Project == "" {
regionalID.Project, err = getProject(d, config)
if err != nil {
return err
}
region, err := getRegion(d, config)
if err != nil {
return err
}

if regionalID.Region == "" {
regionalID.Region, err = getRegion(d, config)
if err != nil {
return err
}
}
name := d.Get("name").(string)

op, err := config.clientComputeBeta.RegionInstanceGroupManagers.Delete(regionalID.Project, regionalID.Region, regionalID.Name).Do()
op, err := config.clientComputeBeta.RegionInstanceGroupManagers.Delete(project, region, name).Do()

if err != nil {
return fmt.Errorf("Error deleting region instance group manager: %s", err)
}

// Wait for the operation to complete
timeoutInMinutes := int(d.Timeout(schema.TimeoutDelete).Minutes())
err = computeSharedOperationWaitTime(config.clientCompute, op, regionalID.Project, timeoutInMinutes, "Deleting RegionInstanceGroupManager")
err = computeSharedOperationWaitTime(config.clientCompute, op, project, timeoutInMinutes, "Deleting RegionInstanceGroupManager")
if err != nil {
return fmt.Errorf("Error waiting for delete to complete: %s", err)
}
Expand Down Expand Up @@ -795,40 +778,17 @@ func hashZoneFromSelfLinkOrResourceName(value interface{}) int {

func resourceRegionInstanceGroupManagerStateImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
d.Set("wait_for_instances", false)
regionalID, err := parseRegionInstanceGroupManagerId(d.Id())
if err != nil {
config := meta.(*Config)
if err := parseImportId([]string{"projects/(?P<project>[^/]+)/regions/(?P<region>[^/]+)/instanceGroupManagers/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<name>[^/]+)", "(?P<region>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil {
return nil, err
}
d.Set("project", regionalID.Project)
d.Set("region", regionalID.Region)
d.Set("name", regionalID.Name)
return []*schema.ResourceData{d}, nil
}

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.")
// Replace import id for the resource id
id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/instanceGroupManagers/{{name}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)

return []*schema.ResourceData{d}, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func resourceComputeSecurityPolicy() *schema.Resource {
Update: resourceComputeSecurityPolicyUpdate,
Delete: resourceComputeSecurityPolicyDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
State: resourceSecurityPolicyStateImporter,
},

Timeouts: &schema.ResourceTimeout{
Expand Down Expand Up @@ -148,7 +148,11 @@ func resourceComputeSecurityPolicyCreate(d *schema.ResourceData, meta interface{
return errwrap.Wrapf("Error creating SecurityPolicy: {{err}}", err)
}

d.SetId(securityPolicy.Name)
id, err := replaceVars(d, config, "projects/{{project}}/global/securityPolicies/{{name}}")
if err != nil {
return fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)

err = computeSharedOperationWaitTime(config.clientCompute, op, project, int(d.Timeout(schema.TimeoutCreate).Minutes()), fmt.Sprintf("Creating SecurityPolicy %q", sp))
if err != nil {
Expand All @@ -166,7 +170,8 @@ func resourceComputeSecurityPolicyRead(d *schema.ResourceData, meta interface{})
return err
}

securityPolicy, err := config.clientComputeBeta.SecurityPolicies.Get(project, d.Id()).Do()
sp := d.Get("name").(string)
securityPolicy, err := config.clientComputeBeta.SecurityPolicies.Get(project, sp).Do()
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("SecurityPolicy %q", d.Id()))
}
Expand All @@ -191,7 +196,7 @@ func resourceComputeSecurityPolicyUpdate(d *schema.ResourceData, meta interface{
return err
}

sp := d.Id()
sp := d.Get("name").(string)

if d.HasChange("description") {
securityPolicy := &compute.SecurityPolicy{
Expand Down Expand Up @@ -282,7 +287,7 @@ func resourceComputeSecurityPolicyDelete(d *schema.ResourceData, meta interface{
}

// Delete the SecurityPolicy
op, err := config.clientComputeBeta.SecurityPolicies.Delete(project, d.Id()).Do()
op, err := config.clientComputeBeta.SecurityPolicies.Delete(project, d.Get("name").(string)).Do()
if err != nil {
return errwrap.Wrapf("Error deleting SecurityPolicy: {{err}}", err)
}
Expand Down Expand Up @@ -363,3 +368,19 @@ func flattenSecurityPolicyRules(rules []*compute.SecurityPolicyRule) []map[strin
}
return rulesSchema
}

func resourceSecurityPolicyStateImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*Config)
if err := parseImportId([]string{"projects/(?P<project>[^/]+)/global/securityPolicies/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config); err != nil {
return nil, err
}

// Replace import id for the resource id
id, err := replaceVars(d, config, "projects/{{project}}/global/securityPolicies/{{name}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)

return []*schema.ResourceData{d}, nil
}
45 changes: 36 additions & 9 deletions third_party/terraform/resources/resource_compute_target_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func resourceComputeTargetPool() *schema.Resource {
Delete: resourceComputeTargetPoolDelete,
Update: resourceComputeTargetPoolUpdate,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
State: resourceTargetPoolStateImporter,
},

Schema: map[string]*schema.Schema{
Expand Down Expand Up @@ -207,7 +207,11 @@ func resourceComputeTargetPoolCreate(d *schema.ResourceData, meta interface{}) e
}

// It probably maybe worked, so store the ID now
d.SetId(tpool.Name)
id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/targetPools/{{name}}")
if err != nil {
return fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)

err = computeOperationWait(config.clientCompute, op, project, "Creating Target Pool")
if err != nil {
Expand All @@ -229,6 +233,8 @@ func resourceComputeTargetPoolUpdate(d *schema.ResourceData, meta interface{}) e
return err
}

name := d.Get("name").(string)

d.Partial(true)

if d.HasChange("health_checks") {
Expand All @@ -251,7 +257,7 @@ func resourceComputeTargetPoolUpdate(d *schema.ResourceData, meta interface{}) e
removeReq.HealthChecks[i] = &compute.HealthCheckReference{HealthCheck: v}
}
op, err := config.clientCompute.TargetPools.RemoveHealthCheck(
project, region, d.Id(), removeReq).Do()
project, region, name, removeReq).Do()
if err != nil {
return fmt.Errorf("Error updating health_check: %s", err)
}
Expand All @@ -267,7 +273,7 @@ func resourceComputeTargetPoolUpdate(d *schema.ResourceData, meta interface{}) e
addReq.HealthChecks[i] = &compute.HealthCheckReference{HealthCheck: v}
}
op, err = config.clientCompute.TargetPools.AddHealthCheck(
project, region, d.Id(), addReq).Do()
project, region, name, addReq).Do()
if err != nil {
return fmt.Errorf("Error updating health_check: %s", err)
}
Expand Down Expand Up @@ -301,7 +307,7 @@ func resourceComputeTargetPoolUpdate(d *schema.ResourceData, meta interface{}) e
addReq.Instances[i] = &compute.InstanceReference{Instance: v}
}
op, err := config.clientCompute.TargetPools.AddInstance(
project, region, d.Id(), addReq).Do()
project, region, name, addReq).Do()
if err != nil {
return fmt.Errorf("Error updating instances: %s", err)
}
Expand All @@ -317,7 +323,7 @@ func resourceComputeTargetPoolUpdate(d *schema.ResourceData, meta interface{}) e
removeReq.Instances[i] = &compute.InstanceReference{Instance: v}
}
op, err = config.clientCompute.TargetPools.RemoveInstance(
project, region, d.Id(), removeReq).Do()
project, region, name, removeReq).Do()
if err != nil {
return fmt.Errorf("Error updating instances: %s", err)
}
Expand All @@ -334,7 +340,7 @@ func resourceComputeTargetPoolUpdate(d *schema.ResourceData, meta interface{}) e
Target: bpool_name,
}
op, err := config.clientCompute.TargetPools.SetBackup(
project, region, d.Id(), tref).Do()
project, region, name, tref).Do()
if err != nil {
return fmt.Errorf("Error updating backup_pool: %s", err)
}
Expand Down Expand Up @@ -375,7 +381,7 @@ func resourceComputeTargetPoolRead(d *schema.ResourceData, meta interface{}) err
}

tpool, err := config.clientCompute.TargetPools.Get(
project, region, d.Id()).Do()
project, region, d.Get("name").(string)).Do()
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("Target Pool %q", d.Get("name").(string)))
}
Expand Down Expand Up @@ -412,7 +418,7 @@ func resourceComputeTargetPoolDelete(d *schema.ResourceData, meta interface{}) e

// Delete the TargetPool
op, err := config.clientCompute.TargetPools.Delete(
project, region, d.Id()).Do()
project, region, d.Get("name").(string)).Do()
if err != nil {
return fmt.Errorf("Error deleting TargetPool: %s", err)
}
Expand All @@ -424,3 +430,24 @@ func resourceComputeTargetPoolDelete(d *schema.ResourceData, meta interface{}) e
d.SetId("")
return nil
}

func resourceTargetPoolStateImporter(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*Config)
if err := parseImportId([]string{
"projects/(?P<project>[^/]+)/regions/(?P<region>[^/]+)/targetPools/(?P<name>[^/]+)",
"(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<name>[^/]+)",
"(?P<region>[^/]+)/(?P<name>[^/]+)",
"(?P<name>[^/]+)",
}, d, config); err != nil {
return nil, err
}

// Replace import id for the resource id
id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/targetPools/{{name}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)

return []*schema.ResourceData{d}, nil
}
Loading

0 comments on commit 7a3f106

Please sign in to comment.