Skip to content

Commit 4f3ae7f

Browse files
Add data clean rooms support (#11067)
[upstream:bbf4d6ca31eacc0f40a43355754930bc32191db6] Signed-off-by: Modular Magician <[email protected]>
1 parent 7dbcab2 commit 4f3ae7f

7 files changed

+488
-10
lines changed

.changelog/11067.txt

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
```release-note:enhancement
2+
bigqueryanalyticshub: added `sharing_environment_config` to `google_bigquery_analytics_hub_data_exchange`
3+
```
4+
```release-note:enhancement
5+
bigqueryanalyticshub: added `selected_resources`, and `restrict_direct_table_access` to `google_bigquery_analytics_hub_listing`
6+
```
7+
```release-note:breaking-change
8+
bigqueryanalyticshub: made `bigquery_dataset` immutable in `google_bigquery_analytics_hub_listing`. Now modifying the field will recreate the resource rather than causing Terraform to report it would attempt an invalid update.
9+
```

google-beta/services/bigqueryanalyticshub/resource_bigquery_analytics_hub_data_exchange.go

+131
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,41 @@ func ResourceBigqueryAnalyticsHubDataExchange() *schema.Resource {
9191
Optional: true,
9292
Description: `Email or URL of the primary point of contact of the data exchange.`,
9393
},
94+
"sharing_environment_config": {
95+
Type: schema.TypeList,
96+
Computed: true,
97+
Optional: true,
98+
ForceNew: true,
99+
Description: `Configurable data sharing environment option for a data exchange.
100+
This field is required for data clean room exchanges.`,
101+
MaxItems: 1,
102+
Elem: &schema.Resource{
103+
Schema: map[string]*schema.Schema{
104+
"dcr_exchange_config": {
105+
Type: schema.TypeList,
106+
Optional: true,
107+
ForceNew: true,
108+
Description: `Data Clean Room (DCR), used for privacy-safe and secured data sharing.`,
109+
MaxItems: 1,
110+
Elem: &schema.Resource{
111+
Schema: map[string]*schema.Schema{},
112+
},
113+
ExactlyOneOf: []string{"sharing_environment_config.0.default_exchange_config", "sharing_environment_config.0.dcr_exchange_config"},
114+
},
115+
"default_exchange_config": {
116+
Type: schema.TypeList,
117+
Optional: true,
118+
ForceNew: true,
119+
Description: `Default Analytics Hub data exchange, used for secured data sharing.`,
120+
MaxItems: 1,
121+
Elem: &schema.Resource{
122+
Schema: map[string]*schema.Schema{},
123+
},
124+
ExactlyOneOf: []string{"sharing_environment_config.0.default_exchange_config", "sharing_environment_config.0.dcr_exchange_config"},
125+
},
126+
},
127+
},
128+
},
94129
"listing_count": {
95130
Type: schema.TypeInt,
96131
Computed: true,
@@ -151,6 +186,12 @@ func resourceBigqueryAnalyticsHubDataExchangeCreate(d *schema.ResourceData, meta
151186
} else if v, ok := d.GetOkExists("icon"); !tpgresource.IsEmptyValue(reflect.ValueOf(iconProp)) && (ok || !reflect.DeepEqual(v, iconProp)) {
152187
obj["icon"] = iconProp
153188
}
189+
sharingEnvironmentConfigProp, err := expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(d.Get("sharing_environment_config"), d, config)
190+
if err != nil {
191+
return err
192+
} else if v, ok := d.GetOkExists("sharing_environment_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(sharingEnvironmentConfigProp)) && (ok || !reflect.DeepEqual(v, sharingEnvironmentConfigProp)) {
193+
obj["sharingEnvironmentConfig"] = sharingEnvironmentConfigProp
194+
}
154195

155196
url, err := tpgresource.ReplaceVars(d, config, "{{BigqueryAnalyticsHubBasePath}}projects/{{project}}/locations/{{location}}/dataExchanges?data_exchange_id={{data_exchange_id}}")
156197
if err != nil {
@@ -264,6 +305,9 @@ func resourceBigqueryAnalyticsHubDataExchangeRead(d *schema.ResourceData, meta i
264305
if err := d.Set("icon", flattenBigqueryAnalyticsHubDataExchangeIcon(res["icon"], d, config)); err != nil {
265306
return fmt.Errorf("Error reading DataExchange: %s", err)
266307
}
308+
if err := d.Set("sharing_environment_config", flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(res["sharingEnvironmentConfig"], d, config)); err != nil {
309+
return fmt.Errorf("Error reading DataExchange: %s", err)
310+
}
267311

268312
return nil
269313
}
@@ -489,6 +533,37 @@ func flattenBigqueryAnalyticsHubDataExchangeIcon(v interface{}, d *schema.Resour
489533
return v
490534
}
491535

536+
func flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
537+
if v == nil {
538+
return nil
539+
}
540+
original := v.(map[string]interface{})
541+
if len(original) == 0 {
542+
return nil
543+
}
544+
transformed := make(map[string]interface{})
545+
transformed["default_exchange_config"] =
546+
flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(original["defaultExchangeConfig"], d, config)
547+
transformed["dcr_exchange_config"] =
548+
flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(original["dcrExchangeConfig"], d, config)
549+
return []interface{}{transformed}
550+
}
551+
func flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
552+
if v == nil {
553+
return nil
554+
}
555+
transformed := make(map[string]interface{})
556+
return []interface{}{transformed}
557+
}
558+
559+
func flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
560+
if v == nil {
561+
return nil
562+
}
563+
transformed := make(map[string]interface{})
564+
return []interface{}{transformed}
565+
}
566+
492567
func expandBigqueryAnalyticsHubDataExchangeDisplayName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
493568
return v, nil
494569
}
@@ -508,3 +583,59 @@ func expandBigqueryAnalyticsHubDataExchangeDocumentation(v interface{}, d tpgres
508583
func expandBigqueryAnalyticsHubDataExchangeIcon(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
509584
return v, nil
510585
}
586+
587+
func expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
588+
l := v.([]interface{})
589+
if len(l) == 0 || l[0] == nil {
590+
return nil, nil
591+
}
592+
raw := l[0]
593+
original := raw.(map[string]interface{})
594+
transformed := make(map[string]interface{})
595+
596+
transformedDefaultExchangeConfig, err := expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(original["default_exchange_config"], d, config)
597+
if err != nil {
598+
return nil, err
599+
} else {
600+
transformed["defaultExchangeConfig"] = transformedDefaultExchangeConfig
601+
}
602+
603+
transformedDcrExchangeConfig, err := expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(original["dcr_exchange_config"], d, config)
604+
if err != nil {
605+
return nil, err
606+
} else {
607+
transformed["dcrExchangeConfig"] = transformedDcrExchangeConfig
608+
}
609+
610+
return transformed, nil
611+
}
612+
613+
func expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
614+
l := v.([]interface{})
615+
if len(l) == 0 {
616+
return nil, nil
617+
}
618+
619+
if l[0] == nil {
620+
transformed := make(map[string]interface{})
621+
return transformed, nil
622+
}
623+
transformed := make(map[string]interface{})
624+
625+
return transformed, nil
626+
}
627+
628+
func expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
629+
l := v.([]interface{})
630+
if len(l) == 0 {
631+
return nil, nil
632+
}
633+
634+
if l[0] == nil {
635+
transformed := make(map[string]interface{})
636+
return transformed, nil
637+
}
638+
transformed := make(map[string]interface{})
639+
640+
return transformed, nil
641+
}

google-beta/services/bigqueryanalyticshub/resource_bigquery_analytics_hub_data_exchange_generated_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,45 @@ resource "google_bigquery_analytics_hub_data_exchange" "data_exchange" {
6666
`, context)
6767
}
6868

69+
func TestAccBigqueryAnalyticsHubDataExchange_bigqueryAnalyticshubDataExchangeDcrExample(t *testing.T) {
70+
t.Parallel()
71+
72+
context := map[string]interface{}{
73+
"random_suffix": acctest.RandString(t, 10),
74+
}
75+
76+
acctest.VcrTest(t, resource.TestCase{
77+
PreCheck: func() { acctest.AccTestPreCheck(t) },
78+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
79+
CheckDestroy: testAccCheckBigqueryAnalyticsHubDataExchangeDestroyProducer(t),
80+
Steps: []resource.TestStep{
81+
{
82+
Config: testAccBigqueryAnalyticsHubDataExchange_bigqueryAnalyticshubDataExchangeDcrExample(context),
83+
},
84+
{
85+
ResourceName: "google_bigquery_analytics_hub_data_exchange.data_exchange",
86+
ImportState: true,
87+
ImportStateVerify: true,
88+
ImportStateVerifyIgnore: []string{"data_exchange_id", "location"},
89+
},
90+
},
91+
})
92+
}
93+
94+
func testAccBigqueryAnalyticsHubDataExchange_bigqueryAnalyticshubDataExchangeDcrExample(context map[string]interface{}) string {
95+
return acctest.Nprintf(`
96+
resource "google_bigquery_analytics_hub_data_exchange" "data_exchange" {
97+
location = "US"
98+
data_exchange_id = "tf_test_dcr_data_exchange%{random_suffix}"
99+
display_name = "tf_test_dcr_data_exchange%{random_suffix}"
100+
description = "example dcr data exchange%{random_suffix}"
101+
sharing_environment_config {
102+
dcr_exchange_config {}
103+
}
104+
}
105+
`, context)
106+
}
107+
69108
func testAccCheckBigqueryAnalyticsHubDataExchangeDestroyProducer(t *testing.T) func(s *terraform.State) error {
70109
return func(s *terraform.State) error {
71110
for name, rs := range s.RootModule().Resources {

0 commit comments

Comments
 (0)