Skip to content

Commit 7b7712e

Browse files
Add PSC fields to Filestore instance in beta (#13883) (#10061)
[upstream:d971f7b0ae94ecca883f31345c1a43d1c327407a] Signed-off-by: Modular Magician <[email protected]>
1 parent b42ddae commit 7b7712e

File tree

5 files changed

+277
-3
lines changed

5 files changed

+277
-3
lines changed

.changelog/13883.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` (beta)
3+
```

google-beta/services/filestore/resource_filestore_instance.go

Lines changed: 92 additions & 2 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,
@@ -187,12 +193,32 @@ instance is connected.`,
187193
Type: schema.TypeString,
188194
Optional: true,
189195
ForceNew: true,
190-
ValidateFunc: verify.ValidateEnum([]string{"DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS", ""}),
196+
ValidateFunc: verify.ValidateEnum([]string{"DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS", "PRIVATE_SERVICE_CONNECT", ""}),
191197
Description: `The network connect mode of the Filestore instance.
192198
If not provided, the connect mode defaults to
193-
DIRECT_PEERING. Default value: "DIRECT_PEERING" Possible values: ["DIRECT_PEERING", "PRIVATE_SERVICE_ACCESS"]`,
199+
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,
@@ -1074,6 +1100,7 @@ func flattenFilestoreInstanceFileSharesNfsExportOptions(v interface{}, d *schema
10741100
"squash_mode": flattenFilestoreInstanceFileSharesNfsExportOptionsSquashMode(original["squashMode"], d, config),
10751101
"anon_uid": flattenFilestoreInstanceFileSharesNfsExportOptionsAnonUid(original["anonUid"], d, config),
10761102
"anon_gid": flattenFilestoreInstanceFileSharesNfsExportOptionsAnonGid(original["anonGid"], d, config),
1103+
"network": flattenFilestoreInstanceFileSharesNfsExportOptionsNetwork(original["network"], d, config),
10771104
})
10781105
}
10791106
return transformed
@@ -1124,6 +1151,10 @@ func flattenFilestoreInstanceFileSharesNfsExportOptionsAnonGid(v interface{}, d
11241151
return v // let terraform core handle it otherwise
11251152
}
11261153

1154+
func flattenFilestoreInstanceFileSharesNfsExportOptionsNetwork(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1155+
return v
1156+
}
1157+
11271158
func flattenFilestoreInstanceNetworks(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
11281159
if v == nil {
11291160
return v
@@ -1142,6 +1173,7 @@ func flattenFilestoreInstanceNetworks(v interface{}, d *schema.ResourceData, con
11421173
"reserved_ip_range": flattenFilestoreInstanceNetworksReservedIpRange(original["reservedIpRange"], d, config),
11431174
"ip_addresses": flattenFilestoreInstanceNetworksIpAddresses(original["ipAddresses"], d, config),
11441175
"connect_mode": flattenFilestoreInstanceNetworksConnectMode(original["connectMode"], d, config),
1176+
"psc_config": flattenFilestoreInstanceNetworksPscConfig(original["pscConfig"], d, config),
11451177
})
11461178
}
11471179
return transformed
@@ -1170,6 +1202,23 @@ func flattenFilestoreInstanceNetworksConnectMode(v interface{}, d *schema.Resour
11701202
return v
11711203
}
11721204

1205+
func flattenFilestoreInstanceNetworksPscConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1206+
if v == nil {
1207+
return nil
1208+
}
1209+
original := v.(map[string]interface{})
1210+
if len(original) == 0 {
1211+
return nil
1212+
}
1213+
transformed := make(map[string]interface{})
1214+
transformed["endpoint_project"] =
1215+
flattenFilestoreInstanceNetworksPscConfigEndpointProject(original["endpointProject"], d, config)
1216+
return []interface{}{transformed}
1217+
}
1218+
func flattenFilestoreInstanceNetworksPscConfigEndpointProject(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1219+
return v
1220+
}
1221+
11731222
func flattenFilestoreInstanceEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
11741223
return v
11751224
}
@@ -1485,6 +1534,13 @@ func expandFilestoreInstanceFileSharesNfsExportOptions(v interface{}, d tpgresou
14851534
transformed["anonGid"] = transformedAnonGid
14861535
}
14871536

1537+
transformedNetwork, err := expandFilestoreInstanceFileSharesNfsExportOptionsNetwork(original["network"], d, config)
1538+
if err != nil {
1539+
return nil, err
1540+
} else if val := reflect.ValueOf(transformedNetwork); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1541+
transformed["network"] = transformedNetwork
1542+
}
1543+
14881544
req = append(req, transformed)
14891545
}
14901546
return req, nil
@@ -1510,6 +1566,10 @@ func expandFilestoreInstanceFileSharesNfsExportOptionsAnonGid(v interface{}, d t
15101566
return v, nil
15111567
}
15121568

1569+
func expandFilestoreInstanceFileSharesNfsExportOptionsNetwork(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1570+
return v, nil
1571+
}
1572+
15131573
func expandFilestoreInstanceNetworks(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
15141574
l := v.([]interface{})
15151575
req := make([]interface{}, 0, len(l))
@@ -1555,6 +1615,13 @@ func expandFilestoreInstanceNetworks(v interface{}, d tpgresource.TerraformResou
15551615
transformed["connectMode"] = transformedConnectMode
15561616
}
15571617

1618+
transformedPscConfig, err := expandFilestoreInstanceNetworksPscConfig(original["psc_config"], d, config)
1619+
if err != nil {
1620+
return nil, err
1621+
} else if val := reflect.ValueOf(transformedPscConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1622+
transformed["pscConfig"] = transformedPscConfig
1623+
}
1624+
15581625
req = append(req, transformed)
15591626
}
15601627
return req, nil
@@ -1580,6 +1647,29 @@ func expandFilestoreInstanceNetworksConnectMode(v interface{}, d tpgresource.Ter
15801647
return v, nil
15811648
}
15821649

1650+
func expandFilestoreInstanceNetworksPscConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1651+
l := v.([]interface{})
1652+
if len(l) == 0 || l[0] == nil {
1653+
return nil, nil
1654+
}
1655+
raw := l[0]
1656+
original := raw.(map[string]interface{})
1657+
transformed := make(map[string]interface{})
1658+
1659+
transformedEndpointProject, err := expandFilestoreInstanceNetworksPscConfigEndpointProject(original["endpoint_project"], d, config)
1660+
if err != nil {
1661+
return nil, err
1662+
} else if val := reflect.ValueOf(transformedEndpointProject); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1663+
transformed["endpointProject"] = transformedEndpointProject
1664+
}
1665+
1666+
return transformed, nil
1667+
}
1668+
1669+
func expandFilestoreInstanceNetworksPscConfigEndpointProject(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1670+
return v, nil
1671+
}
1672+
15831673
func expandFilestoreInstanceKmsKeyName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
15841674
return v, nil
15851675
}

google-beta/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-beta/services/filestore/resource_filestore_instance_test.go

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,3 +606,161 @@ resource "google_filestore_instance" "instance" {
606606
}
607607
`, name, location, tier)
608608
}
609+
610+
func TestAccFilestoreInstance_psc(t *testing.T) {
611+
t.Parallel()
612+
613+
context := map[string]interface{}{
614+
"name": fmt.Sprintf("tf-test-%d", acctest.RandInt(t)),
615+
"location": "us-central1",
616+
"tier": "REGIONAL",
617+
}
618+
619+
acctest.VcrTest(t, resource.TestCase{
620+
PreCheck: func() { acctest.AccTestPreCheck(t) },
621+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
622+
CheckDestroy: testAccCheckFilestoreInstanceDestroyProducer(t),
623+
Steps: []resource.TestStep{
624+
{
625+
Config: testAccFilestoreInstance_psc(context),
626+
Check: resource.ComposeTestCheckFunc(
627+
resource.TestCheckResourceAttr("google_filestore_instance.instance", "networks.0.connect_mode", "PRIVATE_SERVICE_CONNECT"),
628+
),
629+
},
630+
{
631+
ResourceName: "google_filestore_instance.instance",
632+
ImportState: true,
633+
ImportStateVerify: true,
634+
ImportStateVerifyIgnore: []string{"zone"},
635+
},
636+
},
637+
})
638+
}
639+
640+
func testAccFilestoreInstance_psc(context map[string]interface{}) string {
641+
return acctest.Nprintf(`
642+
data "google_client_config" "current" {
643+
provider = google-beta
644+
}
645+
646+
resource "google_compute_network" "psc_network" {
647+
provider = google-beta
648+
name = "%{name}"
649+
auto_create_subnetworks = false
650+
}
651+
652+
resource "google_compute_subnetwork" "psc_subnet" {
653+
provider = google-beta
654+
name = "%{name}"
655+
ip_cidr_range = "10.2.0.0/16"
656+
region = "%{location}"
657+
network = google_compute_network.psc_network.id
658+
}
659+
660+
resource "google_network_connectivity_service_connection_policy" "default" {
661+
provider = google-beta
662+
name = "%{name}"
663+
location = "%{location}"
664+
service_class = "google-cloud-filestore"
665+
network = google_compute_network.psc_network.id
666+
psc_config {
667+
subnetworks = [google_compute_subnetwork.psc_subnet.id]
668+
}
669+
}
670+
671+
resource "google_filestore_instance" "instance" {
672+
provider = google-beta
673+
depends_on = [
674+
google_network_connectivity_service_connection_policy.default
675+
]
676+
name = "%{name}"
677+
location = "%{location}"
678+
tier = "%{tier}"
679+
description = "An instance created during testing."
680+
protocol = "NFS_V4_1"
681+
682+
file_shares {
683+
capacity_gb = 1024
684+
name = "share"
685+
686+
nfs_export_options {
687+
ip_ranges = ["70.0.0.1/24"]
688+
network = google_compute_network.psc_network.name
689+
}
690+
}
691+
692+
networks {
693+
network = google_compute_network.psc_network.name
694+
modes = ["MODE_IPV4"]
695+
connect_mode = "PRIVATE_SERVICE_CONNECT"
696+
psc_config {
697+
endpoint_project = data.google_client_config.current.project
698+
}
699+
}
700+
}
701+
`, context)
702+
}
703+
704+
func TestAccFilestoreInstance_nfsExportOptionsNetwork_update(t *testing.T) {
705+
t.Parallel()
706+
707+
name := fmt.Sprintf("tf-test-%d", acctest.RandInt(t))
708+
location := "us-central1-a"
709+
tier := "ZONAL"
710+
711+
// Currently, we can only alternate between an empty network and the instance network of non-PSC instances.
712+
acctest.VcrTest(t, resource.TestCase{
713+
PreCheck: func() { acctest.AccTestPreCheck(t) },
714+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
715+
CheckDestroy: testAccCheckFilestoreInstanceDestroyProducer(t),
716+
Steps: []resource.TestStep{
717+
{
718+
Config: testAccFilestoreInstance_nfsExportOptionsNetwork_update(name, location, tier, ""),
719+
Check: resource.TestCheckResourceAttr("google_filestore_instance.instance", "file_shares.0.nfs_export_options.0.network", ""),
720+
},
721+
{
722+
ResourceName: "google_filestore_instance.instance",
723+
ImportState: true,
724+
ImportStateVerify: true,
725+
ImportStateVerifyIgnore: []string{"zone"},
726+
},
727+
{
728+
Config: testAccFilestoreInstance_nfsExportOptionsNetwork_update(name, location, tier, "default"),
729+
Check: resource.TestCheckResourceAttr("google_filestore_instance.instance", "file_shares.0.nfs_export_options.0.network", "default"),
730+
},
731+
{
732+
ResourceName: "google_filestore_instance.instance",
733+
ImportState: true,
734+
ImportStateVerify: true,
735+
ImportStateVerifyIgnore: []string{"zone"},
736+
},
737+
},
738+
})
739+
}
740+
741+
func testAccFilestoreInstance_nfsExportOptionsNetwork_update(name, location, tier, network string) string {
742+
return fmt.Sprintf(`
743+
resource "google_filestore_instance" "instance" {
744+
provider = google-beta
745+
name = "%s"
746+
zone = "%s"
747+
tier = "%s"
748+
description = "An instance created during testing."
749+
750+
file_shares {
751+
capacity_gb = 1024
752+
name = "share"
753+
754+
nfs_export_options {
755+
ip_ranges = ["70.0.0.1/24"]
756+
network = "%s"
757+
}
758+
}
759+
760+
networks {
761+
network = "default"
762+
modes = ["MODE_IPV4"]
763+
}
764+
}
765+
`, name, location, tier, network)
766+
}

website/docs/r/filestore_instance.html.markdown

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ The following arguments are supported:
241241
Anon_gid may only be set with squashMode of ROOT_SQUASH. An error will be returned
242242
if this field is specified for other squashMode settings.
243243

244+
* `network` -
245+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
246+
The source VPC network for `ip_ranges`.
247+
Required for instances using Private Service Connect, optional otherwise.
248+
244249
<a name="nested_networks"></a>The `networks` block supports:
245250

246251
* `network` -
@@ -269,7 +274,23 @@ The following arguments are supported:
269274
If not provided, the connect mode defaults to
270275
DIRECT_PEERING.
271276
Default value is `DIRECT_PEERING`.
272-
Possible values are: `DIRECT_PEERING`, `PRIVATE_SERVICE_ACCESS`.
277+
Possible values are: `DIRECT_PEERING`, `PRIVATE_SERVICE_ACCESS`, `PRIVATE_SERVICE_CONNECT`.
278+
279+
* `psc_config` -
280+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
281+
Private Service Connect configuration.
282+
Should only be set when connect_mode is PRIVATE_SERVICE_CONNECT.
283+
Structure is [documented below](#nested_networks_networks_psc_config).
284+
285+
286+
<a name="nested_networks_networks_psc_config"></a>The `psc_config` block supports:
287+
288+
* `endpoint_project` -
289+
(Optional)
290+
Consumer service project in which the Private Service Connect endpoint
291+
would be set up. This is optional, and only relevant in case the network
292+
is a shared VPC. If this is not specified, the endpoint would be set up
293+
in the VPC host project.
273294

274295
- - -
275296

0 commit comments

Comments
 (0)