From 6ec547507904b1d6bd05d55af73a381cc9428b78 Mon Sep 17 00:00:00 2001 From: Alex Stephen Date: Fri, 6 Dec 2019 22:51:26 +0000 Subject: [PATCH] Moving Ansible fingerprint to match TF Signed-off-by: Modular Magician --- google/resource_compute_subnetwork.go | 1271 +++++++++-------- .../docs/r/compute_subnetwork.html.markdown | 4 - 2 files changed, 640 insertions(+), 635 deletions(-) diff --git a/google/resource_compute_subnetwork.go b/google/resource_compute_subnetwork.go index 4338a2818c8..deb8a05057b 100644 --- a/google/resource_compute_subnetwork.go +++ b/google/resource_compute_subnetwork.go @@ -14,19 +14,6 @@ package google -import ( - "fmt" - "log" - "net" - "reflect" - "time" - - "github.com/apparentlymart/go-cidr/cidr" - "github.com/hashicorp/terraform-plugin-sdk/helper/customdiff" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/helper/validation" -) - // Whether the IP CIDR change shrinks the block. func isShrinkageIpCidr(old, new, _ interface{}) bool { _, oldCidr, oldErr := net.ParseCIDR(old.(string)) @@ -47,678 +34,683 @@ func isShrinkageIpCidr(old, new, _ interface{}) bool { return true } + func resourceComputeSubnetwork() *schema.Resource { - return &schema.Resource{ - Create: resourceComputeSubnetworkCreate, - Read: resourceComputeSubnetworkRead, - Update: resourceComputeSubnetworkUpdate, - Delete: resourceComputeSubnetworkDelete, - - Importer: &schema.ResourceImporter{ - State: resourceComputeSubnetworkImport, - }, - - Timeouts: &schema.ResourceTimeout{ - Create: schema.DefaultTimeout(6 * time.Minute), - Update: schema.DefaultTimeout(6 * time.Minute), - Delete: schema.DefaultTimeout(6 * time.Minute), - }, - - CustomizeDiff: customdiff.All( - customdiff.ForceNewIfChange("ip_cidr_range", isShrinkageIpCidr), - resourceComputeSubnetworkSecondaryIpRangeSetStyleDiff, - ), - - Schema: map[string]*schema.Schema{ - "ip_cidr_range": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validateIpCidrRange, - Description: `The range of internal addresses that are owned by this subnetwork. + return &schema.Resource{ + Create: resourceComputeSubnetworkCreate, + Read: resourceComputeSubnetworkRead, + Update: resourceComputeSubnetworkUpdate, + Delete: resourceComputeSubnetworkDelete, + + Importer: &schema.ResourceImporter{ + State: resourceComputeSubnetworkImport, + }, + + Timeouts: &schema.ResourceTimeout { + Create: schema.DefaultTimeout(6 * time.Minute), + Update: schema.DefaultTimeout(6 * time.Minute), + Delete: schema.DefaultTimeout(6 * time.Minute), + }, + + +CustomizeDiff: customdiff.All( + customdiff.ForceNewIfChange("ip_cidr_range", isShrinkageIpCidr), + resourceComputeSubnetworkSecondaryIpRangeSetStyleDiff, + ), + + Schema: map[string]*schema.Schema{ +"ip_cidr_range": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validateIpCidrRange, + Description: `The range of internal addresses that are owned by this subnetwork. Provide this property when you create the subnetwork. For example, 10.0.0.0/8 or 192.168.0.0/16. Ranges must be unique and non-overlapping within a network. Only IPv4 is supported.`, - }, - "name": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - ValidateFunc: validateGCPName, - Description: `The name of the resource, provided by the client when initially +}, +"name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validateGCPName, + Description: `The name of the resource, provided by the client when initially creating the resource. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression '[a-z]([-a-z0-9]*[a-z0-9])?' which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.`, - }, - "network": { - Type: schema.TypeString, - Required: true, - ForceNew: true, - DiffSuppressFunc: compareSelfLinkOrResourceName, - Description: `The network this subnet belongs to. +}, +"network": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + DiffSuppressFunc: compareSelfLinkOrResourceName, + Description: `The network this subnet belongs to. Only networks that are in the distributed mode can have subnetworks.`, - }, - "description": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - Description: `An optional description of this resource. Provide this property when +}, +"description": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: `An optional description of this resource. Provide this property when you create the resource. This field can be set only at resource creation time.`, - }, - "log_config": { - Type: schema.TypeList, - Optional: true, - Description: `Denotes the logging options for the subnetwork flow logs. If logging is enabled +}, +"log_config": { + Type: schema.TypeList, + Optional: true, + Description: `Denotes the logging options for the subnetwork flow logs. If logging is enabled logs will be exported to Stackdriver. This field cannot be set if the 'purpose' of this subnetwork is 'INTERNAL_HTTPS_LOAD_BALANCER'`, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "aggregation_interval": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{"INTERVAL_5_SEC", "INTERVAL_30_SEC", "INTERVAL_1_MIN", "INTERVAL_5_MIN", "INTERVAL_10_MIN", "INTERVAL_15_MIN", ""}, false), - Description: `Can only be specified if VPC flow logging for this subnetwork is enabled. + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "aggregation_interval": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{"INTERVAL_5_SEC","INTERVAL_30_SEC","INTERVAL_1_MIN","INTERVAL_5_MIN","INTERVAL_10_MIN","INTERVAL_15_MIN",""}, false), + Description: `Can only be specified if VPC flow logging for this subnetwork is enabled. Toggles the aggregation interval for collecting flow logs. Increasing the interval time will reduce the amount of generated flow logs for long lasting connections. Default is an interval of 5 seconds per connection. Possible values are INTERVAL_5_SEC, INTERVAL_30_SEC, INTERVAL_1_MIN, INTERVAL_5_MIN, INTERVAL_10_MIN, INTERVAL_15_MIN`, - Default: "INTERVAL_5_SEC", - AtLeastOneOf: []string{"log_config.0.aggregation_interval", "log_config.0.flow_sampling", "log_config.0.metadata"}, - }, - "flow_sampling": { - Type: schema.TypeFloat, - Optional: true, - Description: `Can only be specified if VPC flow logging for this subnetwork is enabled. + Default: "INTERVAL_5_SEC", + AtLeastOneOf: []string{"log_config.0.aggregation_interval", "log_config.0.flow_sampling", "log_config.0.metadata"}, +}, + "flow_sampling": { + Type: schema.TypeFloat, + Optional: true, + Description: `Can only be specified if VPC flow logging for this subnetwork is enabled. The value of the field must be in [0, 1]. Set the sampling rate of VPC flow logs within the subnetwork where 1.0 means all collected logs are reported and 0.0 means no logs are reported. Default is 0.5 which means half of all collected logs are reported.`, - Default: 0.5, - AtLeastOneOf: []string{"log_config.0.aggregation_interval", "log_config.0.flow_sampling", "log_config.0.metadata"}, - }, - "metadata": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{"EXCLUDE_ALL_METADATA", "INCLUDE_ALL_METADATA", ""}, false), - Description: `Can only be specified if VPC flow logging for this subnetwork is enabled. + Default: 0.5, + AtLeastOneOf: []string{"log_config.0.aggregation_interval", "log_config.0.flow_sampling", "log_config.0.metadata"}, +}, + "metadata": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringInSlice([]string{"EXCLUDE_ALL_METADATA","INCLUDE_ALL_METADATA",""}, false), + Description: `Can only be specified if VPC flow logging for this subnetwork is enabled. Configures whether metadata fields should be added to the reported VPC flow logs. Default is 'INCLUDE_ALL_METADATA'.`, - Default: "INCLUDE_ALL_METADATA", - AtLeastOneOf: []string{"log_config.0.aggregation_interval", "log_config.0.flow_sampling", "log_config.0.metadata"}, - }, - }, - }, - }, - "private_ip_google_access": { - Type: schema.TypeBool, - Optional: true, - Description: `When enabled, VMs in this subnetwork without external IP addresses can + Default: "INCLUDE_ALL_METADATA", + AtLeastOneOf: []string{"log_config.0.aggregation_interval", "log_config.0.flow_sampling", "log_config.0.metadata"}, +}, + }, + }, +}, +"private_ip_google_access": { + Type: schema.TypeBool, + Optional: true, + Description: `When enabled, VMs in this subnetwork without external IP addresses can access Google APIs and services by using Private Google Access.`, - }, - "region": { - Type: schema.TypeString, - Computed: true, - Optional: true, - ForceNew: true, - DiffSuppressFunc: compareSelfLinkOrResourceName, - Description: `URL of the GCP region for this subnetwork.`, - }, - "secondary_ip_range": { - Type: schema.TypeList, - Computed: true, - Optional: true, - ConfigMode: schema.SchemaConfigModeAttr, - Description: `An array of configurations for secondary IP ranges for VM instances +}, +"region": { + Type: schema.TypeString, + Computed: true, + Optional: true, + ForceNew: true, + DiffSuppressFunc: compareSelfLinkOrResourceName, + Description: `URL of the GCP region for this subnetwork.`, +}, +"secondary_ip_range": { + Type: schema.TypeList, + Computed: true, + Optional: true, + ConfigMode: schema.SchemaConfigModeAttr, + Description: `An array of configurations for secondary IP ranges for VM instances contained in this subnetwork. The primary IP of such VM must belong to the primary ipCidrRange of the subnetwork. The alias IPs may belong to either primary or secondary ranges. This field uses attr-as-block mode to avoid breaking users during the 0.12 upgrade. See [the Attr-as-Block page](https://www.terraform.io/docs/configuration/attr-as-blocks.html) for more details.`, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "ip_cidr_range": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validateIpCidrRange, - Description: `The range of IP addresses belonging to this subnetwork secondary + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "ip_cidr_range": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validateIpCidrRange, + Description: `The range of IP addresses belonging to this subnetwork secondary range. Provide this property when you create the subnetwork. Ranges must be unique and non-overlapping with all primary and secondary IP ranges within a network. Only IPv4 is supported.`, - }, - "range_name": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validateGCPName, - Description: `The name associated with this subnetwork secondary range, used +}, + "range_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validateGCPName, + Description: `The name associated with this subnetwork secondary range, used when adding an alias IP range to a VM instance. The name must be 1-63 characters long, and comply with RFC1035. The name must be unique within the subnetwork.`, - }, - }, - }, - }, - "creation_timestamp": { - Type: schema.TypeString, - Computed: true, - Description: `Creation timestamp in RFC3339 text format.`, - }, - "fingerprint": { - Type: schema.TypeString, - Computed: true, - Description: `Fingerprint of this resource. This field is used internally during -updates of this resource.`, - }, - "gateway_address": { - Type: schema.TypeString, - Computed: true, - Description: `The gateway address for default routes to reach destination addresses +}, + }, + }, + }, +"creation_timestamp": { + Type: schema.TypeString, + Computed: true, + Description: `Creation timestamp in RFC3339 text format.`, +}, +"gateway_address": { + Type: schema.TypeString, + Computed: true, + Description: `The gateway address for default routes to reach destination addresses outside this subnetwork.`, - }, - "enable_flow_logs": { - Type: schema.TypeBool, - Computed: true, - Optional: true, - Removed: "This field is being removed in favor of log_config. If log_config is present, flow logs are enabled. Please remove this field", - }, - "project": { - Type: schema.TypeString, - Optional: true, - Computed: true, - ForceNew: true, - }, - "self_link": { - Type: schema.TypeString, - Computed: true, - }, - }, - } +}, +"enable_flow_logs": { + Type: schema.TypeBool, + Computed: true, + Optional: true, + Removed: "This field is being removed in favor of log_config. If log_config is present, flow logs are enabled. Please remove this field", +}, +"fingerprint": { + Type: schema.TypeString, + Computed: true, + Description: `Fingerprint of this resource. This field is used internally during updates of this resource.`, + Deprecated: `This field is not useful for users, and has been removed as an output.` +}, + "project": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + }, + "self_link": { + Type: schema.TypeString, + Computed: true, + }, + }, + } } -func resourceComputeSubnetworkSecondaryIpRangeSetStyleDiff(diff *schema.ResourceDiff, meta interface{}) error { - keys := diff.GetChangedKeysPrefix("secondary_ip_range") - if len(keys) == 0 { - return nil - } - oldCount, newCount := diff.GetChange("secondary_ip_range.#") - var count int - // There could be duplicates - worth continuing even if the counts are unequal. - if oldCount.(int) < newCount.(int) { - count = newCount.(int) - } else { - count = oldCount.(int) - } - - if count < 1 { - return nil - } - old := make([]interface{}, count) - new := make([]interface{}, count) - for i := 0; i < count; i++ { - o, n := diff.GetChange(fmt.Sprintf("secondary_ip_range.%d", i)) - - if o != nil { - old = append(old, o) - } - if n != nil { - new = append(new, n) - } - } - oldSet := schema.NewSet(schema.HashResource(resourceComputeSubnetwork().Schema["secondary_ip_range"].Elem.(*schema.Resource)), old) - newSet := schema.NewSet(schema.HashResource(resourceComputeSubnetwork().Schema["secondary_ip_range"].Elem.(*schema.Resource)), new) - - if oldSet.Equal(newSet) { - if err := diff.Clear("secondary_ip_range"); err != nil { - return err - } - } - - return nil +func resourceComputeSubnetworkSecondaryIpRangeSetStyleDiff(diff *schema.ResourceDiff, meta interface{}) error { +keys := diff.GetChangedKeysPrefix("secondary_ip_range") +if len(keys) == 0 { + return nil +} +oldCount, newCount := diff.GetChange("secondary_ip_range.#") +var count int +// There could be duplicates - worth continuing even if the counts are unequal. +if oldCount.(int) < newCount.(int) { + count = newCount.(int) +} else { + count = oldCount.(int) } -func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) - - obj := make(map[string]interface{}) - descriptionProp, err := expandComputeSubnetworkDescription(d.Get("description"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("description"); !isEmptyValue(reflect.ValueOf(descriptionProp)) && (ok || !reflect.DeepEqual(v, descriptionProp)) { - obj["description"] = descriptionProp - } - ipCidrRangeProp, err := expandComputeSubnetworkIpCidrRange(d.Get("ip_cidr_range"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("ip_cidr_range"); !isEmptyValue(reflect.ValueOf(ipCidrRangeProp)) && (ok || !reflect.DeepEqual(v, ipCidrRangeProp)) { - obj["ipCidrRange"] = ipCidrRangeProp - } - nameProp, err := expandComputeSubnetworkName(d.Get("name"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { - obj["name"] = nameProp - } - networkProp, err := expandComputeSubnetworkNetwork(d.Get("network"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("network"); !isEmptyValue(reflect.ValueOf(networkProp)) && (ok || !reflect.DeepEqual(v, networkProp)) { - obj["network"] = networkProp - } - fingerprintProp, err := expandComputeSubnetworkFingerprint(d.Get("fingerprint"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("fingerprint"); !isEmptyValue(reflect.ValueOf(fingerprintProp)) && (ok || !reflect.DeepEqual(v, fingerprintProp)) { - obj["fingerprint"] = fingerprintProp - } - secondaryIpRangesProp, err := expandComputeSubnetworkSecondaryIpRange(d.Get("secondary_ip_range"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("secondary_ip_range"); ok || !reflect.DeepEqual(v, secondaryIpRangesProp) { - obj["secondaryIpRanges"] = secondaryIpRangesProp - } - privateIpGoogleAccessProp, err := expandComputeSubnetworkPrivateIpGoogleAccess(d.Get("private_ip_google_access"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("private_ip_google_access"); !isEmptyValue(reflect.ValueOf(privateIpGoogleAccessProp)) && (ok || !reflect.DeepEqual(v, privateIpGoogleAccessProp)) { - obj["privateIpGoogleAccess"] = privateIpGoogleAccessProp - } - regionProp, err := expandComputeSubnetworkRegion(d.Get("region"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("region"); !isEmptyValue(reflect.ValueOf(regionProp)) && (ok || !reflect.DeepEqual(v, regionProp)) { - obj["region"] = regionProp - } - logConfigProp, err := expandComputeSubnetworkLogConfig(d.Get("log_config"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("log_config"); ok || !reflect.DeepEqual(v, logConfigProp) { - obj["logConfig"] = logConfigProp - } - - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks") - if err != nil { - return err - } - - log.Printf("[DEBUG] Creating new Subnetwork: %#v", obj) - project, err := getProject(d, config) - if err != nil { - return err - } - res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutCreate)) - if err != nil { - return fmt.Errorf("Error creating Subnetwork: %s", err) - } +if count < 1 { + return nil +} +old := make([]interface{}, count) +new := make([]interface{}, count) +for i := 0; i < count; i++ { + o, n := diff.GetChange(fmt.Sprintf("secondary_ip_range.%d", i)) - // Store the ID now - id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return fmt.Errorf("Error constructing id: %s", err) - } - d.SetId(id) + if o != nil { + old = append(old, o) + } + if n != nil { + new = append(new, n) + } +} - err = computeOperationWaitTime( - config, res, project, "Creating Subnetwork", - int(d.Timeout(schema.TimeoutCreate).Minutes())) +oldSet := schema.NewSet(schema.HashResource(resourceComputeSubnetwork().Schema["secondary_ip_range"].Elem.(*schema.Resource)), old) +newSet := schema.NewSet(schema.HashResource(resourceComputeSubnetwork().Schema["secondary_ip_range"].Elem.(*schema.Resource)), new) - if err != nil { - // The resource didn't actually create - d.SetId("") - return fmt.Errorf("Error waiting to create Subnetwork: %s", err) - } +if oldSet.Equal(newSet) { + if err := diff.Clear("secondary_ip_range"); err != nil { + return err + } +} - log.Printf("[DEBUG] Finished creating Subnetwork %q: %#v", d.Id(), res) +return nil} - return resourceComputeSubnetworkRead(d, meta) +func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) error { + config := meta.(*Config) + + obj := make(map[string]interface{}) + descriptionProp, err := expandComputeSubnetworkDescription(d.Get( "description" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("description"); !isEmptyValue(reflect.ValueOf(descriptionProp)) && (ok || !reflect.DeepEqual(v, descriptionProp)) { + obj["description"] = descriptionProp + } + ipCidrRangeProp, err := expandComputeSubnetworkIpCidrRange(d.Get( "ip_cidr_range" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("ip_cidr_range"); !isEmptyValue(reflect.ValueOf(ipCidrRangeProp)) && (ok || !reflect.DeepEqual(v, ipCidrRangeProp)) { + obj["ipCidrRange"] = ipCidrRangeProp + } + nameProp, err := expandComputeSubnetworkName(d.Get( "name" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) { + obj["name"] = nameProp + } + networkProp, err := expandComputeSubnetworkNetwork(d.Get( "network" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("network"); !isEmptyValue(reflect.ValueOf(networkProp)) && (ok || !reflect.DeepEqual(v, networkProp)) { + obj["network"] = networkProp + } + secondaryIpRangesProp, err := expandComputeSubnetworkSecondaryIpRange(d.Get( "secondary_ip_range" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("secondary_ip_range"); ok || !reflect.DeepEqual(v, secondaryIpRangesProp) { + obj["secondaryIpRanges"] = secondaryIpRangesProp + } + privateIpGoogleAccessProp, err := expandComputeSubnetworkPrivateIpGoogleAccess(d.Get( "private_ip_google_access" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("private_ip_google_access"); !isEmptyValue(reflect.ValueOf(privateIpGoogleAccessProp)) && (ok || !reflect.DeepEqual(v, privateIpGoogleAccessProp)) { + obj["privateIpGoogleAccess"] = privateIpGoogleAccessProp + } + regionProp, err := expandComputeSubnetworkRegion(d.Get( "region" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("region"); !isEmptyValue(reflect.ValueOf(regionProp)) && (ok || !reflect.DeepEqual(v, regionProp)) { + obj["region"] = regionProp + } + logConfigProp, err := expandComputeSubnetworkLogConfig(d.Get( "log_config" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("log_config"); ok || !reflect.DeepEqual(v, logConfigProp) { + obj["logConfig"] = logConfigProp + } + + + + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks") + if err != nil { + return err + } + + log.Printf("[DEBUG] Creating new Subnetwork: %#v", obj) + project, err := getProject(d, config) + if err != nil { + return err + } + res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutCreate) ) + if err != nil { + return fmt.Errorf("Error creating Subnetwork: %s", err) + } + + // Store the ID now + id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return fmt.Errorf("Error constructing id: %s", err) + } + d.SetId(id) + + err = computeOperationWaitTime( + config, res, project, "Creating Subnetwork", + int(d.Timeout(schema.TimeoutCreate).Minutes())) + + if err != nil { + // The resource didn't actually create + d.SetId("") + return fmt.Errorf("Error waiting to create Subnetwork: %s", err) + } + + log.Printf("[DEBUG] Finished creating Subnetwork %q: %#v", d.Id(), res) + + + return resourceComputeSubnetworkRead(d, meta) } func resourceComputeSubnetworkRead(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) - - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return err - } - - project, err := getProject(d, config) - if err != nil { - return err - } - res, err := sendRequest(config, "GET", project, url, nil) - if err != nil { - return handleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id())) - } - - if err := d.Set("project", project); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - - if err := d.Set("creation_timestamp", flattenComputeSubnetworkCreationTimestamp(res["creationTimestamp"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("description", flattenComputeSubnetworkDescription(res["description"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("gateway_address", flattenComputeSubnetworkGatewayAddress(res["gatewayAddress"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("ip_cidr_range", flattenComputeSubnetworkIpCidrRange(res["ipCidrRange"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("name", flattenComputeSubnetworkName(res["name"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("network", flattenComputeSubnetworkNetwork(res["network"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("fingerprint", flattenComputeSubnetworkFingerprint(res["fingerprint"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("secondary_ip_range", flattenComputeSubnetworkSecondaryIpRange(res["secondaryIpRanges"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("private_ip_google_access", flattenComputeSubnetworkPrivateIpGoogleAccess(res["privateIpGoogleAccess"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("region", flattenComputeSubnetworkRegion(res["region"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("log_config", flattenComputeSubnetworkLogConfig(res["logConfig"], d)); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - if err := d.Set("self_link", ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil { - return fmt.Errorf("Error reading Subnetwork: %s", err) - } - - return nil + config := meta.(*Config) + + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return err + } + + project, err := getProject(d, config) + if err != nil { + return err + } + res, err := sendRequest(config, "GET", project, url, nil) + if err != nil { + return handleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id())) + } + + + + + if err := d.Set("project", project); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + + + if err := d.Set("creation_timestamp", flattenComputeSubnetworkCreationTimestamp(res["creationTimestamp"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("description", flattenComputeSubnetworkDescription(res["description"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("gateway_address", flattenComputeSubnetworkGatewayAddress(res["gatewayAddress"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("ip_cidr_range", flattenComputeSubnetworkIpCidrRange(res["ipCidrRange"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("name", flattenComputeSubnetworkName(res["name"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("network", flattenComputeSubnetworkNetwork(res["network"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("secondary_ip_range", flattenComputeSubnetworkSecondaryIpRange(res["secondaryIpRanges"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("private_ip_google_access", flattenComputeSubnetworkPrivateIpGoogleAccess(res["privateIpGoogleAccess"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("region", flattenComputeSubnetworkRegion(res["region"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("log_config", flattenComputeSubnetworkLogConfig(res["logConfig"], d)); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + if err := d.Set("self_link", ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil { + return fmt.Errorf("Error reading Subnetwork: %s", err) + } + + return nil } func resourceComputeSubnetworkUpdate(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) - - project, err := getProject(d, config) - if err != nil { - return err - } - - d.Partial(true) - - if d.HasChange("ip_cidr_range") { - obj := make(map[string]interface{}) - - ipCidrRangeProp, err := expandComputeSubnetworkIpCidrRange(d.Get("ip_cidr_range"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("ip_cidr_range"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, ipCidrRangeProp)) { - obj["ipCidrRange"] = ipCidrRangeProp - } - - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}/expandIpCidrRange") - if err != nil { - return err - } - res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) - } - - err = computeOperationWaitTime( - config, res, project, "Updating Subnetwork", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - if err != nil { - return err - } - - d.SetPartial("ip_cidr_range") - } - if d.HasChange("secondary_ip_range") { - obj := make(map[string]interface{}) - - getUrl, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return err - } - - project, err := getProject(d, config) - if err != nil { - return err - } - getRes, err := sendRequest(config, "GET", project, getUrl, nil) - if err != nil { - return handleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id())) - } - - obj["fingerprint"] = getRes["fingerprint"] - - secondaryIpRangesProp, err := expandComputeSubnetworkSecondaryIpRange(d.Get("secondary_ip_range"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("secondary_ip_range"); ok || !reflect.DeepEqual(v, secondaryIpRangesProp) { - obj["secondaryIpRanges"] = secondaryIpRangesProp - } - - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return err - } - res, err := sendRequestWithTimeout(config, "PATCH", project, url, obj, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) - } - - err = computeOperationWaitTime( - config, res, project, "Updating Subnetwork", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - if err != nil { - return err - } - - d.SetPartial("secondary_ip_range") - } - if d.HasChange("private_ip_google_access") { - obj := make(map[string]interface{}) - - privateIpGoogleAccessProp, err := expandComputeSubnetworkPrivateIpGoogleAccess(d.Get("private_ip_google_access"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("private_ip_google_access"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, privateIpGoogleAccessProp)) { - obj["privateIpGoogleAccess"] = privateIpGoogleAccessProp - } - - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}/setPrivateIpGoogleAccess") - if err != nil { - return err - } - res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) - } - - err = computeOperationWaitTime( - config, res, project, "Updating Subnetwork", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - if err != nil { - return err - } - - d.SetPartial("private_ip_google_access") - } - if d.HasChange("log_config") { - obj := make(map[string]interface{}) - - getUrl, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return err - } - - project, err := getProject(d, config) - if err != nil { - return err - } - getRes, err := sendRequest(config, "GET", project, getUrl, nil) - if err != nil { - return handleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id())) - } - - obj["fingerprint"] = getRes["fingerprint"] - - logConfigProp, err := expandComputeSubnetworkLogConfig(d.Get("log_config"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("log_config"); ok || !reflect.DeepEqual(v, logConfigProp) { - obj["logConfig"] = logConfigProp - } - - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return err - } - res, err := sendRequestWithTimeout(config, "PATCH", project, url, obj, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) - } - - err = computeOperationWaitTime( - config, res, project, "Updating Subnetwork", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - if err != nil { - return err - } - - d.SetPartial("log_config") - } - - d.Partial(false) - - return resourceComputeSubnetworkRead(d, meta) + config := meta.(*Config) + + project, err := getProject(d, config) + if err != nil { + return err + } + + d.Partial(true) + +if d.HasChange("ip_cidr_range") { + obj := make(map[string]interface{}) + + ipCidrRangeProp, err := expandComputeSubnetworkIpCidrRange(d.Get( "ip_cidr_range" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("ip_cidr_range"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, ipCidrRangeProp)) { + obj["ipCidrRange"] = ipCidrRangeProp + } + + + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}/expandIpCidrRange") + if err != nil { + return err + } + res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) + } + + err = computeOperationWaitTime( + config, res, project, "Updating Subnetwork", + int(d.Timeout(schema.TimeoutUpdate).Minutes())) + if err != nil { + return err + } + + d.SetPartial("ip_cidr_range") + } +if d.HasChange("secondary_ip_range") { + obj := make(map[string]interface{}) + + getUrl, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return err + } + + project, err := getProject(d, config) + if err != nil { + return err + } + getRes, err := sendRequest(config, "GET", project, getUrl, nil) + if err != nil { + return handleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id())) + } + + obj["fingerprint"] = getRes["fingerprint"] + + secondaryIpRangesProp, err := expandComputeSubnetworkSecondaryIpRange(d.Get( "secondary_ip_range" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("secondary_ip_range"); ok || !reflect.DeepEqual(v, secondaryIpRangesProp) { + obj["secondaryIpRanges"] = secondaryIpRangesProp + } + + + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return err + } + res, err := sendRequestWithTimeout(config, "PATCH", project, url, obj, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) + } + + err = computeOperationWaitTime( + config, res, project, "Updating Subnetwork", + int(d.Timeout(schema.TimeoutUpdate).Minutes())) + if err != nil { + return err + } + + d.SetPartial("secondary_ip_range") + } +if d.HasChange("private_ip_google_access") { + obj := make(map[string]interface{}) + + privateIpGoogleAccessProp, err := expandComputeSubnetworkPrivateIpGoogleAccess(d.Get( "private_ip_google_access" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("private_ip_google_access"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, privateIpGoogleAccessProp)) { + obj["privateIpGoogleAccess"] = privateIpGoogleAccessProp + } + + + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}/setPrivateIpGoogleAccess") + if err != nil { + return err + } + res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) + } + + err = computeOperationWaitTime( + config, res, project, "Updating Subnetwork", + int(d.Timeout(schema.TimeoutUpdate).Minutes())) + if err != nil { + return err + } + + d.SetPartial("private_ip_google_access") + } +if d.HasChange("log_config") { + obj := make(map[string]interface{}) + + getUrl, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return err + } + + project, err := getProject(d, config) + if err != nil { + return err + } + getRes, err := sendRequest(config, "GET", project, getUrl, nil) + if err != nil { + return handleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id())) + } + + obj["fingerprint"] = getRes["fingerprint"] + + logConfigProp, err := expandComputeSubnetworkLogConfig(d.Get( "log_config" ), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("log_config"); ok || !reflect.DeepEqual(v, logConfigProp) { + obj["logConfig"] = logConfigProp + } + + + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return err + } + res, err := sendRequestWithTimeout(config, "PATCH", project, url, obj, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err) + } + + err = computeOperationWaitTime( + config, res, project, "Updating Subnetwork", + int(d.Timeout(schema.TimeoutUpdate).Minutes())) + if err != nil { + return err + } + + d.SetPartial("log_config") + } + + d.Partial(false) + + return resourceComputeSubnetworkRead(d, meta) } func resourceComputeSubnetworkDelete(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) + config := meta.(*Config) - project, err := getProject(d, config) - if err != nil { - return err - } + project, err := getProject(d, config) + if err != nil { + return err + } - url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return err - } - var obj map[string]interface{} - log.Printf("[DEBUG] Deleting Subnetwork %q", d.Id()) + url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return err + } - res, err := sendRequestWithTimeout(config, "DELETE", project, url, obj, d.Timeout(schema.TimeoutDelete)) - if err != nil { - return handleNotFoundError(err, d, "Subnetwork") - } + var obj map[string]interface{} + log.Printf("[DEBUG] Deleting Subnetwork %q", d.Id()) - err = computeOperationWaitTime( - config, res, project, "Deleting Subnetwork", - int(d.Timeout(schema.TimeoutDelete).Minutes())) + res, err := sendRequestWithTimeout(config, "DELETE", project, url, obj, d.Timeout(schema.TimeoutDelete)) + if err != nil { + return handleNotFoundError(err, d, "Subnetwork") + } - if err != nil { - return err - } - log.Printf("[DEBUG] Finished deleting Subnetwork %q: %#v", d.Id(), res) - return nil + err = computeOperationWaitTime( + config, res, project, "Deleting Subnetwork", + int(d.Timeout(schema.TimeoutDelete).Minutes())) + + if err != nil { + return err + } + + log.Printf("[DEBUG] Finished deleting Subnetwork %q: %#v", d.Id(), res) + return nil } func resourceComputeSubnetworkImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { - config := meta.(*Config) - if err := parseImportId([]string{ - "projects/(?P[^/]+)/regions/(?P[^/]+)/subnetworks/(?P[^/]+)", - "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", - "(?P[^/]+)/(?P[^/]+)", - "(?P[^/]+)", - }, d, config); err != nil { - return nil, err - } + config := meta.(*Config) + if err := parseImportId([]string{ + "projects/(?P[^/]+)/regions/(?P[^/]+)/subnetworks/(?P[^/]+)", + "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", + "(?P[^/]+)/(?P[^/]+)", + "(?P[^/]+)", + }, d, config); err != nil { + return nil, err + } - // Replace import id for the resource id - id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") - if err != nil { - return nil, fmt.Errorf("Error constructing id: %s", err) - } - d.SetId(id) + // Replace import id for the resource id + id, err := replaceVars(d, config, "projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") + if err != nil { + return nil, fmt.Errorf("Error constructing id: %s", err) + } + d.SetId(id) - return []*schema.ResourceData{d}, nil + + return []*schema.ResourceData{d}, nil } func flattenComputeSubnetworkCreationTimestamp(v interface{}, d *schema.ResourceData) interface{} { - return v + return v } func flattenComputeSubnetworkDescription(v interface{}, d *schema.ResourceData) interface{} { - return v + return v } func flattenComputeSubnetworkGatewayAddress(v interface{}, d *schema.ResourceData) interface{} { - return v + return v } func flattenComputeSubnetworkIpCidrRange(v interface{}, d *schema.ResourceData) interface{} { - return v + return v } func flattenComputeSubnetworkName(v interface{}, d *schema.ResourceData) interface{} { - return v + return v } func flattenComputeSubnetworkNetwork(v interface{}, d *schema.ResourceData) interface{} { - if v == nil { - return v - } - return ConvertSelfLinkToV1(v.(string)) -} - -func flattenComputeSubnetworkFingerprint(v interface{}, d *schema.ResourceData) interface{} { - return v + if v == nil { + return v + } + return ConvertSelfLinkToV1(v.(string)) } func flattenComputeSubnetworkSecondaryIpRange(v interface{}, d *schema.ResourceData) interface{} { - if v == nil { - return v - } - l := v.([]interface{}) - transformed := make([]interface{}, 0, len(l)) - for _, raw := range l { - original := raw.(map[string]interface{}) - if len(original) < 1 { - // Do not include empty json objects coming back from the api - continue - } - transformed = append(transformed, map[string]interface{}{ - "range_name": flattenComputeSubnetworkSecondaryIpRangeRangeName(original["rangeName"], d), - "ip_cidr_range": flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(original["ipCidrRange"], d), - }) - } - return transformed -} -func flattenComputeSubnetworkSecondaryIpRangeRangeName(v interface{}, d *schema.ResourceData) interface{} { - return v -} - -func flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(v interface{}, d *schema.ResourceData) interface{} { - return v -} + if v == nil { + return v + } + l := v.([]interface{}) + transformed := make([]interface{}, 0, len(l)) + for _, raw := range l { + original := raw.(map[string]interface{}) + if len(original) < 1 { + // Do not include empty json objects coming back from the api + continue + } + transformed = append(transformed, map[string]interface{}{ + "range_name": flattenComputeSubnetworkSecondaryIpRangeRangeName(original["rangeName"], d), + "ip_cidr_range": flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(original["ipCidrRange"], d), + }) + } + return transformed +} + func flattenComputeSubnetworkSecondaryIpRangeRangeName(v interface{}, d *schema.ResourceData) interface{} { + return v +} + + func flattenComputeSubnetworkSecondaryIpRangeIpCidrRange(v interface{}, d *schema.ResourceData) interface{} { + return v +} + + func flattenComputeSubnetworkPrivateIpGoogleAccess(v interface{}, d *schema.ResourceData) interface{} { - return v + return v } func flattenComputeSubnetworkRegion(v interface{}, d *schema.ResourceData) interface{} { - if v == nil { - return v - } + if v == nil { + return v + } return NameFromSelfLinkStateFunc(v) } @@ -743,77 +735,94 @@ func flattenComputeSubnetworkLogConfig(v interface{}, d *schema.ResourceData) in return []interface{}{transformed} } + + + func expandComputeSubnetworkDescription(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil + return v, nil } + + func expandComputeSubnetworkIpCidrRange(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil + return v, nil } + + func expandComputeSubnetworkName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil + return v, nil } + + func expandComputeSubnetworkNetwork(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - f, err := parseGlobalFieldValue("networks", v.(string), "project", d, config, true) - if err != nil { - return nil, fmt.Errorf("Invalid value for network: %s", err) - } - return f.RelativeLink(), nil + f, err := parseGlobalFieldValue("networks", v.(string), "project", d, config, true) + if err != nil { + return nil, fmt.Errorf("Invalid value for network: %s", err) + } + return f.RelativeLink(), nil } -func expandComputeSubnetworkFingerprint(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil -} + func expandComputeSubnetworkSecondaryIpRange(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - l := v.([]interface{}) - req := make([]interface{}, 0, len(l)) - for _, raw := range l { - if raw == nil { - continue - } - original := raw.(map[string]interface{}) - transformed := make(map[string]interface{}) - - transformedRangeName, err := expandComputeSubnetworkSecondaryIpRangeRangeName(original["range_name"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedRangeName); val.IsValid() && !isEmptyValue(val) { - transformed["rangeName"] = transformedRangeName - } + l := v.([]interface{}) + req := make([]interface{}, 0, len(l)) + for _, raw := range l { + if raw == nil { + continue + } + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) - transformedIpCidrRange, err := expandComputeSubnetworkSecondaryIpRangeIpCidrRange(original["ip_cidr_range"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedIpCidrRange); val.IsValid() && !isEmptyValue(val) { - transformed["ipCidrRange"] = transformedIpCidrRange - } + transformedRangeName, err := expandComputeSubnetworkSecondaryIpRangeRangeName(original["range_name"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedRangeName); val.IsValid() && !isEmptyValue(val) { + transformed["rangeName"] = transformedRangeName } - req = append(req, transformed) - } - return req, nil + transformedIpCidrRange, err := expandComputeSubnetworkSecondaryIpRangeIpCidrRange(original["ip_cidr_range"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedIpCidrRange); val.IsValid() && !isEmptyValue(val) { + transformed["ipCidrRange"] = transformedIpCidrRange } + + req = append(req, transformed) + } + return req, nil } + + + + + func expandComputeSubnetworkSecondaryIpRangeRangeName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil + return v, nil } + + + func expandComputeSubnetworkSecondaryIpRangeIpCidrRange(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil + return v, nil } + + func expandComputeSubnetworkPrivateIpGoogleAccess(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil + return v, nil } + + func expandComputeSubnetworkRegion(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - f, err := parseGlobalFieldValue("regions", v.(string), "project", d, config, true) - if err != nil { - return nil, fmt.Errorf("Invalid value for region: %s", err) - } - return f.RelativeLink(), nil + f, err := parseGlobalFieldValue("regions", v.(string), "project", d, config, true) + if err != nil { + return nil, fmt.Errorf("Invalid value for region: %s", err) + } + return f.RelativeLink(), nil } func expandComputeSubnetworkLogConfig(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { diff --git a/website/docs/r/compute_subnetwork.html.markdown b/website/docs/r/compute_subnetwork.html.markdown index 84c10cceedb..43a48f06514 100644 --- a/website/docs/r/compute_subnetwork.html.markdown +++ b/website/docs/r/compute_subnetwork.html.markdown @@ -252,10 +252,6 @@ In addition to the arguments listed above, the following computed attributes are * `gateway_address` - The gateway address for default routes to reach destination addresses outside this subnetwork. - -* `fingerprint` - - Fingerprint of this resource. This field is used internally during - updates of this resource. * `self_link` - The URI of the created resource.