Skip to content

Commit 99f50de

Browse files
Add PSC fields to Filestore instance in ga (#15116) (#24567)
[upstream:250877817a0812a25d8b725d727847887bee14e8] Signed-off-by: Modular Magician <[email protected]>
1 parent d5c46a5 commit 99f50de

File tree

5 files changed

+251
-2
lines changed

5 files changed

+251
-2
lines changed

.changelog/15116.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
filestore: added PSC fields to `google_filestore_instance` (ga)
3+
```

google/services/filestore/resource_filestore_instance.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ The limit is 64 IP ranges/addresses for each FileShareConfig among all NfsExport
128128
Type: schema.TypeString,
129129
},
130130
},
131+
"network": {
132+
Type: schema.TypeString,
133+
Optional: true,
134+
Description: `The source VPC network for 'ip_ranges'.
135+
Required for instances using Private Service Connect, optional otherwise.`,
136+
},
131137
"squash_mode": {
132138
Type: schema.TypeString,
133139
Optional: true,
@@ -193,6 +199,26 @@ If not provided, the connect mode defaults to
193199
DIRECT_PEERING. Default value: "DIRECT_PEERING" Possible values: ["DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS", "PRIVATE_SERVICE_CONNECT"]`,
194200
Default: "DIRECT_PEERING",
195201
},
202+
"psc_config": {
203+
Type: schema.TypeList,
204+
Optional: true,
205+
Description: `Private Service Connect configuration.
206+
Should only be set when connect_mode is PRIVATE_SERVICE_CONNECT.`,
207+
MaxItems: 1,
208+
Elem: &schema.Resource{
209+
Schema: map[string]*schema.Schema{
210+
"endpoint_project": {
211+
Type: schema.TypeString,
212+
Optional: true,
213+
ForceNew: true,
214+
Description: `Consumer service project in which the Private Service Connect endpoint
215+
would be set up. This is optional, and only relevant in case the network
216+
is a shared VPC. If this is not specified, the endpoint would be set up
217+
in the VPC host project.`,
218+
},
219+
},
220+
},
221+
},
196222
"reserved_ip_range": {
197223
Type: schema.TypeString,
198224
Computed: true,
@@ -1012,6 +1038,7 @@ func flattenFilestoreInstanceFileSharesNfsExportOptions(v interface{}, d *schema
10121038
"squash_mode": flattenFilestoreInstanceFileSharesNfsExportOptionsSquashMode(original["squashMode"], d, config),
10131039
"anon_uid": flattenFilestoreInstanceFileSharesNfsExportOptionsAnonUid(original["anonUid"], d, config),
10141040
"anon_gid": flattenFilestoreInstanceFileSharesNfsExportOptionsAnonGid(original["anonGid"], d, config),
1041+
"network": flattenFilestoreInstanceFileSharesNfsExportOptionsNetwork(original["network"], d, config),
10151042
})
10161043
}
10171044
return transformed
@@ -1062,6 +1089,10 @@ func flattenFilestoreInstanceFileSharesNfsExportOptionsAnonGid(v interface{}, d
10621089
return v // let terraform core handle it otherwise
10631090
}
10641091

1092+
func flattenFilestoreInstanceFileSharesNfsExportOptionsNetwork(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1093+
return v
1094+
}
1095+
10651096
func flattenFilestoreInstanceNetworks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
10661097
if v == nil {
10671098
return v
@@ -1080,6 +1111,7 @@ func flattenFilestoreInstanceNetworks(v interface{}, d *schema.ResourceData, con
10801111
"reserved_ip_range": flattenFilestoreInstanceNetworksReservedIpRange(original["reservedIpRange"], d, config),
10811112
"ip_addresses": flattenFilestoreInstanceNetworksIpAddresses(original["ipAddresses"], d, config),
10821113
"connect_mode": flattenFilestoreInstanceNetworksConnectMode(original["connectMode"], d, config),
1114+
"psc_config": flattenFilestoreInstanceNetworksPscConfig(original["pscConfig"], d, config),
10831115
})
10841116
}
10851117
return transformed
@@ -1108,6 +1140,23 @@ func flattenFilestoreInstanceNetworksConnectMode(v interface{}, d *schema.Resour
11081140
return v
11091141
}
11101142

1143+
func flattenFilestoreInstanceNetworksPscConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1144+
if v == nil {
1145+
return nil
1146+
}
1147+
original := v.(map[string]interface{})
1148+
if len(original) == 0 {
1149+
return nil
1150+
}
1151+
transformed := make(map[string]interface{})
1152+
transformed["endpoint_project"] =
1153+
flattenFilestoreInstanceNetworksPscConfigEndpointProject(original["endpointProject"], d, config)
1154+
return []interface{}{transformed}
1155+
}
1156+
func flattenFilestoreInstanceNetworksPscConfigEndpointProject(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1157+
return v
1158+
}
1159+
11111160
func flattenFilestoreInstanceEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
11121161
return v
11131162
}
@@ -1392,6 +1441,13 @@ func expandFilestoreInstanceFileSharesNfsExportOptions(v interface{}, d tpgresou
13921441
transformed["anonGid"] = transformedAnonGid
13931442
}
13941443

1444+
transformedNetwork, err := expandFilestoreInstanceFileSharesNfsExportOptionsNetwork(original["network"], d, config)
1445+
if err != nil {
1446+
return nil, err
1447+
} else if val := reflect.ValueOf(transformedNetwork); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1448+
transformed["network"] = transformedNetwork
1449+
}
1450+
13951451
req = append(req, transformed)
13961452
}
13971453
return req, nil
@@ -1417,6 +1473,10 @@ func expandFilestoreInstanceFileSharesNfsExportOptionsAnonGid(v interface{}, d t
14171473
return v, nil
14181474
}
14191475

1476+
func expandFilestoreInstanceFileSharesNfsExportOptionsNetwork(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1477+
return v, nil
1478+
}
1479+
14201480
func expandFilestoreInstanceNetworks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
14211481
if v == nil {
14221482
return nil, nil
@@ -1465,6 +1525,13 @@ func expandFilestoreInstanceNetworks(v interface{}, d tpgresource.TerraformResou
14651525
transformed["connectMode"] = transformedConnectMode
14661526
}
14671527

1528+
transformedPscConfig, err := expandFilestoreInstanceNetworksPscConfig(original["psc_config"], d, config)
1529+
if err != nil {
1530+
return nil, err
1531+
} else if val := reflect.ValueOf(transformedPscConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1532+
transformed["pscConfig"] = transformedPscConfig
1533+
}
1534+
14681535
req = append(req, transformed)
14691536
}
14701537
return req, nil
@@ -1490,6 +1557,32 @@ func expandFilestoreInstanceNetworksConnectMode(v interface{}, d tpgresource.Ter
14901557
return v, nil
14911558
}
14921559

1560+
func expandFilestoreInstanceNetworksPscConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1561+
if v == nil {
1562+
return nil, nil
1563+
}
1564+
l := v.([]interface{})
1565+
if len(l) == 0 || l[0] == nil {
1566+
return nil, nil
1567+
}
1568+
raw := l[0]
1569+
original := raw.(map[string]interface{})
1570+
transformed := make(map[string]interface{})
1571+
1572+
transformedEndpointProject, err := expandFilestoreInstanceNetworksPscConfigEndpointProject(original["endpoint_project"], d, config)
1573+
if err != nil {
1574+
return nil, err
1575+
} else if val := reflect.ValueOf(transformedEndpointProject); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1576+
transformed["endpointProject"] = transformedEndpointProject
1577+
}
1578+
1579+
return transformed, nil
1580+
}
1581+
1582+
func expandFilestoreInstanceNetworksPscConfigEndpointProject(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1583+
return v, nil
1584+
}
1585+
14931586
func expandFilestoreInstanceKmsKeyName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
14941587
return v, nil
14951588
}

google/services/filestore/resource_filestore_instance_generated_meta.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ fields:
2828
- field: 'file_shares.nfs_export_options.anon_gid'
2929
- field: 'file_shares.nfs_export_options.anon_uid'
3030
- field: 'file_shares.nfs_export_options.ip_ranges'
31+
- field: 'file_shares.nfs_export_options.network'
3132
- field: 'file_shares.nfs_export_options.squash_mode'
3233
- field: 'file_shares.source_backup'
3334
- field: 'initial_replication.replicas.peer_instance'
@@ -44,6 +45,7 @@ fields:
4445
- field: 'networks.ip_addresses'
4546
- field: 'networks.modes'
4647
- field: 'networks.network'
48+
- field: 'networks.psc_config.endpoint_project'
4749
- field: 'networks.reserved_ip_range'
4850
- field: 'performance_config.fixed_iops.max_iops'
4951
- field: 'performance_config.iops_per_tb.max_iops_per_tb'

google/services/filestore/resource_filestore_instance_test.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,3 +556,154 @@ resource "google_filestore_instance" "replica_instance" {
556556
}
557557
`, context)
558558
}
559+
560+
func TestAccFilestoreInstance_psc(t *testing.T) {
561+
t.Parallel()
562+
563+
context := map[string]interface{}{
564+
"name": fmt.Sprintf("tf-test-%d", acctest.RandInt(t)),
565+
"location": "us-central1",
566+
"tier": "REGIONAL",
567+
}
568+
569+
acctest.VcrTest(t, resource.TestCase{
570+
PreCheck: func() { acctest.AccTestPreCheck(t) },
571+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
572+
CheckDestroy: testAccCheckFilestoreInstanceDestroyProducer(t),
573+
Steps: []resource.TestStep{
574+
{
575+
Config: testAccFilestoreInstance_psc(context),
576+
Check: resource.ComposeTestCheckFunc(
577+
resource.TestCheckResourceAttr("google_filestore_instance.instance", "networks.0.connect_mode", "PRIVATE_SERVICE_CONNECT"),
578+
),
579+
},
580+
{
581+
ResourceName: "google_filestore_instance.instance",
582+
ImportState: true,
583+
ImportStateVerify: true,
584+
ImportStateVerifyIgnore: []string{"zone"},
585+
},
586+
},
587+
})
588+
}
589+
590+
func testAccFilestoreInstance_psc(context map[string]interface{}) string {
591+
return acctest.Nprintf(`
592+
data "google_client_config" "current" {}
593+
594+
resource "google_compute_network" "psc_network" {
595+
name = "%{name}"
596+
auto_create_subnetworks = false
597+
}
598+
599+
resource "google_compute_subnetwork" "psc_subnet" {
600+
name = "%{name}"
601+
ip_cidr_range = "10.2.0.0/16"
602+
region = "%{location}"
603+
network = google_compute_network.psc_network.id
604+
}
605+
606+
resource "google_network_connectivity_service_connection_policy" "default" {
607+
name = "%{name}"
608+
location = "%{location}"
609+
service_class = "google-cloud-filestore"
610+
network = google_compute_network.psc_network.id
611+
psc_config {
612+
subnetworks = [google_compute_subnetwork.psc_subnet.id]
613+
}
614+
}
615+
616+
resource "google_filestore_instance" "instance" {
617+
depends_on = [
618+
google_network_connectivity_service_connection_policy.default
619+
]
620+
name = "%{name}"
621+
location = "%{location}"
622+
tier = "%{tier}"
623+
description = "An instance created during testing."
624+
protocol = "NFS_V4_1"
625+
626+
file_shares {
627+
capacity_gb = 1024
628+
name = "share"
629+
630+
nfs_export_options {
631+
ip_ranges = ["70.0.0.1/24"]
632+
network = google_compute_network.psc_network.name
633+
}
634+
}
635+
636+
networks {
637+
network = google_compute_network.psc_network.name
638+
modes = ["MODE_IPV4"]
639+
connect_mode = "PRIVATE_SERVICE_CONNECT"
640+
psc_config {
641+
endpoint_project = data.google_client_config.current.project
642+
}
643+
}
644+
}
645+
`, context)
646+
}
647+
648+
func TestAccFilestoreInstance_nfsExportOptionsNetwork_update(t *testing.T) {
649+
t.Parallel()
650+
651+
name := fmt.Sprintf("tf-test-%d", acctest.RandInt(t))
652+
location := "us-central1-a"
653+
tier := "ZONAL"
654+
655+
// Currently, we can only alternate between an empty network and the instance network of non-PSC instances.
656+
acctest.VcrTest(t, resource.TestCase{
657+
PreCheck: func() { acctest.AccTestPreCheck(t) },
658+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
659+
CheckDestroy: testAccCheckFilestoreInstanceDestroyProducer(t),
660+
Steps: []resource.TestStep{
661+
{
662+
Config: testAccFilestoreInstance_nfsExportOptionsNetwork_update(name, location, tier, ""),
663+
Check: resource.TestCheckResourceAttr("google_filestore_instance.instance", "file_shares.0.nfs_export_options.0.network", ""),
664+
},
665+
{
666+
ResourceName: "google_filestore_instance.instance",
667+
ImportState: true,
668+
ImportStateVerify: true,
669+
ImportStateVerifyIgnore: []string{"zone"},
670+
},
671+
{
672+
Config: testAccFilestoreInstance_nfsExportOptionsNetwork_update(name, location, tier, "default"),
673+
Check: resource.TestCheckResourceAttr("google_filestore_instance.instance", "file_shares.0.nfs_export_options.0.network", "default"),
674+
},
675+
{
676+
ResourceName: "google_filestore_instance.instance",
677+
ImportState: true,
678+
ImportStateVerify: true,
679+
ImportStateVerifyIgnore: []string{"zone"},
680+
},
681+
},
682+
})
683+
}
684+
685+
func testAccFilestoreInstance_nfsExportOptionsNetwork_update(name, location, tier, network string) string {
686+
return fmt.Sprintf(`
687+
resource "google_filestore_instance" "instance" {
688+
name = "%s"
689+
zone = "%s"
690+
tier = "%s"
691+
description = "An instance created during testing."
692+
693+
file_shares {
694+
capacity_gb = 1024
695+
name = "share"
696+
697+
nfs_export_options {
698+
ip_ranges = ["70.0.0.1/24"]
699+
network = "%s"
700+
}
701+
}
702+
703+
networks {
704+
network = "default"
705+
modes = ["MODE_IPV4"]
706+
}
707+
}
708+
`, name, location, tier, network)
709+
}

website/docs/r/filestore_instance.html.markdown

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ The following arguments are supported:
319319
if this field is specified for other squashMode settings.
320320

321321
* `network` -
322-
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
322+
(Optional)
323323
The source VPC network for `ip_ranges`.
324324
Required for instances using Private Service Connect, optional otherwise.
325325

@@ -354,7 +354,7 @@ The following arguments are supported:
354354
Possible values are: `DIRECT_PEERING`, `PRIVATE_SERVICE_ACCESS`, `PRIVATE_SERVICE_CONNECT`.
355355

356356
* `psc_config` -
357-
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
357+
(Optional)
358358
Private Service Connect configuration.
359359
Should only be set when connect_mode is PRIVATE_SERVICE_CONNECT.
360360
Structure is [documented below](#nested_networks_networks_psc_config).

0 commit comments

Comments
 (0)