Skip to content

Add data clean rooms support #8029

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .changelog/11067.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
```release-note:enhancement
bigqueryanalyticshub: added `sharing_environment_config` to `google_bigquery_analytics_hub_data_exchange`
```
```release-note:enhancement
bigqueryanalyticshub: added `selected_resources`, and `restrict_direct_table_access` to `google_bigquery_analytics_hub_listing`
```
```release-note:breaking-change
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.
```
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,41 @@ func ResourceBigqueryAnalyticsHubDataExchange() *schema.Resource {
Optional: true,
Description: `Email or URL of the primary point of contact of the data exchange.`,
},
"sharing_environment_config": {
Type: schema.TypeList,
Computed: true,
Optional: true,
ForceNew: true,
Description: `Configurable data sharing environment option for a data exchange.
This field is required for data clean room exchanges.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"dcr_exchange_config": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Description: `Data Clean Room (DCR), used for privacy-safe and secured data sharing.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{},
},
ExactlyOneOf: []string{"sharing_environment_config.0.default_exchange_config", "sharing_environment_config.0.dcr_exchange_config"},
},
"default_exchange_config": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Description: `Default Analytics Hub data exchange, used for secured data sharing.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{},
},
ExactlyOneOf: []string{"sharing_environment_config.0.default_exchange_config", "sharing_environment_config.0.dcr_exchange_config"},
},
},
},
},
"listing_count": {
Type: schema.TypeInt,
Computed: true,
Expand Down Expand Up @@ -151,6 +186,12 @@ func resourceBigqueryAnalyticsHubDataExchangeCreate(d *schema.ResourceData, meta
} else if v, ok := d.GetOkExists("icon"); !tpgresource.IsEmptyValue(reflect.ValueOf(iconProp)) && (ok || !reflect.DeepEqual(v, iconProp)) {
obj["icon"] = iconProp
}
sharingEnvironmentConfigProp, err := expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(d.Get("sharing_environment_config"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("sharing_environment_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(sharingEnvironmentConfigProp)) && (ok || !reflect.DeepEqual(v, sharingEnvironmentConfigProp)) {
obj["sharingEnvironmentConfig"] = sharingEnvironmentConfigProp
}

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

return nil
}
Expand Down Expand Up @@ -489,6 +533,37 @@ func flattenBigqueryAnalyticsHubDataExchangeIcon(v interface{}, d *schema.Resour
return v
}

func flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["default_exchange_config"] =
flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(original["defaultExchangeConfig"], d, config)
transformed["dcr_exchange_config"] =
flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(original["dcrExchangeConfig"], d, config)
return []interface{}{transformed}
}
func flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
transformed := make(map[string]interface{})
return []interface{}{transformed}
}

func flattenBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return nil
}
transformed := make(map[string]interface{})
return []interface{}{transformed}
}

func expandBigqueryAnalyticsHubDataExchangeDisplayName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
Expand All @@ -508,3 +583,59 @@ func expandBigqueryAnalyticsHubDataExchangeDocumentation(v interface{}, d tpgres
func expandBigqueryAnalyticsHubDataExchangeIcon(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}

func expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})

transformedDefaultExchangeConfig, err := expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(original["default_exchange_config"], d, config)
if err != nil {
return nil, err
} else {
transformed["defaultExchangeConfig"] = transformedDefaultExchangeConfig
}

transformedDcrExchangeConfig, err := expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(original["dcr_exchange_config"], d, config)
if err != nil {
return nil, err
} else {
transformed["dcrExchangeConfig"] = transformedDcrExchangeConfig
}

return transformed, nil
}

func expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDefaultExchangeConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 {
return nil, nil
}

if l[0] == nil {
transformed := make(map[string]interface{})
return transformed, nil
}
transformed := make(map[string]interface{})

return transformed, nil
}

func expandBigqueryAnalyticsHubDataExchangeSharingEnvironmentConfigDcrExchangeConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 {
return nil, nil
}

if l[0] == nil {
transformed := make(map[string]interface{})
return transformed, nil
}
transformed := make(map[string]interface{})

return transformed, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,45 @@ resource "google_bigquery_analytics_hub_data_exchange" "data_exchange" {
`, context)
}

func TestAccBigqueryAnalyticsHubDataExchange_bigqueryAnalyticshubDataExchangeDcrExample(t *testing.T) {
t.Parallel()

context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
}

acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckBigqueryAnalyticsHubDataExchangeDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccBigqueryAnalyticsHubDataExchange_bigqueryAnalyticshubDataExchangeDcrExample(context),
},
{
ResourceName: "google_bigquery_analytics_hub_data_exchange.data_exchange",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"data_exchange_id", "location"},
},
},
})
}

func testAccBigqueryAnalyticsHubDataExchange_bigqueryAnalyticshubDataExchangeDcrExample(context map[string]interface{}) string {
return acctest.Nprintf(`
resource "google_bigquery_analytics_hub_data_exchange" "data_exchange" {
location = "US"
data_exchange_id = "tf_test_dcr_data_exchange%{random_suffix}"
display_name = "tf_test_dcr_data_exchange%{random_suffix}"
description = "example dcr data exchange%{random_suffix}"
sharing_environment_config {
dcr_exchange_config {}
}
}
`, context)
}

func testAccCheckBigqueryAnalyticsHubDataExchangeDestroyProducer(t *testing.T) func(s *terraform.State) error {
return func(s *terraform.State) error {
for name, rs := range s.RootModule().Resources {
Expand Down
Loading