diff --git a/.changelog/8670.txt b/.changelog/8670.txt new file mode 100644 index 00000000000..8ec013c0699 --- /dev/null +++ b/.changelog/8670.txt @@ -0,0 +1,3 @@ +```release-note:none + +``` diff --git a/google/fwmodels/provider_model.go b/google/fwmodels/provider_model.go index 0e1426f6d55..01ab6150489 100644 --- a/google/fwmodels/provider_model.go +++ b/google/fwmodels/provider_model.go @@ -22,6 +22,7 @@ type ProviderModel struct { UserProjectOverride types.Bool `tfsdk:"user_project_override"` RequestTimeout types.String `tfsdk:"request_timeout"` RequestReason types.String `tfsdk:"request_reason"` + DefaultLabels types.Map `tfsdk:"default_labels"` // Generated Products AccessApprovalCustomEndpoint types.String `tfsdk:"access_approval_custom_endpoint"` diff --git a/google/fwprovider/framework_provider.go b/google/fwprovider/framework_provider.go index adad083ed6e..9a721787114 100644 --- a/google/fwprovider/framework_provider.go +++ b/google/fwprovider/framework_provider.go @@ -111,6 +111,10 @@ func (p *FrameworkProvider) Schema(_ context.Context, _ provider.SchemaRequest, "request_reason": schema.StringAttribute{ Optional: true, }, + "default_labels": schema.MapAttribute{ + Optional: true, + ElementType: types.StringType, + }, // Generated Products "access_approval_custom_endpoint": &schema.StringAttribute{ diff --git a/google/provider/provider.go b/google/provider/provider.go index 3183ba94c81..c3660911916 100644 --- a/google/provider/provider.go +++ b/google/provider/provider.go @@ -219,6 +219,12 @@ func Provider() *schema.Provider { Optional: true, }, + "default_labels": { + Type: schema.TypeMap, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + // Generated Products "access_approval_custom_endpoint": { Type: schema.TypeString, @@ -1691,6 +1697,13 @@ func ProviderConfigure(ctx context.Context, d *schema.ResourceData, p *schema.Pr config.Scopes[i] = scope.(string) } + config.DefaultLabels = make(map[string]string) + defaultLabels := d.Get("default_labels").(map[string]interface{}) + + for k, v := range defaultLabels { + config.DefaultLabels[k] = v.(string) + } + batchCfg, err := transport_tpg.ExpandProviderBatchingConfig(d.Get("batching")) if err != nil { return nil, diag.FromErr(err) diff --git a/google/services/bigquery/resource_bigquery_dataset.go b/google/services/bigquery/resource_bigquery_dataset.go index df91db2ce51..6d2f2de5000 100644 --- a/google/services/bigquery/resource_bigquery_dataset.go +++ b/google/services/bigquery/resource_bigquery_dataset.go @@ -77,6 +77,7 @@ func ResourceBigQueryDataset() *schema.Resource { }, CustomizeDiff: customdiff.All( + tpgresource.SetTerraformLabelsDiff, tpgresource.DefaultProviderProject, ), @@ -256,6 +257,13 @@ epoch.`, Description: `The date when this dataset or any of its tables was last modified, in milliseconds since the epoch.`, }, + "terraform_labels": { + Type: schema.TypeMap, + Computed: true, + Description: `The combination of labels configured directly on the resource + and default labels configured on the provider.`, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "delete_contents_on_destroy": { Type: schema.TypeBool, Optional: true, @@ -480,12 +488,6 @@ func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) err } else if v, ok := d.GetOkExists("friendly_name"); ok || !reflect.DeepEqual(v, friendlyNameProp) { obj["friendlyName"] = friendlyNameProp } - labelsProp, err := expandBigQueryDatasetLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } locationProp, err := expandBigQueryDatasetLocation(d.Get("location"), d, config) if err != nil { return err @@ -516,6 +518,12 @@ func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) err } else if v, ok := d.GetOkExists("storage_billing_model"); !tpgresource.IsEmptyValue(reflect.ValueOf(storageBillingModelProp)) && (ok || !reflect.DeepEqual(v, storageBillingModelProp)) { obj["storageBillingModel"] = storageBillingModelProp } + labelsProp, err := expandBigQueryDatasetTerraformLabels(d.Get("terraform_labels"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + obj["labels"] = labelsProp + } url, err := tpgresource.ReplaceVars(d, config, "{{BigQueryBasePath}}projects/{{project}}/datasets") if err != nil { @@ -667,6 +675,9 @@ func resourceBigQueryDatasetRead(d *schema.ResourceData, meta interface{}) error if err := d.Set("storage_billing_model", flattenBigQueryDatasetStorageBillingModel(res["storageBillingModel"], d, config)); err != nil { return fmt.Errorf("Error reading Dataset: %s", err) } + if err := d.Set("terraform_labels", flattenBigQueryDatasetTerraformLabels(res["labels"], d, config)); err != nil { + return fmt.Errorf("Error reading Dataset: %s", err) + } if err := d.Set("effective_labels", flattenBigQueryDatasetEffectiveLabels(res["labels"], d, config)); err != nil { return fmt.Errorf("Error reading Dataset: %s", err) } @@ -735,12 +746,6 @@ func resourceBigQueryDatasetUpdate(d *schema.ResourceData, meta interface{}) err } else if v, ok := d.GetOkExists("friendly_name"); ok || !reflect.DeepEqual(v, friendlyNameProp) { obj["friendlyName"] = friendlyNameProp } - labelsProp, err := expandBigQueryDatasetLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } locationProp, err := expandBigQueryDatasetLocation(d.Get("location"), d, config) if err != nil { return err @@ -771,6 +776,12 @@ func resourceBigQueryDatasetUpdate(d *schema.ResourceData, meta interface{}) err } else if v, ok := d.GetOkExists("storage_billing_model"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, storageBillingModelProp)) { obj["storageBillingModel"] = storageBillingModelProp } + labelsProp, err := expandBigQueryDatasetTerraformLabels(d.Get("terraform_labels"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + obj["labels"] = labelsProp + } url, err := tpgresource.ReplaceVars(d, config, "{{BigQueryBasePath}}projects/{{project}}/datasets/{{dataset_id}}") if err != nil { @@ -1173,6 +1184,21 @@ func flattenBigQueryDatasetStorageBillingModel(v interface{}, d *schema.Resource return v } +func flattenBigQueryDatasetTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + if v == nil { + return v + } + + transformed := make(map[string]interface{}) + if l, ok := d.GetOkExists("terraform_labels"); ok { + for k := range l.(map[string]interface{}) { + transformed[k] = v.(map[string]interface{})[k] + } + } + + return transformed +} + func flattenBigQueryDatasetEffectiveLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { return v } @@ -1459,17 +1485,6 @@ func expandBigQueryDatasetFriendlyName(v interface{}, d tpgresource.TerraformRes return v, nil } -func expandBigQueryDatasetLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) { - if v == nil { - return map[string]string{}, nil - } - m := make(map[string]string) - for k, val := range v.(map[string]interface{}) { - m[k] = val.(string) - } - return m, nil -} - func expandBigQueryDatasetLocation(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } @@ -1508,3 +1523,14 @@ func expandBigQueryDatasetDefaultCollation(v interface{}, d tpgresource.Terrafor func expandBigQueryDatasetStorageBillingModel(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } + +func expandBigQueryDatasetTerraformLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) { + if v == nil { + return map[string]string{}, nil + } + m := make(map[string]string) + for k, val := range v.(map[string]interface{}) { + m[k] = val.(string) + } + return m, nil +} diff --git a/google/services/bigquery/resource_bigquery_dataset_generated_test.go b/google/services/bigquery/resource_bigquery_dataset_generated_test.go index 2f900990f99..eadf8c28030 100644 --- a/google/services/bigquery/resource_bigquery_dataset_generated_test.go +++ b/google/services/bigquery/resource_bigquery_dataset_generated_test.go @@ -50,7 +50,7 @@ func TestAccBigQueryDataset_bigqueryDatasetBasicExample(t *testing.T) { ResourceName: "google_bigquery_dataset.dataset", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -105,7 +105,7 @@ func TestAccBigQueryDataset_bigqueryDatasetWithMaxTimeTravelHoursExample(t *test ResourceName: "google_bigquery_dataset.dataset", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -161,7 +161,7 @@ func TestAccBigQueryDataset_bigqueryDatasetAuthorizedDatasetExample(t *testing.T ResourceName: "google_bigquery_dataset.dataset", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -249,7 +249,7 @@ func TestAccBigQueryDataset_bigqueryDatasetAuthorizedRoutineExample(t *testing.T ResourceName: "google_bigquery_dataset.private", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -317,7 +317,7 @@ func TestAccBigQueryDataset_bigqueryDatasetCaseInsensitiveNamesExample(t *testin ResourceName: "google_bigquery_dataset.dataset", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -373,7 +373,7 @@ func TestAccBigQueryDataset_bigqueryDatasetDefaultCollationSetExample(t *testing ResourceName: "google_bigquery_dataset.dataset", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) diff --git a/google/services/bigquery/resource_bigquery_dataset_test.go b/google/services/bigquery/resource_bigquery_dataset_test.go index 984f3526003..50ec2b6f3d3 100644 --- a/google/services/bigquery/resource_bigquery_dataset_test.go +++ b/google/services/bigquery/resource_bigquery_dataset_test.go @@ -53,7 +53,7 @@ func TestAccBigQueryDataset_basic(t *testing.T) { ImportStateVerify: true, // The labels field in the state is decided by the configuration. // During importing, the configuration is unavailable, so the labels field in the state after importing is empty. - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccBigQueryDatasetUpdated(datasetID), @@ -71,7 +71,7 @@ func TestAccBigQueryDataset_basic(t *testing.T) { ResourceName: "google_bigquery_dataset.test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccBigQueryDatasetUpdated2(datasetID), @@ -80,7 +80,7 @@ func TestAccBigQueryDataset_basic(t *testing.T) { ResourceName: "google_bigquery_dataset.test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccBigQueryDataset_withoutLabels(datasetID), @@ -158,7 +158,7 @@ func TestAccBigQueryDataset_datasetWithContents(t *testing.T) { ResourceName: "google_bigquery_dataset.contents_test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"delete_contents_on_destroy", "labels"}, + ImportStateVerifyIgnore: []string{"delete_contents_on_destroy", "labels", "terraform_labels"}, }, }, }) @@ -183,7 +183,7 @@ func TestAccBigQueryDataset_access(t *testing.T) { ResourceName: "google_bigquery_dataset.access_test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccBigQueryDatasetWithTwoAccess(datasetID), @@ -192,7 +192,7 @@ func TestAccBigQueryDataset_access(t *testing.T) { ResourceName: "google_bigquery_dataset.access_test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccBigQueryDatasetWithOneAccess(datasetID), @@ -201,7 +201,7 @@ func TestAccBigQueryDataset_access(t *testing.T) { ResourceName: "google_bigquery_dataset.access_test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccBigQueryDatasetWithViewAccess(datasetID, otherDatasetID, otherTableID), @@ -210,7 +210,7 @@ func TestAccBigQueryDataset_access(t *testing.T) { ResourceName: "google_bigquery_dataset.access_test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -233,7 +233,7 @@ func TestAccBigQueryDataset_regionalLocation(t *testing.T) { ResourceName: "google_bigquery_dataset.test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) @@ -279,7 +279,7 @@ func TestAccBigQueryDataset_storageBillModel(t *testing.T) { ResourceName: "google_bigquery_dataset.test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"labels"}, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) diff --git a/google/services/compute/resource_compute_address.go b/google/services/compute/resource_compute_address.go index 6e8cc4a1706..c168a83139b 100644 --- a/google/services/compute/resource_compute_address.go +++ b/google/services/compute/resource_compute_address.go @@ -47,6 +47,7 @@ func ResourceComputeAddress() *schema.Resource { }, CustomizeDiff: customdiff.All( + tpgresource.SetTerraformLabelsDiff, tpgresource.DefaultProviderProject, ), diff --git a/google/services/compute/resource_compute_forwarding_rule.go b/google/services/compute/resource_compute_forwarding_rule.go index 81309a7175f..add073054b0 100644 --- a/google/services/compute/resource_compute_forwarding_rule.go +++ b/google/services/compute/resource_compute_forwarding_rule.go @@ -50,6 +50,7 @@ func ResourceComputeForwardingRule() *schema.Resource { }, CustomizeDiff: customdiff.All( + tpgresource.SetTerraformLabelsDiff, tpgresource.DefaultProviderProject, ), @@ -446,6 +447,12 @@ For Private Service Connect forwarding rules that forward traffic to managed ser Computed: true, Description: `Creation timestamp in RFC3339 text format.`, }, + "effective_labels": { + Type: schema.TypeMap, + Computed: true, + Description: `All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.`, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "label_fingerprint": { Type: schema.TypeString, Computed: true, @@ -469,6 +476,13 @@ internally during updates.`, This field is only used for INTERNAL load balancing.`, }, + "terraform_labels": { + Type: schema.TypeMap, + Computed: true, + Description: `The combination of labels configured directly on the resource + and default labels configured on the provider.`, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "project": { Type: schema.TypeString, Optional: true, @@ -570,12 +584,6 @@ func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{ } else if v, ok := d.GetOkExists("allow_global_access"); ok || !reflect.DeepEqual(v, allowGlobalAccessProp) { obj["allowGlobalAccess"] = allowGlobalAccessProp } - labelsProp, err := expandComputeForwardingRuleLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } labelFingerprintProp, err := expandComputeForwardingRuleLabelFingerprint(d.Get("label_fingerprint"), d, config) if err != nil { return err @@ -630,6 +638,12 @@ func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{ } else if v, ok := d.GetOkExists("ip_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipVersionProp)) && (ok || !reflect.DeepEqual(v, ipVersionProp)) { obj["ipVersion"] = ipVersionProp } + labelsProp, err := expandComputeForwardingRuleTerraformLabels(d.Get("terraform_labels"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + obj["labels"] = labelsProp + } regionProp, err := expandComputeForwardingRuleRegion(d.Get("region"), d, config) if err != nil { return err @@ -688,7 +702,8 @@ func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{ return fmt.Errorf("Error waiting to create ForwardingRule: %s", err) } - if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + labels := d.Get("labels") // Labels cannot be set in a create. We'll have to set them here. err = resourceComputeForwardingRuleRead(d, meta) if err != nil { @@ -696,8 +711,8 @@ func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{ } obj := make(map[string]interface{}) - // d.Get("labels") will have been overridden by the Read call. - labelsProp, err := expandComputeForwardingRuleLabels(v, d, config) + // d.Get("terraform_labels") will have been overridden by the Read call. + labelsProp, err := expandComputeForwardingRuleTerraformLabels(v, d, config) if err != nil { return err } @@ -730,9 +745,14 @@ func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{ } // Set back the labels field, as it is needed to decide the value of "labels" in the state in the read function. - if err := d.Set("labels", v); err != nil { + if err := d.Set("labels", labels); err != nil { return fmt.Errorf("Error setting back labels: %s", err) } + + // Set back the terraform_labels field, as it is needed to decide the value of "terraform_labels" in the state in the read function. + if err := d.Set("terraform_labels", v); err != nil { + return fmt.Errorf("Error setting back terraform_labels: %s", err) + } } log.Printf("[DEBUG] Finished creating ForwardingRule %q: %#v", d.Id(), res) @@ -862,6 +882,12 @@ func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{}) if err := d.Set("ip_version", flattenComputeForwardingRuleIpVersion(res["ipVersion"], d, config)); err != nil { return fmt.Errorf("Error reading ForwardingRule: %s", err) } + if err := d.Set("terraform_labels", flattenComputeForwardingRuleTerraformLabels(res["labels"], d, config)); err != nil { + return fmt.Errorf("Error reading ForwardingRule: %s", err) + } + if err := d.Set("effective_labels", flattenComputeForwardingRuleEffectiveLabels(res["labels"], d, config)); err != nil { + return fmt.Errorf("Error reading ForwardingRule: %s", err) + } if err := d.Set("region", flattenComputeForwardingRuleRegion(res["region"], d, config)); err != nil { return fmt.Errorf("Error reading ForwardingRule: %s", err) } @@ -975,21 +1001,21 @@ func resourceComputeForwardingRuleUpdate(d *schema.ResourceData, meta interface{ return err } } - if d.HasChange("labels") || d.HasChange("label_fingerprint") { + if d.HasChange("label_fingerprint") || d.HasChange("terraform_labels") { obj := make(map[string]interface{}) - labelsProp, err := expandComputeForwardingRuleLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } labelFingerprintProp, err := expandComputeForwardingRuleLabelFingerprint(d.Get("label_fingerprint"), d, config) if err != nil { return err } else if v, ok := d.GetOkExists("label_fingerprint"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelFingerprintProp)) { obj["labelFingerprint"] = labelFingerprintProp } + labelsProp, err := expandComputeForwardingRuleTerraformLabels(d.Get("terraform_labels"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + obj["labels"] = labelsProp + } url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/forwardingRules/{{name}}/setLabels") if err != nil { @@ -1183,7 +1209,18 @@ func flattenComputeForwardingRuleAllowGlobalAccess(v interface{}, d *schema.Reso } func flattenComputeForwardingRuleLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v + if v == nil { + return v + } + + transformed := make(map[string]interface{}) + if l, ok := d.GetOkExists("labels"); ok { + for k := range l.(map[string]interface{}) { + transformed[k] = v.(map[string]interface{})[k] + } + } + + return transformed } func flattenComputeForwardingRuleLabelFingerprint(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { @@ -1249,6 +1286,25 @@ func flattenComputeForwardingRuleIpVersion(v interface{}, d *schema.ResourceData return v } +func flattenComputeForwardingRuleTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + if v == nil { + return v + } + + transformed := make(map[string]interface{}) + if l, ok := d.GetOkExists("terraform_labels"); ok { + for k := range l.(map[string]interface{}) { + transformed[k] = v.(map[string]interface{})[k] + } + } + + return transformed +} + +func flattenComputeForwardingRuleEffectiveLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + return v +} + func flattenComputeForwardingRuleRegion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { if v == nil { return v @@ -1374,17 +1430,6 @@ func expandComputeForwardingRuleAllowGlobalAccess(v interface{}, d tpgresource.T return v, nil } -func expandComputeForwardingRuleLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) { - if v == nil { - return map[string]string{}, nil - } - m := make(map[string]string) - for k, val := range v.(map[string]interface{}) { - m[k] = val.(string) - } - return m, nil -} - func expandComputeForwardingRuleLabelFingerprint(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } @@ -1454,6 +1499,17 @@ func expandComputeForwardingRuleIpVersion(v interface{}, d tpgresource.Terraform return v, nil } +func expandComputeForwardingRuleTerraformLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) { + if v == nil { + return map[string]string{}, nil + } + m := make(map[string]string) + for k, val := range v.(map[string]interface{}) { + m[k] = val.(string) + } + return m, nil +} + func expandComputeForwardingRuleRegion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { f, err := tpgresource.ParseGlobalFieldValue("regions", v.(string), "project", d, config, true) if err != nil { diff --git a/google/services/compute/resource_compute_forwarding_rule_generated_test.go b/google/services/compute/resource_compute_forwarding_rule_generated_test.go index d74b20afffb..c3a31e46a73 100644 --- a/google/services/compute/resource_compute_forwarding_rule_generated_test.go +++ b/google/services/compute/resource_compute_forwarding_rule_generated_test.go @@ -49,7 +49,7 @@ func TestAccComputeForwardingRule_forwardingRuleGlobalInternallbExample(t *testi ResourceName: "google_compute_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region"}, }, }, }) @@ -113,7 +113,7 @@ func TestAccComputeForwardingRule_forwardingRuleBasicExample(t *testing.T) { ResourceName: "google_compute_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region", "port_range", "target"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region", "port_range", "target"}, }, }, }) @@ -152,7 +152,7 @@ func TestAccComputeForwardingRule_forwardingRuleInternallbExample(t *testing.T) ResourceName: "google_compute_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region", "port_range", "target"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region", "port_range", "target"}, }, }, }) @@ -222,7 +222,7 @@ func TestAccComputeForwardingRule_forwardingRuleVpcPscExample(t *testing.T) { ResourceName: "google_compute_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region", "port_range", "target", "ip_address"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region", "port_range", "target", "ip_address"}, }, }, }) @@ -346,7 +346,7 @@ func TestAccComputeForwardingRule_forwardingRuleVpcPscNoAutomateDnsExample(t *te ResourceName: "google_compute_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region", "port_range", "target", "ip_address"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region", "port_range", "target", "ip_address"}, }, }, }) @@ -466,7 +466,7 @@ func TestAccComputeForwardingRule_forwardingRuleRegionalSteeringExample(t *testi ResourceName: "google_compute_forwarding_rule.steering", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region"}, }, }, }) @@ -524,7 +524,7 @@ func TestAccComputeForwardingRule_forwardingRuleInternallbIpv6Example(t *testing ResourceName: "google_compute_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "no_automate_dns_zone", "region", "port_range", "target"}, + ImportStateVerifyIgnore: []string{"backend_service", "network", "subnetwork", "labels", "no_automate_dns_zone", "terraform_labels", "region", "port_range", "target"}, }, }, }) diff --git a/google/services/compute/resource_compute_forwarding_rule_test.go b/google/services/compute/resource_compute_forwarding_rule_test.go index fd04e0bc06b..e4241938893 100644 --- a/google/services/compute/resource_compute_forwarding_rule_test.go +++ b/google/services/compute/resource_compute_forwarding_rule_test.go @@ -25,17 +25,19 @@ func TestAccComputeForwardingRule_update(t *testing.T) { Config: testAccComputeForwardingRule_basic(poolName, ruleName), }, { - ResourceName: "google_compute_forwarding_rule.foobar", - ImportState: true, - ImportStateVerify: true, + ResourceName: "google_compute_forwarding_rule.foobar", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, { Config: testAccComputeForwardingRule_update(poolName, ruleName), }, { - ResourceName: "google_compute_forwarding_rule.foobar", - ImportState: true, - ImportStateVerify: true, + ResourceName: "google_compute_forwarding_rule.foobar", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"labels", "terraform_labels"}, }, }, }) diff --git a/google/services/compute/resource_compute_global_address.go b/google/services/compute/resource_compute_global_address.go index 07d8404a071..2ca4fb7b9a3 100644 --- a/google/services/compute/resource_compute_global_address.go +++ b/google/services/compute/resource_compute_global_address.go @@ -47,6 +47,7 @@ func ResourceComputeGlobalAddress() *schema.Resource { }, CustomizeDiff: customdiff.All( + tpgresource.SetTerraformLabelsDiff, tpgresource.DefaultProviderProject, ), diff --git a/google/services/compute/resource_compute_global_forwarding_rule.go b/google/services/compute/resource_compute_global_forwarding_rule.go index 6815e5a4dda..df0e68ac10c 100644 --- a/google/services/compute/resource_compute_global_forwarding_rule.go +++ b/google/services/compute/resource_compute_global_forwarding_rule.go @@ -50,6 +50,7 @@ func ResourceComputeGlobalForwardingRule() *schema.Resource { }, CustomizeDiff: customdiff.All( + tpgresource.SetTerraformLabelsDiff, tpgresource.DefaultProviderProject, ), @@ -329,6 +330,12 @@ mode or when creating external forwarding rule with IPv6.`, Computed: true, Description: `[Output Only] The URL for the corresponding base Forwarding Rule. By base Forwarding Rule, we mean the Forwarding Rule that has the same IP address, protocol, and port settings with the current Forwarding Rule, but without sourceIPRanges specified. Always empty if the current Forwarding Rule does not have sourceIPRanges specified.`, }, + "effective_labels": { + Type: schema.TypeMap, + Computed: true, + Description: `All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.`, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "label_fingerprint": { Type: schema.TypeString, Computed: true, @@ -345,6 +352,13 @@ internally during updates.`, Computed: true, Description: `The PSC connection status of the PSC Forwarding Rule. Possible values: 'STATUS_UNSPECIFIED', 'PENDING', 'ACCEPTED', 'REJECTED', 'CLOSED'`, }, + "terraform_labels": { + Type: schema.TypeMap, + Computed: true, + Description: `The combination of labels configured directly on the resource + and default labels configured on the provider.`, + Elem: &schema.Schema{Type: schema.TypeString}, + }, "project": { Type: schema.TypeString, Optional: true, @@ -392,12 +406,6 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte } else if v, ok := d.GetOkExists("ip_version"); !tpgresource.IsEmptyValue(reflect.ValueOf(ipVersionProp)) && (ok || !reflect.DeepEqual(v, ipVersionProp)) { obj["ipVersion"] = ipVersionProp } - labelsProp, err := expandComputeGlobalForwardingRuleLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } labelFingerprintProp, err := expandComputeGlobalForwardingRuleLabelFingerprint(d.Get("label_fingerprint"), d, config) if err != nil { return err @@ -458,6 +466,12 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte } else if v, ok := d.GetOkExists("no_automate_dns_zone"); ok || !reflect.DeepEqual(v, noAutomateDnsZoneProp) { obj["noAutomateDnsZone"] = noAutomateDnsZoneProp } + labelsProp, err := expandComputeGlobalForwardingRuleTerraformLabels(d.Get("terraform_labels"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + obj["labels"] = labelsProp + } url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/forwardingRules") if err != nil { @@ -510,7 +524,8 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte return fmt.Errorf("Error waiting to create GlobalForwardingRule: %s", err) } - if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + labels := d.Get("labels") // Labels cannot be set in a create. We'll have to set them here. err = resourceComputeGlobalForwardingRuleRead(d, meta) if err != nil { @@ -518,8 +533,8 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte } obj := make(map[string]interface{}) - // d.Get("labels") will have been overridden by the Read call. - labelsProp, err := expandComputeGlobalForwardingRuleLabels(v, d, config) + // d.Get("terraform_labels") will have been overridden by the Read call. + labelsProp, err := expandComputeGlobalForwardingRuleTerraformLabels(v, d, config) if err != nil { return err } @@ -552,9 +567,14 @@ func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta inte } // Set back the labels field, as it is needed to decide the value of "labels" in the state in the read function. - if err := d.Set("labels", v); err != nil { + if err := d.Set("labels", labels); err != nil { return fmt.Errorf("Error setting back labels: %s", err) } + + // Set back the terraform_labels field, as it is needed to decide the value of "terraform_labels" in the state in the read function. + if err := d.Set("terraform_labels", v); err != nil { + return fmt.Errorf("Error setting back terraform_labels: %s", err) + } } log.Printf("[DEBUG] Finished creating GlobalForwardingRule %q: %#v", d.Id(), res) @@ -654,6 +674,12 @@ func resourceComputeGlobalForwardingRuleRead(d *schema.ResourceData, meta interf if err := d.Set("base_forwarding_rule", flattenComputeGlobalForwardingRuleBaseForwardingRule(res["baseForwardingRule"], d, config)); err != nil { return fmt.Errorf("Error reading GlobalForwardingRule: %s", err) } + if err := d.Set("terraform_labels", flattenComputeGlobalForwardingRuleTerraformLabels(res["labels"], d, config)); err != nil { + return fmt.Errorf("Error reading GlobalForwardingRule: %s", err) + } + if err := d.Set("effective_labels", flattenComputeGlobalForwardingRuleEffectiveLabels(res["labels"], d, config)); err != nil { + return fmt.Errorf("Error reading GlobalForwardingRule: %s", err) + } if err := d.Set("self_link", tpgresource.ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil { return fmt.Errorf("Error reading GlobalForwardingRule: %s", err) } @@ -678,21 +704,21 @@ func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta inte d.Partial(true) - if d.HasChange("labels") || d.HasChange("label_fingerprint") { + if d.HasChange("label_fingerprint") || d.HasChange("terraform_labels") { obj := make(map[string]interface{}) - labelsProp, err := expandComputeGlobalForwardingRuleLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } labelFingerprintProp, err := expandComputeGlobalForwardingRuleLabelFingerprint(d.Get("label_fingerprint"), d, config) if err != nil { return err } else if v, ok := d.GetOkExists("label_fingerprint"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelFingerprintProp)) { obj["labelFingerprint"] = labelFingerprintProp } + labelsProp, err := expandComputeGlobalForwardingRuleTerraformLabels(d.Get("terraform_labels"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("terraform_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { + obj["labels"] = labelsProp + } url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/forwardingRules/{{name}}/setLabels") if err != nil { @@ -876,7 +902,18 @@ func flattenComputeGlobalForwardingRuleIpVersion(v interface{}, d *schema.Resour } func flattenComputeGlobalForwardingRuleLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v + if v == nil { + return v + } + + transformed := make(map[string]interface{}) + if l, ok := d.GetOkExists("labels"); ok { + for k := range l.(map[string]interface{}) { + transformed[k] = v.(map[string]interface{})[k] + } + } + + return transformed } func flattenComputeGlobalForwardingRuleLabelFingerprint(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { @@ -971,6 +1008,25 @@ func flattenComputeGlobalForwardingRuleBaseForwardingRule(v interface{}, d *sche return v } +func flattenComputeGlobalForwardingRuleTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + if v == nil { + return v + } + + transformed := make(map[string]interface{}) + if l, ok := d.GetOkExists("terraform_labels"); ok { + for k := range l.(map[string]interface{}) { + transformed[k] = v.(map[string]interface{})[k] + } + } + + return transformed +} + +func flattenComputeGlobalForwardingRuleEffectiveLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { + return v +} + func expandComputeGlobalForwardingRuleDescription(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } @@ -987,17 +1043,6 @@ func expandComputeGlobalForwardingRuleIpVersion(v interface{}, d tpgresource.Ter return v, nil } -func expandComputeGlobalForwardingRuleLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) { - if v == nil { - return map[string]string{}, nil - } - m := make(map[string]string) - for k, val := range v.(map[string]interface{}) { - m[k] = val.(string) - } - return m, nil -} - func expandComputeGlobalForwardingRuleLabelFingerprint(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } @@ -1111,3 +1156,14 @@ func expandComputeGlobalForwardingRuleSourceIpRanges(v interface{}, d tpgresourc func expandComputeGlobalForwardingRuleNoAutomateDnsZone(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { return v, nil } + +func expandComputeGlobalForwardingRuleTerraformLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) { + if v == nil { + return map[string]string{}, nil + } + m := make(map[string]string) + for k, val := range v.(map[string]interface{}) { + m[k] = val.(string) + } + return m, nil +} diff --git a/google/services/compute/resource_compute_global_forwarding_rule_generated_test.go b/google/services/compute/resource_compute_global_forwarding_rule_generated_test.go index fa3bd6bcae5..c278e848892 100644 --- a/google/services/compute/resource_compute_global_forwarding_rule_generated_test.go +++ b/google/services/compute/resource_compute_global_forwarding_rule_generated_test.go @@ -49,7 +49,7 @@ func TestAccComputeGlobalForwardingRule_globalForwardingRuleHttpExample(t *testi ResourceName: "google_compute_global_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"network", "subnetwork", "no_automate_dns_zone", "port_range", "target"}, + ImportStateVerifyIgnore: []string{"labels", "network", "subnetwork", "no_automate_dns_zone", "terraform_labels", "port_range", "target"}, }, }, }) @@ -127,7 +127,7 @@ func TestAccComputeGlobalForwardingRule_globalForwardingRuleExternalManagedExamp ResourceName: "google_compute_global_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"network", "subnetwork", "no_automate_dns_zone", "port_range", "target"}, + ImportStateVerifyIgnore: []string{"labels", "network", "subnetwork", "no_automate_dns_zone", "terraform_labels", "port_range", "target"}, }, }, }) @@ -198,7 +198,7 @@ func TestAccComputeGlobalForwardingRule_globalForwardingRuleHybridExample(t *tes ResourceName: "google_compute_global_forwarding_rule.default", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"network", "subnetwork", "no_automate_dns_zone", "port_range", "target"}, + ImportStateVerifyIgnore: []string{"labels", "network", "subnetwork", "no_automate_dns_zone", "terraform_labels", "port_range", "target"}, }, }, }) diff --git a/google/services/compute/resource_compute_vpn_tunnel.go b/google/services/compute/resource_compute_vpn_tunnel.go index ff29a3cc3a1..6edb0123949 100644 --- a/google/services/compute/resource_compute_vpn_tunnel.go +++ b/google/services/compute/resource_compute_vpn_tunnel.go @@ -150,6 +150,7 @@ func ResourceComputeVpnTunnel() *schema.Resource { }, CustomizeDiff: customdiff.All( + tpgresource.SetTerraformLabelsDiff, tpgresource.DefaultProviderProject, ), diff --git a/google/tpgresource/labels.go b/google/tpgresource/labels.go new file mode 100644 index 00000000000..77d68218252 --- /dev/null +++ b/google/tpgresource/labels.go @@ -0,0 +1,63 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 +package tpgresource + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport" +) + +func SetTerraformLabelsDiff(_ context.Context, d *schema.ResourceDiff, meta interface{}) error { + config := meta.(*transport_tpg.Config) + + // Merge provider default labels with the user defined labels in the resource to get terraform managed labels + terraformLabels := make(map[string]string) + for k, v := range config.DefaultLabels { + terraformLabels[k] = v + } + + labels := d.Get("labels").(map[string]interface{}) + for k, v := range labels { + terraformLabels[k] = v.(string) + } + + if err := d.SetNew("terraform_labels", terraformLabels); err != nil { + return fmt.Errorf("error setting new terraform_labels diff: %w", err) + } + + return nil +} + +func SetMetadataTerraformLabelsDiff(_ context.Context, d *schema.ResourceDiff, meta interface{}) error { + v := d.Get("metadata") + l := v.([]interface{}) + if len(l) == 0 || l[0] == nil { + return nil + } + + config := meta.(*transport_tpg.Config) + + // Merge provider default labels with the user defined labels in the resource to get terraform managed labels + terraformLabels := make(map[string]string) + for k, v := range config.DefaultLabels { + terraformLabels[k] = v + } + + labels := d.Get("metadata.0.labels").(map[string]interface{}) + for k, v := range labels { + terraformLabels[k] = v.(string) + } + + raw := l[0] + original := raw.(map[string]interface{}) + original["terraform_labels"] = terraformLabels + + if err := d.SetNew("metadata", []interface{}{original}); err != nil { + return fmt.Errorf("error setting new metadata diff: %w", err) + } + + return nil +} diff --git a/google/transport/config.go b/google/transport/config.go index 3cbc9ef85cc..685e827d82b 100644 --- a/google/transport/config.go +++ b/google/transport/config.go @@ -171,6 +171,7 @@ type Config struct { UserProjectOverride bool RequestReason string RequestTimeout time.Duration + DefaultLabels map[string]string // PollInterval is passed to resource.StateChangeConf in common_operation.go // It controls the interval at which we poll for successful operations PollInterval time.Duration diff --git a/website/docs/r/bigquery_dataset.html.markdown b/website/docs/r/bigquery_dataset.html.markdown index ce92c742f62..a27ba1029d6 100644 --- a/website/docs/r/bigquery_dataset.html.markdown +++ b/website/docs/r/bigquery_dataset.html.markdown @@ -468,6 +468,10 @@ In addition to the arguments listed above, the following computed attributes are The date when this dataset or any of its tables was last modified, in milliseconds since the epoch. +* `terraform_labels` - + The combination of labels configured directly on the resource + and default labels configured on the provider. + * `effective_labels` - All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services. * `self_link` - The URI of the created resource. diff --git a/website/docs/r/compute_address.html.markdown b/website/docs/r/compute_address.html.markdown index f6a690fe856..452222ea3c1 100644 --- a/website/docs/r/compute_address.html.markdown +++ b/website/docs/r/compute_address.html.markdown @@ -278,6 +278,11 @@ In addition to the arguments listed above, the following computed attributes are The fingerprint used for optimistic locking of this resource. Used internally during updates. +* `terraform_labels` - + ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) + The combination of labels configured directly on the resource + and default labels configured on the provider. + * `effective_labels` - ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services. diff --git a/website/docs/r/compute_forwarding_rule.html.markdown b/website/docs/r/compute_forwarding_rule.html.markdown index 5c0d41be004..683b9cbf4ae 100644 --- a/website/docs/r/compute_forwarding_rule.html.markdown +++ b/website/docs/r/compute_forwarding_rule.html.markdown @@ -1603,6 +1603,13 @@ In addition to the arguments listed above, the following computed attributes are * `base_forwarding_rule` - [Output Only] The URL for the corresponding base Forwarding Rule. By base Forwarding Rule, we mean the Forwarding Rule that has the same IP address, protocol, and port settings with the current Forwarding Rule, but without sourceIPRanges specified. Always empty if the current Forwarding Rule does not have sourceIPRanges specified. + +* `terraform_labels` - + The combination of labels configured directly on the resource + and default labels configured on the provider. + +* `effective_labels` - + All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services. * `self_link` - The URI of the created resource. diff --git a/website/docs/r/compute_global_address.html.markdown b/website/docs/r/compute_global_address.html.markdown index 13d6f666b4b..fd2532f4df5 100644 --- a/website/docs/r/compute_global_address.html.markdown +++ b/website/docs/r/compute_global_address.html.markdown @@ -150,6 +150,15 @@ In addition to the arguments listed above, the following computed attributes are ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) The fingerprint used for optimistic locking of this resource. Used internally during updates. + +* `terraform_labels` - + ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) + The combination of labels configured directly on the resource + and default labels configured on the provider. + +* `effective_labels` - + ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) + All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services. * `self_link` - The URI of the created resource. diff --git a/website/docs/r/compute_global_forwarding_rule.html.markdown b/website/docs/r/compute_global_forwarding_rule.html.markdown index 5fb5d8e9261..ab8c2adc510 100644 --- a/website/docs/r/compute_global_forwarding_rule.html.markdown +++ b/website/docs/r/compute_global_forwarding_rule.html.markdown @@ -1410,6 +1410,13 @@ In addition to the arguments listed above, the following computed attributes are * `base_forwarding_rule` - [Output Only] The URL for the corresponding base Forwarding Rule. By base Forwarding Rule, we mean the Forwarding Rule that has the same IP address, protocol, and port settings with the current Forwarding Rule, but without sourceIPRanges specified. Always empty if the current Forwarding Rule does not have sourceIPRanges specified. + +* `terraform_labels` - + The combination of labels configured directly on the resource + and default labels configured on the provider. + +* `effective_labels` - + All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services. * `self_link` - The URI of the created resource. diff --git a/website/docs/r/compute_vpn_tunnel.html.markdown b/website/docs/r/compute_vpn_tunnel.html.markdown index 3adcfa52c95..ef4562b1c99 100644 --- a/website/docs/r/compute_vpn_tunnel.html.markdown +++ b/website/docs/r/compute_vpn_tunnel.html.markdown @@ -309,6 +309,15 @@ In addition to the arguments listed above, the following computed attributes are * `detailed_status` - Detailed status message for the VPN tunnel. + +* `terraform_labels` - + ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) + The combination of labels configured directly on the resource + and default labels configured on the provider. + +* `effective_labels` - + ([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)) + All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services. * `self_link` - The URI of the created resource.