Skip to content

Commit 2b082ae

Browse files
datafusion: Add network config fields for Private Service Connect (#10969) (#18525)
[upstream:b1a4a0722e54c1fdaac36f1f00ca4b1c6e328c0f] Signed-off-by: Modular Magician <[email protected]>
1 parent 3463a5b commit 2b082ae

File tree

4 files changed

+310
-10
lines changed

4 files changed

+310
-10
lines changed

.changelog/10969.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
datafusion: added fields `connection_type` and `private_service_connect_config` to enable using Private Service Connect with `google_data_fusion_instance` resources
3+
```

google/services/datafusion/resource_data_fusion_instance.go

+146-2
Original file line numberDiff line numberDiff line change
@@ -215,21 +215,65 @@ Please refer to the field 'effective_labels' for all of the labels present on th
215215
MaxItems: 1,
216216
Elem: &schema.Resource{
217217
Schema: map[string]*schema.Schema{
218+
"connection_type": {
219+
Type: schema.TypeString,
220+
Optional: true,
221+
ForceNew: true,
222+
ValidateFunc: verify.ValidateEnum([]string{"VPC_PEERING", "PRIVATE_SERVICE_CONNECT_INTERFACES", ""}),
223+
Description: `Optional. Type of connection for establishing private IP connectivity between the Data Fusion customer project VPC and
224+
the corresponding tenant project from a predefined list of available connection modes.
225+
If this field is unspecified for a private instance, VPC peering is used. Possible values: ["VPC_PEERING", "PRIVATE_SERVICE_CONNECT_INTERFACES"]`,
226+
},
218227
"ip_allocation": {
219228
Type: schema.TypeString,
220-
Required: true,
229+
Optional: true,
221230
ForceNew: true,
222231
Description: `The IP range in CIDR notation to use for the managed Data Fusion instance
223232
nodes. This range must not overlap with any other ranges used in the Data Fusion instance network.`,
224233
},
225234
"network": {
226235
Type: schema.TypeString,
227-
Required: true,
236+
Optional: true,
228237
ForceNew: true,
229238
Description: `Name of the network in the project with which the tenant project
230239
will be peered for executing pipelines. In case of shared VPC where the network resides in another host
231240
project the network should specified in the form of projects/{host-project-id}/global/networks/{network}`,
232241
},
242+
"private_service_connect_config": {
243+
Type: schema.TypeList,
244+
Optional: true,
245+
ForceNew: true,
246+
Description: `Optional. Configuration for Private Service Connect.
247+
This is required only when using connection type PRIVATE_SERVICE_CONNECT_INTERFACES.`,
248+
MaxItems: 1,
249+
Elem: &schema.Resource{
250+
Schema: map[string]*schema.Schema{
251+
"network_attachment": {
252+
Type: schema.TypeString,
253+
Optional: true,
254+
ForceNew: true,
255+
Description: `Optional. The reference to the network attachment used to establish private connectivity.
256+
It will be of the form projects/{project-id}/regions/{region}/networkAttachments/{network-attachment-id}.
257+
This is required only when using connection type PRIVATE_SERVICE_CONNECT_INTERFACES.`,
258+
},
259+
"unreachable_cidr_block": {
260+
Type: schema.TypeString,
261+
Optional: true,
262+
ForceNew: true,
263+
Description: `Optional. Input only. The CIDR block to which the CDF instance can't route traffic to in the consumer project VPC.
264+
The size of this block should be at least /25. This range should not overlap with the primary address range of any subnetwork used by the network attachment.
265+
This range can be used for other purposes in the consumer VPC as long as there is no requirement for CDF to reach destinations using these addresses.
266+
If this value is not provided, the server chooses a non RFC 1918 address range. The format of this field is governed by RFC 4632.`,
267+
},
268+
"effective_unreachable_cidr_block": {
269+
Type: schema.TypeString,
270+
Computed: true,
271+
Description: `Output only. The CIDR block to which the CDF instance can't route traffic to in the consumer project VPC.
272+
The size of this block is /25. The format of this field is governed by RFC 4632.`,
273+
},
274+
},
275+
},
276+
},
233277
},
234278
},
235279
},
@@ -961,6 +1005,10 @@ func flattenDataFusionInstanceNetworkConfig(v interface{}, d *schema.ResourceDat
9611005
flattenDataFusionInstanceNetworkConfigIpAllocation(original["ipAllocation"], d, config)
9621006
transformed["network"] =
9631007
flattenDataFusionInstanceNetworkConfigNetwork(original["network"], d, config)
1008+
transformed["connection_type"] =
1009+
flattenDataFusionInstanceNetworkConfigConnectionType(original["connectionType"], d, config)
1010+
transformed["private_service_connect_config"] =
1011+
flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfig(original["privateServiceConnectConfig"], d, config)
9641012
return []interface{}{transformed}
9651013
}
9661014
func flattenDataFusionInstanceNetworkConfigIpAllocation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
@@ -971,6 +1019,39 @@ func flattenDataFusionInstanceNetworkConfigNetwork(v interface{}, d *schema.Reso
9711019
return v
9721020
}
9731021

1022+
func flattenDataFusionInstanceNetworkConfigConnectionType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1023+
return v
1024+
}
1025+
1026+
func flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1027+
if v == nil {
1028+
return nil
1029+
}
1030+
original := v.(map[string]interface{})
1031+
if len(original) == 0 {
1032+
return nil
1033+
}
1034+
transformed := make(map[string]interface{})
1035+
transformed["network_attachment"] =
1036+
flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfigNetworkAttachment(original["networkAttachment"], d, config)
1037+
transformed["unreachable_cidr_block"] =
1038+
flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfigUnreachableCidrBlock(original["unreachableCidrBlock"], d, config)
1039+
transformed["effective_unreachable_cidr_block"] =
1040+
flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfigEffectiveUnreachableCidrBlock(original["effectiveUnreachableCidrBlock"], d, config)
1041+
return []interface{}{transformed}
1042+
}
1043+
func flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfigNetworkAttachment(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1044+
return v
1045+
}
1046+
1047+
func flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfigUnreachableCidrBlock(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1048+
return d.Get("network_config.0.private_service_connect_config.0.unreachable_cidr_block")
1049+
}
1050+
1051+
func flattenDataFusionInstanceNetworkConfigPrivateServiceConnectConfigEffectiveUnreachableCidrBlock(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1052+
return v
1053+
}
1054+
9741055
func flattenDataFusionInstanceZone(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
9751056
return v
9761057
}
@@ -1143,6 +1224,20 @@ func expandDataFusionInstanceNetworkConfig(v interface{}, d tpgresource.Terrafor
11431224
transformed["network"] = transformedNetwork
11441225
}
11451226

1227+
transformedConnectionType, err := expandDataFusionInstanceNetworkConfigConnectionType(original["connection_type"], d, config)
1228+
if err != nil {
1229+
return nil, err
1230+
} else if val := reflect.ValueOf(transformedConnectionType); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1231+
transformed["connectionType"] = transformedConnectionType
1232+
}
1233+
1234+
transformedPrivateServiceConnectConfig, err := expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfig(original["private_service_connect_config"], d, config)
1235+
if err != nil {
1236+
return nil, err
1237+
} else if val := reflect.ValueOf(transformedPrivateServiceConnectConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1238+
transformed["privateServiceConnectConfig"] = transformedPrivateServiceConnectConfig
1239+
}
1240+
11461241
return transformed, nil
11471242
}
11481243

@@ -1154,6 +1249,55 @@ func expandDataFusionInstanceNetworkConfigNetwork(v interface{}, d tpgresource.T
11541249
return v, nil
11551250
}
11561251

1252+
func expandDataFusionInstanceNetworkConfigConnectionType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1253+
return v, nil
1254+
}
1255+
1256+
func expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1257+
l := v.([]interface{})
1258+
if len(l) == 0 || l[0] == nil {
1259+
return nil, nil
1260+
}
1261+
raw := l[0]
1262+
original := raw.(map[string]interface{})
1263+
transformed := make(map[string]interface{})
1264+
1265+
transformedNetworkAttachment, err := expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfigNetworkAttachment(original["network_attachment"], d, config)
1266+
if err != nil {
1267+
return nil, err
1268+
} else if val := reflect.ValueOf(transformedNetworkAttachment); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1269+
transformed["networkAttachment"] = transformedNetworkAttachment
1270+
}
1271+
1272+
transformedUnreachableCidrBlock, err := expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfigUnreachableCidrBlock(original["unreachable_cidr_block"], d, config)
1273+
if err != nil {
1274+
return nil, err
1275+
} else if val := reflect.ValueOf(transformedUnreachableCidrBlock); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1276+
transformed["unreachableCidrBlock"] = transformedUnreachableCidrBlock
1277+
}
1278+
1279+
transformedEffectiveUnreachableCidrBlock, err := expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfigEffectiveUnreachableCidrBlock(original["effective_unreachable_cidr_block"], d, config)
1280+
if err != nil {
1281+
return nil, err
1282+
} else if val := reflect.ValueOf(transformedEffectiveUnreachableCidrBlock); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1283+
transformed["effectiveUnreachableCidrBlock"] = transformedEffectiveUnreachableCidrBlock
1284+
}
1285+
1286+
return transformed, nil
1287+
}
1288+
1289+
func expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfigNetworkAttachment(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1290+
return v, nil
1291+
}
1292+
1293+
func expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfigUnreachableCidrBlock(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1294+
return v, nil
1295+
}
1296+
1297+
func expandDataFusionInstanceNetworkConfigPrivateServiceConnectConfigEffectiveUnreachableCidrBlock(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1298+
return v, nil
1299+
}
1300+
11571301
func expandDataFusionInstanceZone(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
11581302
return v, nil
11591303
}

google/services/datafusion/resource_data_fusion_instance_generated_test.go

+76-6
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestAccDataFusionInstance_dataFusionInstanceBasicExample(t *testing.T) {
5050
ResourceName: "google_data_fusion_instance.basic_instance",
5151
ImportState: true,
5252
ImportStateVerify: true,
53-
ImportStateVerifyIgnore: []string{"labels", "region", "terraform_labels"},
53+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
5454
},
5555
},
5656
})
@@ -87,7 +87,7 @@ func TestAccDataFusionInstance_dataFusionInstanceFullExample(t *testing.T) {
8787
ResourceName: "google_data_fusion_instance.extended_instance",
8888
ImportState: true,
8989
ImportStateVerify: true,
90-
ImportStateVerifyIgnore: []string{"labels", "region", "terraform_labels"},
90+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
9191
},
9292
},
9393
})
@@ -139,6 +139,76 @@ resource "google_compute_global_address" "private_ip_alloc" {
139139
`, context)
140140
}
141141

142+
func TestAccDataFusionInstance_dataFusionInstancePscExample(t *testing.T) {
143+
t.Parallel()
144+
145+
context := map[string]interface{}{
146+
"prober_test_run": `options = { prober_test_run = "true" }`,
147+
"random_suffix": acctest.RandString(t, 10),
148+
}
149+
150+
acctest.VcrTest(t, resource.TestCase{
151+
PreCheck: func() { acctest.AccTestPreCheck(t) },
152+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
153+
CheckDestroy: testAccCheckDataFusionInstanceDestroyProducer(t),
154+
Steps: []resource.TestStep{
155+
{
156+
Config: testAccDataFusionInstance_dataFusionInstancePscExample(context),
157+
},
158+
{
159+
ResourceName: "google_data_fusion_instance.psc_instance",
160+
ImportState: true,
161+
ImportStateVerify: true,
162+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
163+
},
164+
},
165+
})
166+
}
167+
168+
func testAccDataFusionInstance_dataFusionInstancePscExample(context map[string]interface{}) string {
169+
return acctest.Nprintf(`
170+
resource "google_data_fusion_instance" "psc_instance" {
171+
name = "tf-test-psc-instance%{random_suffix}"
172+
region = "us-central1"
173+
type = "BASIC"
174+
private_instance = true
175+
176+
network_config {
177+
connection_type = "PRIVATE_SERVICE_CONNECT_INTERFACES"
178+
private_service_connect_config {
179+
network_attachment = google_compute_network_attachment.psc.id
180+
unreachable_cidr_block = "192.168.0.0/25"
181+
}
182+
}
183+
184+
%{prober_test_run}
185+
}
186+
187+
resource "google_compute_network" "psc" {
188+
name = "tf-test-datafusion-psc-network%{random_suffix}"
189+
auto_create_subnetworks = false
190+
}
191+
192+
resource "google_compute_subnetwork" "psc" {
193+
name = "tf-test-datafusion-psc-subnet%{random_suffix}"
194+
region = "us-central1"
195+
196+
network = google_compute_network.psc.id
197+
ip_cidr_range = "10.0.0.0/16"
198+
}
199+
200+
resource "google_compute_network_attachment" "psc" {
201+
name = "tf-test-datafusion-psc-attachment%{random_suffix}"
202+
region = "us-central1"
203+
connection_preference = "ACCEPT_AUTOMATIC"
204+
205+
subnetworks = [
206+
google_compute_subnetwork.psc.self_link
207+
]
208+
}
209+
`, context)
210+
}
211+
142212
func TestAccDataFusionInstance_dataFusionInstanceCmekExample(t *testing.T) {
143213
t.Parallel()
144214

@@ -158,7 +228,7 @@ func TestAccDataFusionInstance_dataFusionInstanceCmekExample(t *testing.T) {
158228
ResourceName: "google_data_fusion_instance.cmek",
159229
ImportState: true,
160230
ImportStateVerify: true,
161-
ImportStateVerifyIgnore: []string{"labels", "region", "terraform_labels"},
231+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
162232
},
163233
},
164234
})
@@ -219,7 +289,7 @@ func TestAccDataFusionInstance_dataFusionInstanceEnterpriseExample(t *testing.T)
219289
ResourceName: "google_data_fusion_instance.enterprise_instance",
220290
ImportState: true,
221291
ImportStateVerify: true,
222-
ImportStateVerifyIgnore: []string{"labels", "region", "terraform_labels"},
292+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
223293
},
224294
},
225295
})
@@ -256,7 +326,7 @@ func TestAccDataFusionInstance_dataFusionInstanceEventExample(t *testing.T) {
256326
ResourceName: "google_data_fusion_instance.event",
257327
ImportState: true,
258328
ImportStateVerify: true,
259-
ImportStateVerifyIgnore: []string{"labels", "region", "terraform_labels"},
329+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
260330
},
261331
},
262332
})
@@ -300,7 +370,7 @@ func TestAccDataFusionInstance_dataFusionInstanceZoneExample(t *testing.T) {
300370
ResourceName: "google_data_fusion_instance.zone",
301371
ImportState: true,
302372
ImportStateVerify: true,
303-
ImportStateVerifyIgnore: []string{"labels", "region", "terraform_labels"},
373+
ImportStateVerifyIgnore: []string{"labels", "network_config.0.private_service_connect_config.0.unreachable_cidr_block", "region", "terraform_labels"},
304374
},
305375
},
306376
})

0 commit comments

Comments
 (0)