Skip to content

Commit c0b99f1

Browse files
Support FOR_MIGRATION InternalRange objects (#11856)
[upstream:b6675939e5afa0113e79ec31076c93d7021adc46] Signed-off-by: Modular Magician <[email protected]>
1 parent 8771498 commit c0b99f1

File tree

4 files changed

+214
-3
lines changed

4 files changed

+214
-3
lines changed

.changelog/11856.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
networkconnectivity: added field `migration` to resource `google_network_connectivity_internal_range`
3+
```

google-beta/services/networkconnectivity/resource_network_connectivity_internal_range.go

+95-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ func ResourceNetworkConnectivityInternalRange() *schema.Resource {
7777
"usage": {
7878
Type: schema.TypeString,
7979
Required: true,
80-
ValidateFunc: verify.ValidateEnum([]string{"FOR_VPC", "EXTERNAL_TO_VPC"}),
81-
Description: `The type of usage set for this InternalRange. Possible values: ["FOR_VPC", "EXTERNAL_TO_VPC"]`,
80+
ValidateFunc: verify.ValidateEnum([]string{"FOR_VPC", "EXTERNAL_TO_VPC", "FOR_MIGRATION"}),
81+
Description: `The type of usage set for this InternalRange. Possible values: ["FOR_VPC", "EXTERNAL_TO_VPC", "FOR_MIGRATION"]`,
8282
},
8383
"description": {
8484
Type: schema.TypeString,
@@ -101,6 +101,33 @@ func ResourceNetworkConnectivityInternalRange() *schema.Resource {
101101
Please refer to the field 'effective_labels' for all of the labels present on the resource.`,
102102
Elem: &schema.Schema{Type: schema.TypeString},
103103
},
104+
"migration": {
105+
Type: schema.TypeList,
106+
Optional: true,
107+
ForceNew: true,
108+
Description: `Specification for migration with source and target resource names.`,
109+
MaxItems: 1,
110+
Elem: &schema.Resource{
111+
Schema: map[string]*schema.Schema{
112+
"source": {
113+
Type: schema.TypeString,
114+
Required: true,
115+
Description: `Resource path as an URI of the source resource, for example a subnet.
116+
The project for the source resource should match the project for the
117+
InternalRange.
118+
An example /projects/{project}/regions/{region}/subnetworks/{subnet}`,
119+
},
120+
"target": {
121+
Type: schema.TypeString,
122+
Required: true,
123+
Description: `Resource path of the target resource. The target project can be
124+
different, as in the cases when migrating to peer networks. The resource
125+
may not exist yet.
126+
For example /projects/{project}/regions/{region}/subnetworks/{subnet}`,
127+
},
128+
},
129+
},
130+
},
104131
"overlaps": {
105132
Type: schema.TypeList,
106133
Optional: true,
@@ -215,6 +242,12 @@ func resourceNetworkConnectivityInternalRangeCreate(d *schema.ResourceData, meta
215242
} else if v, ok := d.GetOkExists("overlaps"); !tpgresource.IsEmptyValue(reflect.ValueOf(overlapsProp)) && (ok || !reflect.DeepEqual(v, overlapsProp)) {
216243
obj["overlaps"] = overlapsProp
217244
}
245+
migrationProp, err := expandNetworkConnectivityInternalRangeMigration(d.Get("migration"), d, config)
246+
if err != nil {
247+
return err
248+
} else if v, ok := d.GetOkExists("migration"); !tpgresource.IsEmptyValue(reflect.ValueOf(migrationProp)) && (ok || !reflect.DeepEqual(v, migrationProp)) {
249+
obj["migration"] = migrationProp
250+
}
218251
labelsProp, err := expandNetworkConnectivityInternalRangeEffectiveLabels(d.Get("effective_labels"), d, config)
219252
if err != nil {
220253
return err
@@ -350,6 +383,9 @@ func resourceNetworkConnectivityInternalRangeRead(d *schema.ResourceData, meta i
350383
if err := d.Set("overlaps", flattenNetworkConnectivityInternalRangeOverlaps(res["overlaps"], d, config)); err != nil {
351384
return fmt.Errorf("Error reading InternalRange: %s", err)
352385
}
386+
if err := d.Set("migration", flattenNetworkConnectivityInternalRangeMigration(res["migration"], d, config)); err != nil {
387+
return fmt.Errorf("Error reading InternalRange: %s", err)
388+
}
353389
if err := d.Set("terraform_labels", flattenNetworkConnectivityInternalRangeTerraformLabels(res["labels"], d, config)); err != nil {
354390
return fmt.Errorf("Error reading InternalRange: %s", err)
355391
}
@@ -661,6 +697,29 @@ func flattenNetworkConnectivityInternalRangeOverlaps(v interface{}, d *schema.Re
661697
return v
662698
}
663699

700+
func flattenNetworkConnectivityInternalRangeMigration(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
701+
if v == nil {
702+
return nil
703+
}
704+
original := v.(map[string]interface{})
705+
if len(original) == 0 {
706+
return nil
707+
}
708+
transformed := make(map[string]interface{})
709+
transformed["source"] =
710+
flattenNetworkConnectivityInternalRangeMigrationSource(original["source"], d, config)
711+
transformed["target"] =
712+
flattenNetworkConnectivityInternalRangeMigrationTarget(original["target"], d, config)
713+
return []interface{}{transformed}
714+
}
715+
func flattenNetworkConnectivityInternalRangeMigrationSource(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
716+
return v
717+
}
718+
719+
func flattenNetworkConnectivityInternalRangeMigrationTarget(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
720+
return v
721+
}
722+
664723
func flattenNetworkConnectivityInternalRangeTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
665724
if v == nil {
666725
return v
@@ -712,6 +771,40 @@ func expandNetworkConnectivityInternalRangeOverlaps(v interface{}, d tpgresource
712771
return v, nil
713772
}
714773

774+
func expandNetworkConnectivityInternalRangeMigration(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
775+
l := v.([]interface{})
776+
if len(l) == 0 || l[0] == nil {
777+
return nil, nil
778+
}
779+
raw := l[0]
780+
original := raw.(map[string]interface{})
781+
transformed := make(map[string]interface{})
782+
783+
transformedSource, err := expandNetworkConnectivityInternalRangeMigrationSource(original["source"], d, config)
784+
if err != nil {
785+
return nil, err
786+
} else if val := reflect.ValueOf(transformedSource); val.IsValid() && !tpgresource.IsEmptyValue(val) {
787+
transformed["source"] = transformedSource
788+
}
789+
790+
transformedTarget, err := expandNetworkConnectivityInternalRangeMigrationTarget(original["target"], d, config)
791+
if err != nil {
792+
return nil, err
793+
} else if val := reflect.ValueOf(transformedTarget); val.IsValid() && !tpgresource.IsEmptyValue(val) {
794+
transformed["target"] = transformedTarget
795+
}
796+
797+
return transformed, nil
798+
}
799+
800+
func expandNetworkConnectivityInternalRangeMigrationSource(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
801+
return v, nil
802+
}
803+
804+
func expandNetworkConnectivityInternalRangeMigrationTarget(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
805+
return v, nil
806+
}
807+
715808
func expandNetworkConnectivityInternalRangeEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
716809
if v == nil {
717810
return map[string]string{}, nil

google-beta/services/networkconnectivity/resource_network_connectivity_internal_range_generated_test.go

+57
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,63 @@ resource "google_compute_subnetwork" "default" {
226226
`, context)
227227
}
228228

229+
func TestAccNetworkConnectivityInternalRange_networkConnectivityInternalRangesMigrationExample(t *testing.T) {
230+
t.Parallel()
231+
232+
context := map[string]interface{}{
233+
"random_suffix": acctest.RandString(t, 10),
234+
}
235+
236+
acctest.VcrTest(t, resource.TestCase{
237+
PreCheck: func() { acctest.AccTestPreCheck(t) },
238+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
239+
CheckDestroy: testAccCheckNetworkConnectivityInternalRangeDestroyProducer(t),
240+
Steps: []resource.TestStep{
241+
{
242+
Config: testAccNetworkConnectivityInternalRange_networkConnectivityInternalRangesMigrationExample(context),
243+
},
244+
{
245+
ResourceName: "google_network_connectivity_internal_range.default",
246+
ImportState: true,
247+
ImportStateVerify: true,
248+
ImportStateVerifyIgnore: []string{"labels", "name", "network", "terraform_labels"},
249+
},
250+
},
251+
})
252+
}
253+
254+
func testAccNetworkConnectivityInternalRange_networkConnectivityInternalRangesMigrationExample(context map[string]interface{}) string {
255+
return acctest.Nprintf(`
256+
resource "google_network_connectivity_internal_range" "default" {
257+
name = "migration%{random_suffix}"
258+
description = "Test internal range"
259+
network = google_compute_network.default.self_link
260+
usage = "FOR_MIGRATION"
261+
peering = "FOR_SELF"
262+
ip_cidr_range = "10.1.0.0/16"
263+
migration {
264+
source = google_compute_subnetwork.source.self_link
265+
target = "projects/${data.google_project.target_project.project_id}/regions/us-central1/subnetworks/target-subnet"
266+
}
267+
}
268+
269+
resource "google_compute_network" "default" {
270+
name = "tf-test-internal-ranges%{random_suffix}"
271+
auto_create_subnetworks = false
272+
}
273+
274+
resource "google_compute_subnetwork" "source" {
275+
name = "tf-test-source-subnet%{random_suffix}"
276+
ip_cidr_range = "10.1.0.0/16"
277+
region = "us-central1"
278+
network = google_compute_network.default.name
279+
}
280+
281+
data "google_project" "target_project" {
282+
}
283+
`, context)
284+
}
285+
229286
func testAccCheckNetworkConnectivityInternalRangeDestroyProducer(t *testing.T) func(s *terraform.State) error {
230287
return func(s *terraform.State) error {
231288
for name, rs := range s.RootModule().Resources {

website/docs/r/network_connectivity_internal_range.html.markdown

+59-1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,43 @@ resource "google_compute_subnetwork" "default" {
144144
network = google_compute_network.default.id
145145
}
146146
```
147+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
148+
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.jpy.wang%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=network_connectivity_internal_ranges_migration&open_in_editor=main.tf" target="_blank">
149+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
150+
</a>
151+
</div>
152+
## Example Usage - Network Connectivity Internal Ranges Migration
153+
154+
155+
```hcl
156+
resource "google_network_connectivity_internal_range" "default" {
157+
name = "migration"
158+
description = "Test internal range"
159+
network = google_compute_network.default.self_link
160+
usage = "FOR_MIGRATION"
161+
peering = "FOR_SELF"
162+
ip_cidr_range = "10.1.0.0/16"
163+
migration {
164+
source = google_compute_subnetwork.source.self_link
165+
target = "projects/${data.google_project.target_project.project_id}/regions/us-central1/subnetworks/target-subnet"
166+
}
167+
}
168+
169+
resource "google_compute_network" "default" {
170+
name = "internal-ranges"
171+
auto_create_subnetworks = false
172+
}
173+
174+
resource "google_compute_subnetwork" "source" {
175+
name = "source-subnet"
176+
ip_cidr_range = "10.1.0.0/16"
177+
region = "us-central1"
178+
network = google_compute_network.default.name
179+
}
180+
181+
data "google_project" "target_project" {
182+
}
183+
```
147184

148185
## Argument Reference
149186

@@ -161,7 +198,7 @@ The following arguments are supported:
161198
* `usage` -
162199
(Required)
163200
The type of usage set for this InternalRange.
164-
Possible values are: `FOR_VPC`, `EXTERNAL_TO_VPC`.
201+
Possible values are: `FOR_VPC`, `EXTERNAL_TO_VPC`, `FOR_MIGRATION`.
165202

166203
* `peering` -
167204
(Required)
@@ -202,10 +239,31 @@ The following arguments are supported:
202239
Optional. Types of resources that are allowed to overlap with the current internal range.
203240
Each value may be one of: `OVERLAP_ROUTE_RANGE`, `OVERLAP_EXISTING_SUBNET_RANGE`.
204241

242+
* `migration` -
243+
(Optional)
244+
Specification for migration with source and target resource names.
245+
Structure is [documented below](#nested_migration).
246+
205247
* `project` - (Optional) The ID of the project in which the resource belongs.
206248
If it is not provided, the provider project is used.
207249

208250

251+
<a name="nested_migration"></a>The `migration` block supports:
252+
253+
* `source` -
254+
(Required)
255+
Resource path as an URI of the source resource, for example a subnet.
256+
The project for the source resource should match the project for the
257+
InternalRange.
258+
An example /projects/{project}/regions/{region}/subnetworks/{subnet}
259+
260+
* `target` -
261+
(Required)
262+
Resource path of the target resource. The target project can be
263+
different, as in the cases when migrating to peer networks. The resource
264+
may not exist yet.
265+
For example /projects/{project}/regions/{region}/subnetworks/{subnet}
266+
209267
## Attributes Reference
210268

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

0 commit comments

Comments
 (0)