Skip to content

Commit 6903263

Browse files
Add resource_manager_tags support to Subnetwork api (#14398) (#10357)
[upstream:490a414a5b05cadaef67a1c8c792019e8d6d8bcf] Signed-off-by: Modular Magician <[email protected]>
1 parent c10bc88 commit 6903263

File tree

6 files changed

+149
-12
lines changed

6 files changed

+149
-12
lines changed

.changelog/14398.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: add `params.resourceManagerTags` field to the `google_compute_subnetwork`
3+
```

google-beta/services/compute/resource_compute_subnetwork.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,29 @@ Can only be specified if VPC flow logs for this subnetwork is enabled and "metad
279279
},
280280
},
281281
},
282+
"params": {
283+
Type: schema.TypeList,
284+
Optional: true,
285+
ForceNew: true,
286+
Description: `Additional params passed with the request, but not persisted as part of resource payload`,
287+
MaxItems: 1,
288+
Elem: &schema.Resource{
289+
Schema: map[string]*schema.Schema{
290+
"resource_manager_tags": {
291+
Type: schema.TypeMap,
292+
Optional: true,
293+
ForceNew: true,
294+
Description: `Resource manager tags to be bound to the subnetwork. Tag keys and values have the
295+
same definition as resource manager tags. Keys must be in the format tagKeys/{tag_key_id},
296+
and values are in the format tagValues/456. The field is ignored when empty.
297+
The field is immutable and causes resource replacement when mutated. This field is only
298+
set at create time and modifying this field after creation will trigger recreation.
299+
To apply tags to an existing resource, see the google_tags_tag_binding resource.`,
300+
Elem: &schema.Schema{Type: schema.TypeString},
301+
},
302+
},
303+
},
304+
},
282305
"private_ip_google_access": {
283306
Type: schema.TypeBool,
284307
Computed: true,
@@ -615,6 +638,12 @@ func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) e
615638
} else if v, ok := d.GetOkExists("enable_flow_logs"); !tpgresource.IsEmptyValue(reflect.ValueOf(enableFlowLogsProp)) && (ok || !reflect.DeepEqual(v, enableFlowLogsProp)) {
616639
obj["enableFlowLogs"] = enableFlowLogsProp
617640
}
641+
paramsProp, err := expandComputeSubnetworkParams(d.Get("params"), d, config)
642+
if err != nil {
643+
return err
644+
} else if v, ok := d.GetOkExists("params"); !tpgresource.IsEmptyValue(reflect.ValueOf(paramsProp)) && (ok || !reflect.DeepEqual(v, paramsProp)) {
645+
obj["params"] = paramsProp
646+
}
618647

619648
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks")
620649
if err != nil {
@@ -1745,3 +1774,33 @@ func expandComputeSubnetworkAllowSubnetCidrRoutesOverlap(v interface{}, d tpgres
17451774
func expandComputeSubnetworkEnableFlowLogs(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
17461775
return v, nil
17471776
}
1777+
1778+
func expandComputeSubnetworkParams(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1779+
l := v.([]interface{})
1780+
if len(l) == 0 || l[0] == nil {
1781+
return nil, nil
1782+
}
1783+
raw := l[0]
1784+
original := raw.(map[string]interface{})
1785+
transformed := make(map[string]interface{})
1786+
1787+
transformedResourceManagerTags, err := expandComputeSubnetworkParamsResourceManagerTags(original["resource_manager_tags"], d, config)
1788+
if err != nil {
1789+
return nil, err
1790+
} else if val := reflect.ValueOf(transformedResourceManagerTags); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1791+
transformed["resourceManagerTags"] = transformedResourceManagerTags
1792+
}
1793+
1794+
return transformed, nil
1795+
}
1796+
1797+
func expandComputeSubnetworkParamsResourceManagerTags(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
1798+
if v == nil {
1799+
return map[string]string{}, nil
1800+
}
1801+
m := make(map[string]string)
1802+
for k, val := range v.(map[string]interface{}) {
1803+
m[k] = val.(string)
1804+
}
1805+
return m, nil
1806+
}

google-beta/services/compute/resource_compute_subnetwork_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ fields:
2424
- field: 'log_config.metadata_fields'
2525
- field: 'name'
2626
- field: 'network'
27+
- field: 'params.resource_manager_tags'
2728
- field: 'private_ip_google_access'
2829
- field: 'private_ipv6_google_access'
2930
- field: 'purpose'

google-beta/services/compute/resource_compute_subnetwork_generated_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestAccComputeSubnetwork_subnetworkBasicExample(t *testing.T) {
4949
ResourceName: "google_compute_subnetwork.network-with-private-secondary-ip-ranges",
5050
ImportState: true,
5151
ImportStateVerify: true,
52-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
52+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
5353
},
5454
},
5555
})
@@ -94,7 +94,7 @@ func TestAccComputeSubnetwork_subnetworkLoggingConfigExample(t *testing.T) {
9494
ResourceName: "google_compute_subnetwork.subnet-with-logging",
9595
ImportState: true,
9696
ImportStateVerify: true,
97-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
97+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
9898
},
9999
},
100100
})
@@ -141,7 +141,7 @@ func TestAccComputeSubnetwork_subnetworkInternalL7lbExample(t *testing.T) {
141141
ResourceName: "google_compute_subnetwork.network-for-l7lb",
142142
ImportState: true,
143143
ImportStateVerify: true,
144-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
144+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
145145
},
146146
},
147147
})
@@ -188,7 +188,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6Example(t *testing.T) {
188188
ResourceName: "google_compute_subnetwork.subnetwork-ipv6",
189189
ImportState: true,
190190
ImportStateVerify: true,
191-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
191+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
192192
},
193193
},
194194
})
@@ -234,7 +234,7 @@ func TestAccComputeSubnetwork_subnetworkInternalIpv6Example(t *testing.T) {
234234
ResourceName: "google_compute_subnetwork.subnetwork-internal-ipv6",
235235
ImportState: true,
236236
ImportStateVerify: true,
237-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
237+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
238238
},
239239
},
240240
})
@@ -281,7 +281,7 @@ func TestAccComputeSubnetwork_subnetworkPurposePrivateNatExample(t *testing.T) {
281281
ResourceName: "google_compute_subnetwork.subnetwork-purpose-private-nat",
282282
ImportState: true,
283283
ImportStateVerify: true,
284-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
284+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
285285
},
286286
},
287287
})
@@ -327,7 +327,7 @@ func TestAccComputeSubnetwork_subnetworkCidrOverlapExample(t *testing.T) {
327327
ResourceName: "google_compute_subnetwork.subnetwork-cidr-overlap",
328328
ImportState: true,
329329
ImportStateVerify: true,
330-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
330+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
331331
},
332332
},
333333
})
@@ -373,7 +373,7 @@ func TestAccComputeSubnetwork_subnetworkReservedInternalRangeExample(t *testing.
373373
ResourceName: "google_compute_subnetwork.subnetwork-reserved-internal-range",
374374
ImportState: true,
375375
ImportStateVerify: true,
376-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
376+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
377377
},
378378
},
379379
})
@@ -428,7 +428,7 @@ func TestAccComputeSubnetwork_subnetworkReservedSecondaryRangeExample(t *testing
428428
ResourceName: "google_compute_subnetwork.subnetwork-reserved-secondary-range",
429429
ImportState: true,
430430
ImportStateVerify: true,
431-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
431+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
432432
},
433433
},
434434
})
@@ -500,7 +500,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6OnlyInternalExample(t *testing.T) {
500500
ResourceName: "google_compute_subnetwork.subnetwork-ipv6-only",
501501
ImportState: true,
502502
ImportStateVerify: true,
503-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
503+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
504504
},
505505
},
506506
})
@@ -544,7 +544,7 @@ func TestAccComputeSubnetwork_subnetworkWithSubnetModePdpExample(t *testing.T) {
544544
ResourceName: "google_compute_subnetwork.subnetwork-with-subnet-mode-pdp",
545545
ImportState: true,
546546
ImportStateVerify: true,
547-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
547+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
548548
},
549549
},
550550
})
@@ -587,7 +587,7 @@ func TestAccComputeSubnetwork_subnetworkIpv6OnlyExternalExample(t *testing.T) {
587587
ResourceName: "google_compute_subnetwork.subnetwork-ipv6-only",
588588
ImportState: true,
589589
ImportStateVerify: true,
590-
ImportStateVerifyIgnore: []string{"ip_collection", "network", "region", "reserved_internal_range"},
590+
ImportStateVerifyIgnore: []string{"ip_collection", "network", "params", "region", "reserved_internal_range"},
591591
},
592592
},
593593
})

google-beta/services/compute/resource_compute_subnetwork_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/hashicorp/terraform-plugin-testing/plancheck"
2626
"github.com/hashicorp/terraform-plugin-testing/terraform"
2727
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
28+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/envvar"
2829
tpgcompute "github.com/hashicorp/terraform-provider-google-beta/google-beta/services/compute"
2930

3031
compute "google.golang.org/api/compute/v0.beta"
@@ -507,6 +508,63 @@ func TestAccComputeSubnetwork_internal_ipv6(t *testing.T) {
507508
})
508509
}
509510

511+
func TestAccComputeSubnetwork_resourceManagerTags(t *testing.T) {
512+
t.Parallel()
513+
514+
var subnetwork compute.Subnetwork
515+
org := envvar.GetTestOrgFromEnv(t)
516+
517+
suffixName := acctest.RandString(t, 10)
518+
tagKeyResult := acctest.BootstrapSharedTestTagKeyDetails(t, "crm-subnetworks-tagkey", "organizations/"+org, make(map[string]interface{}))
519+
sharedTagkey, _ := tagKeyResult["shared_tag_key"]
520+
tagValueResult := acctest.BootstrapSharedTestTagValueDetails(t, "crm-subnetworks-tagvalue", sharedTagkey, org)
521+
522+
cnName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
523+
subnetworkName := fmt.Sprintf("tf-test-subnetwork-resource-manager-tags-%s", suffixName)
524+
context := map[string]interface{}{
525+
"subnetwork_name": subnetworkName,
526+
"network_name": cnName,
527+
"tag_key_id": tagKeyResult["name"],
528+
"tag_value_id": tagValueResult["name"],
529+
}
530+
531+
acctest.VcrTest(t, resource.TestCase{
532+
PreCheck: func() { acctest.AccTestPreCheck(t) },
533+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
534+
CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t),
535+
Steps: []resource.TestStep{
536+
{
537+
Config: testAccComputeSubnetwork_resourceManagerTags(context),
538+
Check: resource.ComposeTestCheckFunc(
539+
testAccCheckComputeSubnetworkExists(
540+
t, "google_compute_subnetwork.acc_subnetwork_with_resource_manager_tags", &subnetwork),
541+
),
542+
},
543+
},
544+
})
545+
}
546+
547+
func testAccComputeSubnetwork_resourceManagerTags(context map[string]interface{}) string {
548+
return acctest.Nprintf(`
549+
resource "google_compute_network" "custom-test" {
550+
name = "%{network_name}"
551+
auto_create_subnetworks = false
552+
}
553+
554+
resource "google_compute_subnetwork" "acc_subnetwork_with_resource_manager_tags" {
555+
name = "%{subnetwork_name}"
556+
ip_cidr_range = "10.0.0.0/16"
557+
region = "us-central1"
558+
network = google_compute_network.custom-test.self_link
559+
params {
560+
resource_manager_tags = {
561+
"%{tag_key_id}" = "%{tag_value_id}"
562+
}
563+
}
564+
}
565+
`, context)
566+
}
567+
510568
func testAccCheckComputeSubnetworkExists(t *testing.T, n string, subnetwork *compute.Subnetwork) resource.TestCheckFunc {
511569
return func(s *terraform.State) error {
512570
rs, ok := s.RootModule().Resources[n]

website/docs/r/compute_subnetwork.html.markdown

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,11 @@ The following arguments are supported:
462462

463463
~> **Warning:** This field is being removed in favor of log_config. If log_config is present, flow logs are enabled.
464464

465+
* `params` -
466+
(Optional)
467+
Additional params passed with the request, but not persisted as part of resource payload
468+
Structure is [documented below](#nested_params).
469+
465470
* `project` - (Optional) The ID of the project in which the resource belongs.
466471
If it is not provided, the provider project is used.
467472

@@ -534,6 +539,17 @@ Defaults to false.
534539
https://cloud.google.com/vpc/docs/flow-logs#filtering for details on how to format this field.
535540
The default value is 'true', which evaluates to include everything.
536541

542+
<a name="nested_params"></a>The `params` block supports:
543+
544+
* `resource_manager_tags` -
545+
(Optional)
546+
Resource manager tags to be bound to the subnetwork. Tag keys and values have the
547+
same definition as resource manager tags. Keys must be in the format tagKeys/{tag_key_id},
548+
and values are in the format tagValues/456. The field is ignored when empty.
549+
The field is immutable and causes resource replacement when mutated. This field is only
550+
set at create time and modifying this field after creation will trigger recreation.
551+
To apply tags to an existing resource, see the google_tags_tag_binding resource.
552+
537553
## Attributes Reference
538554

539555
In addition to the arguments listed above, the following computed attributes are exported:

0 commit comments

Comments
 (0)