Skip to content

Commit cc33a01

Browse files
Enhance subnetwork.yaml to allow purpose field to be patch-able (#12922) (#21729)
[upstream:37d08f7e4fdad7bc6ca60b0207eb38986425c9dd] Signed-off-by: Modular Magician <[email protected]>
1 parent 8628570 commit cc33a01

File tree

4 files changed

+157
-11
lines changed

4 files changed

+157
-11
lines changed

.changelog/12922.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: added necessary code to make subnetwork's 'purpose' field updatable.
3+
```

google/services/compute/data_source_google_compute_subnetworks_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ locals {
9292
project_id = "%s"
9393
region = "%s"
9494
subnet_one = "%s"
95-
subnet_two = "%s"
95+
subnet_two = "%s"
9696
}
9797
9898
resource "google_compute_network" "this" {

google/services/compute/resource_compute_subnetwork.go

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ access Google APIs and services by using Private Google Access.`,
249249
Type: schema.TypeString,
250250
Computed: true,
251251
Optional: true,
252-
ForceNew: true,
253252
Description: `The purpose of the resource. This field can be either 'PRIVATE', 'REGIONAL_MANAGED_PROXY', 'GLOBAL_MANAGED_PROXY', 'PRIVATE_SERVICE_CONNECT', 'PEER_MIGRATION' or 'PRIVATE_NAT'([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html)).
254253
A subnet with purpose set to 'REGIONAL_MANAGED_PROXY' is a user-created subnetwork that is reserved for regional Envoy-based load balancers.
255254
A subnetwork in a given region with purpose set to 'GLOBAL_MANAGED_PROXY' is a proxy-only subnet and is shared between all the cross-regional Envoy-based load balancers.
@@ -956,6 +955,74 @@ func resourceComputeSubnetworkUpdate(d *schema.ResourceData, meta interface{}) e
956955
return err
957956
}
958957
}
958+
if d.HasChange("purpose") {
959+
obj := make(map[string]interface{})
960+
961+
getUrl, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}")
962+
if err != nil {
963+
return err
964+
}
965+
966+
// err == nil indicates that the billing_project value was found
967+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
968+
billingProject = bp
969+
}
970+
971+
getRes, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
972+
Config: config,
973+
Method: "GET",
974+
Project: billingProject,
975+
RawURL: getUrl,
976+
UserAgent: userAgent,
977+
})
978+
if err != nil {
979+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("ComputeSubnetwork %q", d.Id()))
980+
}
981+
982+
obj["fingerprint"] = getRes["fingerprint"]
983+
984+
purposeProp, err := expandComputeSubnetworkPurpose(d.Get("purpose"), d, config)
985+
if err != nil {
986+
return err
987+
} else if v, ok := d.GetOkExists("purpose"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, purposeProp)) {
988+
obj["purpose"] = purposeProp
989+
}
990+
991+
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}")
992+
if err != nil {
993+
return err
994+
}
995+
996+
headers := make(http.Header)
997+
998+
// err == nil indicates that the billing_project value was found
999+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
1000+
billingProject = bp
1001+
}
1002+
1003+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
1004+
Config: config,
1005+
Method: "PATCH",
1006+
Project: billingProject,
1007+
RawURL: url,
1008+
UserAgent: userAgent,
1009+
Body: obj,
1010+
Timeout: d.Timeout(schema.TimeoutUpdate),
1011+
Headers: headers,
1012+
})
1013+
if err != nil {
1014+
return fmt.Errorf("Error updating Subnetwork %q: %s", d.Id(), err)
1015+
} else {
1016+
log.Printf("[DEBUG] Finished updating Subnetwork %q: %#v", d.Id(), res)
1017+
}
1018+
1019+
err = ComputeOperationWaitTime(
1020+
config, res, project, "Updating Subnetwork", userAgent,
1021+
d.Timeout(schema.TimeoutUpdate))
1022+
if err != nil {
1023+
return err
1024+
}
1025+
}
9591026
if d.HasChange("role") {
9601027
obj := make(map[string]interface{})
9611028

google/services/compute/resource_compute_subnetwork_test.go

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99

1010
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-testing/plancheck"
1112
"github.com/hashicorp/terraform-plugin-testing/terraform"
1213
"github.com/hashicorp/terraform-provider-google/google/acctest"
1314
tpgcompute "github.com/hashicorp/terraform-provider-google/google/services/compute"
@@ -97,7 +98,6 @@ func TestAccComputeSubnetwork_update(t *testing.T) {
9798
t.Parallel()
9899

99100
var subnetwork compute.Subnetwork
100-
101101
cnName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
102102
subnetworkName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
103103

@@ -109,32 +109,28 @@ func TestAccComputeSubnetwork_update(t *testing.T) {
109109
{
110110
Config: testAccComputeSubnetwork_update1(cnName, "10.2.0.0/24", subnetworkName),
111111
Check: resource.ComposeTestCheckFunc(
112-
testAccCheckComputeSubnetworkExists(
113-
t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
112+
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
114113
),
115114
},
116115
{
117116
// Expand IP CIDR range and update private_ip_google_access
118117
Config: testAccComputeSubnetwork_update2(cnName, "10.2.0.0/16", subnetworkName),
119118
Check: resource.ComposeTestCheckFunc(
120-
testAccCheckComputeSubnetworkExists(
121-
t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
119+
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
122120
),
123121
},
124122
{
125123
// Shrink IP CIDR range and update private_ip_google_access
126124
Config: testAccComputeSubnetwork_update2(cnName, "10.2.0.0/24", subnetworkName),
127125
Check: resource.ComposeTestCheckFunc(
128-
testAccCheckComputeSubnetworkExists(
129-
t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
126+
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
130127
),
131128
},
132129
{
133130
// Add a secondary range and enable flow logs at once
134131
Config: testAccComputeSubnetwork_update3(cnName, "10.2.0.0/24", subnetworkName),
135132
Check: resource.ComposeTestCheckFunc(
136-
testAccCheckComputeSubnetworkExists(
137-
t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
133+
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-private-google-access", &subnetwork),
138134
),
139135
},
140136
{
@@ -150,6 +146,49 @@ func TestAccComputeSubnetwork_update(t *testing.T) {
150146
}
151147
}
152148

149+
func TestAccComputeSubnetwork_purposeUpdate(t *testing.T) {
150+
t.Parallel()
151+
152+
var subnetwork compute.Subnetwork
153+
cnName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
154+
subnetworkName := fmt.Sprintf("tf-test-%s", acctest.RandString(t, 10))
155+
156+
acctest.VcrTest(t, resource.TestCase{
157+
PreCheck: func() { acctest.AccTestPreCheck(t) },
158+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
159+
CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t),
160+
Steps: []resource.TestStep{
161+
{
162+
// Create a subnetwork with the purpose set to PEER_MIGRATION
163+
Config: testAccComputeSubnetwork_purposeUpdate(cnName, subnetworkName),
164+
Check: resource.ComposeTestCheckFunc(
165+
testAccCheckComputeSubnetworkExists(t, "google_compute_subnetwork.network-with-migration-purpose", &subnetwork),
166+
),
167+
},
168+
{
169+
ResourceName: "google_compute_subnetwork.network-with-migration-purpose",
170+
ImportState: true,
171+
ImportStateVerify: true,
172+
},
173+
{
174+
// update the purpose from PEER_MIGRATION to PRIVATE
175+
Config: testAccComputeSubnetwork_purposeUpdate1(cnName, subnetworkName),
176+
ConfigPlanChecks: resource.ConfigPlanChecks{
177+
PreApply: []plancheck.PlanCheck{
178+
plancheck.ExpectResourceAction("google_compute_subnetwork.network-with-migration-purpose", plancheck.ResourceActionUpdate),
179+
},
180+
},
181+
},
182+
{
183+
ResourceName: "google_compute_subnetwork.network-with-migration-purpose",
184+
ImportState: true,
185+
ImportStateVerify: true,
186+
},
187+
},
188+
})
189+
190+
}
191+
153192
func TestAccComputeSubnetwork_secondaryIpRanges(t *testing.T) {
154193
t.Parallel()
155194

@@ -542,6 +581,7 @@ resource "google_compute_subnetwork" "network-with-private-google-access" {
542581
network = google_compute_network.custom-test.self_link
543582
private_ip_google_access = true
544583
}
584+
545585
`, cnName, subnetwork1Name, subnetwork2Name, subnetwork3Name)
546586
}
547587

@@ -599,6 +639,42 @@ resource "google_compute_subnetwork" "network-with-private-google-access" {
599639
`, cnName, subnetworkName, cidrRange)
600640
}
601641

642+
// Create a subnetwork with its purpose set to PEER_MIGRATION
643+
func testAccComputeSubnetwork_purposeUpdate(cnName, subnetworkName string) string {
644+
return fmt.Sprintf(`
645+
resource "google_compute_network" "custom-test" {
646+
name = "%s"
647+
auto_create_subnetworks = false
648+
}
649+
650+
resource "google_compute_subnetwork" "network-with-migration-purpose" {
651+
name = "%s"
652+
ip_cidr_range = "10.4.0.0/16"
653+
region = "us-central1"
654+
network = google_compute_network.custom-test.self_link
655+
purpose = "PEER_MIGRATION"
656+
}
657+
`, cnName, subnetworkName)
658+
}
659+
660+
// Returns a subnetwork with its purpose set to PRIVATE
661+
func testAccComputeSubnetwork_purposeUpdate1(cnName, subnetworkName string) string {
662+
return fmt.Sprintf(`
663+
resource "google_compute_network" "custom-test" {
664+
name = "%s"
665+
auto_create_subnetworks = false
666+
}
667+
668+
resource "google_compute_subnetwork" "network-with-migration-purpose" {
669+
name = "%s"
670+
ip_cidr_range = "10.4.0.0/16"
671+
region = "us-central1"
672+
network = google_compute_network.custom-test.self_link
673+
purpose = "PRIVATE"
674+
}
675+
`, cnName, subnetworkName)
676+
}
677+
602678
func testAccComputeSubnetwork_secondaryIpRanges_update1(cnName, subnetworkName string) string {
603679
return fmt.Sprintf(`
604680
resource "google_compute_network" "custom-test" {

0 commit comments

Comments
 (0)