Skip to content

Commit fe5507e

Browse files
Add external catalog dataset options to google_bigquery_dataset beta (#12113) (#8558)
[upstream:eb942f6be819dcb43d40b1c707d2b00a28579c3e] Signed-off-by: Modular Magician <[email protected]>
1 parent d8ce99d commit fe5507e

File tree

5 files changed

+266
-0
lines changed

5 files changed

+266
-0
lines changed

.changelog/12113.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
bigquery: added `external_catalog_dataset_options` fields to `google_bigquery_dataset` resource (beta)
3+
```

google-beta/services/bigquery/resource_bigquery_dataset.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,30 @@ expiration time indicated by this property.`,
173173
Optional: true,
174174
Description: `A user-friendly description of the dataset`,
175175
},
176+
"external_catalog_dataset_options": {
177+
Type: schema.TypeList,
178+
Optional: true,
179+
Description: `Options defining open source compatible datasets living in the BigQuery catalog. Contains
180+
metadata of open source database, schema or namespace represented by the current dataset.`,
181+
MaxItems: 1,
182+
Elem: &schema.Resource{
183+
Schema: map[string]*schema.Schema{
184+
"default_storage_location_uri": {
185+
Type: schema.TypeString,
186+
Optional: true,
187+
Description: `The storage location URI for all tables in the dataset. Equivalent to hive metastore's
188+
database locationUri. Maximum length of 1024 characters.`,
189+
},
190+
"parameters": {
191+
Type: schema.TypeMap,
192+
Optional: true,
193+
Description: `A map of key value pairs defining the parameters and properties of the open source schema.
194+
Maximum size of 2Mib.`,
195+
Elem: &schema.Schema{Type: schema.TypeString},
196+
},
197+
},
198+
},
199+
},
176200
"external_dataset_reference": {
177201
Type: schema.TypeList,
178202
Optional: true,
@@ -556,6 +580,12 @@ func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) err
556580
} else if v, ok := d.GetOkExists("resource_tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(resourceTagsProp)) && (ok || !reflect.DeepEqual(v, resourceTagsProp)) {
557581
obj["resourceTags"] = resourceTagsProp
558582
}
583+
externalCatalogDatasetOptionsProp, err := expandBigQueryDatasetExternalCatalogDatasetOptions(d.Get("external_catalog_dataset_options"), d, config)
584+
if err != nil {
585+
return err
586+
} else if v, ok := d.GetOkExists("external_catalog_dataset_options"); !tpgresource.IsEmptyValue(reflect.ValueOf(externalCatalogDatasetOptionsProp)) && (ok || !reflect.DeepEqual(v, externalCatalogDatasetOptionsProp)) {
587+
obj["externalCatalogDatasetOptions"] = externalCatalogDatasetOptionsProp
588+
}
559589
labelsProp, err := expandBigQueryDatasetEffectiveLabels(d.Get("effective_labels"), d, config)
560590
if err != nil {
561591
return err
@@ -723,6 +753,9 @@ func resourceBigQueryDatasetRead(d *schema.ResourceData, meta interface{}) error
723753
if err := d.Set("resource_tags", flattenBigQueryDatasetResourceTags(res["resourceTags"], d, config)); err != nil {
724754
return fmt.Errorf("Error reading Dataset: %s", err)
725755
}
756+
if err := d.Set("external_catalog_dataset_options", flattenBigQueryDatasetExternalCatalogDatasetOptions(res["externalCatalogDatasetOptions"], d, config)); err != nil {
757+
return fmt.Errorf("Error reading Dataset: %s", err)
758+
}
726759
if err := d.Set("terraform_labels", flattenBigQueryDatasetTerraformLabels(res["labels"], d, config)); err != nil {
727760
return fmt.Errorf("Error reading Dataset: %s", err)
728761
}
@@ -836,6 +869,12 @@ func resourceBigQueryDatasetUpdate(d *schema.ResourceData, meta interface{}) err
836869
} else if v, ok := d.GetOkExists("resource_tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, resourceTagsProp)) {
837870
obj["resourceTags"] = resourceTagsProp
838871
}
872+
externalCatalogDatasetOptionsProp, err := expandBigQueryDatasetExternalCatalogDatasetOptions(d.Get("external_catalog_dataset_options"), d, config)
873+
if err != nil {
874+
return err
875+
} else if v, ok := d.GetOkExists("external_catalog_dataset_options"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, externalCatalogDatasetOptionsProp)) {
876+
obj["externalCatalogDatasetOptions"] = externalCatalogDatasetOptionsProp
877+
}
839878
labelsProp, err := expandBigQueryDatasetEffectiveLabels(d.Get("effective_labels"), d, config)
840879
if err != nil {
841880
return err
@@ -1281,6 +1320,29 @@ func flattenBigQueryDatasetResourceTags(v interface{}, d *schema.ResourceData, c
12811320
return v
12821321
}
12831322

1323+
func flattenBigQueryDatasetExternalCatalogDatasetOptions(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1324+
if v == nil {
1325+
return nil
1326+
}
1327+
original := v.(map[string]interface{})
1328+
if len(original) == 0 {
1329+
return nil
1330+
}
1331+
transformed := make(map[string]interface{})
1332+
transformed["parameters"] =
1333+
flattenBigQueryDatasetExternalCatalogDatasetOptionsParameters(original["parameters"], d, config)
1334+
transformed["default_storage_location_uri"] =
1335+
flattenBigQueryDatasetExternalCatalogDatasetOptionsDefaultStorageLocationUri(original["defaultStorageLocationUri"], d, config)
1336+
return []interface{}{transformed}
1337+
}
1338+
func flattenBigQueryDatasetExternalCatalogDatasetOptionsParameters(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1339+
return v
1340+
}
1341+
1342+
func flattenBigQueryDatasetExternalCatalogDatasetOptionsDefaultStorageLocationUri(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1343+
return v
1344+
}
1345+
12841346
func flattenBigQueryDatasetTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
12851347
if v == nil {
12861348
return v
@@ -1677,6 +1739,47 @@ func expandBigQueryDatasetResourceTags(v interface{}, d tpgresource.TerraformRes
16771739
return m, nil
16781740
}
16791741

1742+
func expandBigQueryDatasetExternalCatalogDatasetOptions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1743+
l := v.([]interface{})
1744+
if len(l) == 0 || l[0] == nil {
1745+
return nil, nil
1746+
}
1747+
raw := l[0]
1748+
original := raw.(map[string]interface{})
1749+
transformed := make(map[string]interface{})
1750+
1751+
transformedParameters, err := expandBigQueryDatasetExternalCatalogDatasetOptionsParameters(original["parameters"], d, config)
1752+
if err != nil {
1753+
return nil, err
1754+
} else if val := reflect.ValueOf(transformedParameters); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1755+
transformed["parameters"] = transformedParameters
1756+
}
1757+
1758+
transformedDefaultStorageLocationUri, err := expandBigQueryDatasetExternalCatalogDatasetOptionsDefaultStorageLocationUri(original["default_storage_location_uri"], d, config)
1759+
if err != nil {
1760+
return nil, err
1761+
} else if val := reflect.ValueOf(transformedDefaultStorageLocationUri); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1762+
transformed["defaultStorageLocationUri"] = transformedDefaultStorageLocationUri
1763+
}
1764+
1765+
return transformed, nil
1766+
}
1767+
1768+
func expandBigQueryDatasetExternalCatalogDatasetOptionsParameters(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
1769+
if v == nil {
1770+
return map[string]string{}, nil
1771+
}
1772+
m := make(map[string]string)
1773+
for k, val := range v.(map[string]interface{}) {
1774+
m[k] = val.(string)
1775+
}
1776+
return m, nil
1777+
}
1778+
1779+
func expandBigQueryDatasetExternalCatalogDatasetOptionsDefaultStorageLocationUri(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1780+
return v, nil
1781+
}
1782+
16801783
func expandBigQueryDatasetEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
16811784
if v == nil {
16821785
return map[string]string{}, nil

google-beta/services/bigquery/resource_bigquery_dataset_generated_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,51 @@ resource "google_bigquery_dataset" "dataset" {
451451
`, context)
452452
}
453453

454+
func TestAccBigQueryDataset_bigqueryDatasetExternalCatalogDatasetOptionsExample(t *testing.T) {
455+
t.Parallel()
456+
457+
context := map[string]interface{}{
458+
"random_suffix": acctest.RandString(t, 10),
459+
}
460+
461+
acctest.VcrTest(t, resource.TestCase{
462+
PreCheck: func() { acctest.AccTestPreCheck(t) },
463+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
464+
CheckDestroy: testAccCheckBigQueryDatasetDestroyProducer(t),
465+
Steps: []resource.TestStep{
466+
{
467+
Config: testAccBigQueryDataset_bigqueryDatasetExternalCatalogDatasetOptionsExample(context),
468+
},
469+
{
470+
ResourceName: "google_bigquery_dataset.dataset",
471+
ImportState: true,
472+
ImportStateVerify: true,
473+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
474+
},
475+
},
476+
})
477+
}
478+
479+
func testAccBigQueryDataset_bigqueryDatasetExternalCatalogDatasetOptionsExample(context map[string]interface{}) string {
480+
return acctest.Nprintf(`
481+
resource "google_bigquery_dataset" "dataset" {
482+
provider = google-beta
483+
484+
dataset_id = "tf_test_example_dataset%{random_suffix}"
485+
friendly_name = "test"
486+
description = "This is a test description"
487+
location = "US"
488+
489+
external_catalog_dataset_options {
490+
parameters = {
491+
"dataset_owner" = "test_dataset_owner"
492+
}
493+
default_storage_location_uri = "gs://test_dataset/tables"
494+
}
495+
}
496+
`, context)
497+
}
498+
454499
func TestAccBigQueryDataset_bigqueryDatasetResourceTagsExample(t *testing.T) {
455500
t.Parallel()
456501

google-beta/services/bigquery/resource_bigquery_dataset_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,39 @@ func TestAccBigQueryDataset_bigqueryDatasetResourceTags_update(t *testing.T) {
455455
},
456456
})
457457
}
458+
func TestAccBigQueryDataset_externalCatalogDatasetOptions_update(t *testing.T) {
459+
t.Parallel()
460+
461+
context := map[string]interface{}{
462+
"random_suffix": acctest.RandString(t, 10),
463+
}
458464

465+
acctest.VcrTest(t, resource.TestCase{
466+
PreCheck: func() { acctest.AccTestPreCheck(t) },
467+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderBetaFactories(t),
468+
CheckDestroy: testAccCheckBigQueryDatasetDestroyProducer(t),
469+
Steps: []resource.TestStep{
470+
{
471+
Config: testAccBigQueryDataset_externalCatalogDatasetOptions_basic(context),
472+
},
473+
{
474+
ResourceName: "google_bigquery_dataset.dataset",
475+
ImportState: true,
476+
ImportStateVerify: true,
477+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
478+
},
479+
{
480+
Config: testAccBigQueryDataset_externalCatalogDatasetOptions_update(context),
481+
},
482+
{
483+
ResourceName: "google_bigquery_dataset.dataset",
484+
ImportState: true,
485+
ImportStateVerify: true,
486+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
487+
},
488+
},
489+
})
490+
}
459491
func testAccAddTable(t *testing.T, datasetID string, tableID string) resource.TestCheckFunc {
460492
// Not actually a check, but adds a table independently of terraform
461493
return func(s *terraform.State) error {
@@ -866,3 +898,43 @@ resource "google_bigquery_dataset" "dataset" {
866898
}
867899
`, context)
868900
}
901+
902+
func testAccBigQueryDataset_externalCatalogDatasetOptions_basic(context map[string]interface{}) string {
903+
return acctest.Nprintf(`
904+
resource "google_bigquery_dataset" "dataset" {
905+
provider = google-beta
906+
907+
dataset_id = "dataset%{random_suffix}"
908+
friendly_name = "test"
909+
description = "This is a test description"
910+
location = "US"
911+
912+
external_catalog_dataset_options {
913+
parameters = {
914+
"dataset_owner" = "dataset_owner"
915+
}
916+
default_storage_location_uri = "gs://test_dataset/tables"
917+
}
918+
}
919+
`, context)
920+
}
921+
922+
func testAccBigQueryDataset_externalCatalogDatasetOptions_update(context map[string]interface{}) string {
923+
return acctest.Nprintf(`
924+
resource "google_bigquery_dataset" "dataset" {
925+
provider = google-beta
926+
927+
dataset_id = "dataset%{random_suffix}"
928+
friendly_name = "test"
929+
description = "This is a test description"
930+
location = "US"
931+
932+
external_catalog_dataset_options {
933+
parameters = {
934+
"new_dataset_owner" = "new_dataset_owner"
935+
}
936+
default_storage_location_uri = "gs://new_test_dataset/new_tables"
937+
}
938+
}
939+
`, context)
940+
}

website/docs/r/bigquery_dataset.html.markdown

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,31 @@ resource "google_bigquery_dataset" "dataset" {
219219
}
220220
}
221221
```
222+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
223+
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=bigquery_dataset_external_catalog_dataset_options&open_in_editor=main.tf" target="_blank">
224+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
225+
</a>
226+
</div>
227+
## Example Usage - Bigquery Dataset External Catalog Dataset Options
228+
229+
230+
```hcl
231+
resource "google_bigquery_dataset" "dataset" {
232+
provider = google-beta
233+
234+
dataset_id = "example_dataset"
235+
friendly_name = "test"
236+
description = "This is a test description"
237+
location = "US"
238+
239+
external_catalog_dataset_options {
240+
parameters = {
241+
"dataset_owner" = "test_dataset_owner"
242+
}
243+
default_storage_location_uri = "gs://test_dataset/tables"
244+
}
245+
}
246+
```
222247

223248
## Argument Reference
224249

@@ -346,6 +371,12 @@ The following arguments are supported:
346371
to be the short name, for example "Production". See [Tag definitions](/iam/docs/tags-access-control#definitions)
347372
for more details.
348373

374+
* `external_catalog_dataset_options` -
375+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
376+
Options defining open source compatible datasets living in the BigQuery catalog. Contains
377+
metadata of open source database, schema or namespace represented by the current dataset.
378+
Structure is [documented below](#nested_external_catalog_dataset_options).
379+
349380
* `project` - (Optional) The ID of the project in which the resource belongs.
350381
If it is not provided, the provider project is used.
351382

@@ -489,6 +520,18 @@ destroying the resource will fail if tables are present.
489520
BigQuery table. The BigQuery Service Account associated with your project requires
490521
access to this encryption key.
491522

523+
<a name="nested_external_catalog_dataset_options"></a>The `external_catalog_dataset_options` block supports:
524+
525+
* `parameters` -
526+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
527+
A map of key value pairs defining the parameters and properties of the open source schema.
528+
Maximum size of 2Mib.
529+
530+
* `default_storage_location_uri` -
531+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
532+
The storage location URI for all tables in the dataset. Equivalent to hive metastore's
533+
database locationUri. Maximum length of 1024 characters.
534+
492535
## Attributes Reference
493536

494537
In addition to the arguments listed above, the following computed attributes are exported:

0 commit comments

Comments
 (0)