Skip to content

Commit 12af4ed

Browse files
Promote support for BigQuery dataset resource tags to GA (#11122) (#18711)
[upstream:6d7694e741f58ffa199749eb2adafe4857c34ee0] Signed-off-by: Modular Magician <[email protected]>
1 parent 51f78ca commit 12af4ed

File tree

5 files changed

+218
-1
lines changed

5 files changed

+218
-1
lines changed

.changelog/11122.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
bigquery: added `resource_tags` field to `google_bigquery_dataset` resource (ga)
3+
```

google/services/bigquery/resource_bigquery_dataset.go

+40
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,16 @@ Changing this forces a new resource to be created.`,
242242
Optional: true,
243243
Description: `Defines the time travel window in hours. The value can be from 48 to 168 hours (2 to 7 days).`,
244244
},
245+
"resource_tags": {
246+
Type: schema.TypeMap,
247+
Optional: true,
248+
Description: `The tags attached to this table. Tag keys are globally unique. Tag key is expected to be
249+
in the namespaced format, for example "123456789012/environment" where 123456789012 is the
250+
ID of the parent organization or project resource for this tag key. Tag value is expected
251+
to be the short name, for example "Production". See [Tag definitions](/iam/docs/tags-access-control#definitions)
252+
for more details.`,
253+
Elem: &schema.Schema{Type: schema.TypeString},
254+
},
245255
"storage_billing_model": {
246256
Type: schema.TypeString,
247257
Computed: true,
@@ -540,6 +550,12 @@ func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) err
540550
} else if v, ok := d.GetOkExists("storage_billing_model"); !tpgresource.IsEmptyValue(reflect.ValueOf(storageBillingModelProp)) && (ok || !reflect.DeepEqual(v, storageBillingModelProp)) {
541551
obj["storageBillingModel"] = storageBillingModelProp
542552
}
553+
resourceTagsProp, err := expandBigQueryDatasetResourceTags(d.Get("resource_tags"), d, config)
554+
if err != nil {
555+
return err
556+
} else if v, ok := d.GetOkExists("resource_tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(resourceTagsProp)) && (ok || !reflect.DeepEqual(v, resourceTagsProp)) {
557+
obj["resourceTags"] = resourceTagsProp
558+
}
543559
labelsProp, err := expandBigQueryDatasetEffectiveLabels(d.Get("effective_labels"), d, config)
544560
if err != nil {
545561
return err
@@ -704,6 +720,9 @@ func resourceBigQueryDatasetRead(d *schema.ResourceData, meta interface{}) error
704720
if err := d.Set("storage_billing_model", flattenBigQueryDatasetStorageBillingModel(res["storageBillingModel"], d, config)); err != nil {
705721
return fmt.Errorf("Error reading Dataset: %s", err)
706722
}
723+
if err := d.Set("resource_tags", flattenBigQueryDatasetResourceTags(res["resourceTags"], d, config)); err != nil {
724+
return fmt.Errorf("Error reading Dataset: %s", err)
725+
}
707726
if err := d.Set("terraform_labels", flattenBigQueryDatasetTerraformLabels(res["labels"], d, config)); err != nil {
708727
return fmt.Errorf("Error reading Dataset: %s", err)
709728
}
@@ -811,6 +830,12 @@ func resourceBigQueryDatasetUpdate(d *schema.ResourceData, meta interface{}) err
811830
} else if v, ok := d.GetOkExists("storage_billing_model"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, storageBillingModelProp)) {
812831
obj["storageBillingModel"] = storageBillingModelProp
813832
}
833+
resourceTagsProp, err := expandBigQueryDatasetResourceTags(d.Get("resource_tags"), d, config)
834+
if err != nil {
835+
return err
836+
} else if v, ok := d.GetOkExists("resource_tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, resourceTagsProp)) {
837+
obj["resourceTags"] = resourceTagsProp
838+
}
814839
labelsProp, err := expandBigQueryDatasetEffectiveLabels(d.Get("effective_labels"), d, config)
815840
if err != nil {
816841
return err
@@ -1252,6 +1277,10 @@ func flattenBigQueryDatasetStorageBillingModel(v interface{}, d *schema.Resource
12521277
return v
12531278
}
12541279

1280+
func flattenBigQueryDatasetResourceTags(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1281+
return v
1282+
}
1283+
12551284
func flattenBigQueryDatasetTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
12561285
if v == nil {
12571286
return v
@@ -1637,6 +1666,17 @@ func expandBigQueryDatasetStorageBillingModel(v interface{}, d tpgresource.Terra
16371666
return v, nil
16381667
}
16391668

1669+
func expandBigQueryDatasetResourceTags(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
1670+
if v == nil {
1671+
return map[string]string{}, nil
1672+
}
1673+
m := make(map[string]string)
1674+
for k, val := range v.(map[string]interface{}) {
1675+
m[k] = val.(string)
1676+
}
1677+
return m, nil
1678+
}
1679+
16401680
func expandBigQueryDatasetEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
16411681
if v == nil {
16421682
return map[string]string{}, nil

google/services/bigquery/resource_bigquery_dataset_generated_test.go

+64
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,70 @@ resource "google_bigquery_dataset" "dataset" {
451451
`, context)
452452
}
453453

454+
func TestAccBigQueryDataset_bigqueryDatasetResourceTagsExample(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.ProtoV5ProviderFactories(t),
464+
CheckDestroy: testAccCheckBigQueryDatasetDestroyProducer(t),
465+
Steps: []resource.TestStep{
466+
{
467+
Config: testAccBigQueryDataset_bigqueryDatasetResourceTagsExample(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_bigqueryDatasetResourceTagsExample(context map[string]interface{}) string {
480+
return acctest.Nprintf(`
481+
data "google_project" "project" {
482+
}
483+
484+
resource "google_tags_tag_key" "tag_key1" {
485+
parent = "projects/${data.google_project.project.number}"
486+
short_name = "tf_test_tag_key1%{random_suffix}"
487+
}
488+
489+
resource "google_tags_tag_value" "tag_value1" {
490+
parent = "tagKeys/${google_tags_tag_key.tag_key1.name}"
491+
short_name = "tf_test_tag_value1%{random_suffix}"
492+
}
493+
494+
resource "google_tags_tag_key" "tag_key2" {
495+
parent = "projects/${data.google_project.project.number}"
496+
short_name = "tf_test_tag_key2%{random_suffix}"
497+
}
498+
499+
resource "google_tags_tag_value" "tag_value2" {
500+
parent = "tagKeys/${google_tags_tag_key.tag_key2.name}"
501+
short_name = "tf_test_tag_value2%{random_suffix}"
502+
}
503+
504+
resource "google_bigquery_dataset" "dataset" {
505+
dataset_id = "dataset%{random_suffix}"
506+
friendly_name = "test"
507+
description = "This is a test description"
508+
location = "EU"
509+
510+
resource_tags = {
511+
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key1.short_name}" = "${google_tags_tag_value.tag_value1.short_name}"
512+
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key2.short_name}" = "${google_tags_tag_value.tag_value2.short_name}"
513+
}
514+
}
515+
`, context)
516+
}
517+
454518
func testAccCheckBigQueryDatasetDestroyProducer(t *testing.T) func(s *terraform.State) error {
455519
return func(s *terraform.State) error {
456520
for name, rs := range s.RootModule().Resources {

google/services/bigquery/resource_bigquery_dataset_test.go

+110
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,40 @@ func TestAccBigQueryDataset_invalidLongID(t *testing.T) {
422422
})
423423
}
424424

425+
func TestAccBigQueryDataset_bigqueryDatasetResourceTags_update(t *testing.T) {
426+
t.Parallel()
427+
428+
context := map[string]interface{}{
429+
"random_suffix": acctest.RandString(t, 10),
430+
}
431+
432+
acctest.VcrTest(t, resource.TestCase{
433+
PreCheck: func() { acctest.AccTestPreCheck(t) },
434+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
435+
CheckDestroy: testAccCheckBigQueryDatasetDestroyProducer(t),
436+
Steps: []resource.TestStep{
437+
{
438+
Config: testAccBigQueryDataset_bigqueryDatasetResourceTags_basic(context),
439+
},
440+
{
441+
ResourceName: "google_bigquery_dataset.dataset",
442+
ImportState: true,
443+
ImportStateVerify: true,
444+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
445+
},
446+
{
447+
Config: testAccBigQueryDataset_bigqueryDatasetResourceTags_update(context),
448+
},
449+
{
450+
ResourceName: "google_bigquery_dataset.dataset",
451+
ImportState: true,
452+
ImportStateVerify: true,
453+
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
454+
},
455+
},
456+
})
457+
}
458+
425459
func testAccAddTable(t *testing.T, datasetID string, tableID string) resource.TestCheckFunc {
426460
// Not actually a check, but adds a table independently of terraform
427461
return func(s *terraform.State) error {
@@ -739,3 +773,79 @@ resource "google_bigquery_dataset" "test" {
739773
}
740774
`, datasetID)
741775
}
776+
777+
func testAccBigQueryDataset_bigqueryDatasetResourceTags_basic(context map[string]interface{}) string {
778+
return acctest.Nprintf(`
779+
data "google_project" "project" {
780+
}
781+
782+
resource "google_tags_tag_key" "tag_key1" {
783+
parent = "projects/${data.google_project.project.number}"
784+
short_name = "tf_test_tag_key1%{random_suffix}"
785+
}
786+
787+
resource "google_tags_tag_value" "tag_value1" {
788+
parent = "tagKeys/${google_tags_tag_key.tag_key1.name}"
789+
short_name = "tf_test_tag_value1%{random_suffix}"
790+
}
791+
792+
resource "google_tags_tag_key" "tag_key2" {
793+
parent = "projects/${data.google_project.project.number}"
794+
short_name = "tf_test_tag_key2%{random_suffix}"
795+
}
796+
797+
resource "google_tags_tag_value" "tag_value2" {
798+
parent = "tagKeys/${google_tags_tag_key.tag_key2.name}"
799+
short_name = "tf_test_tag_value2%{random_suffix}"
800+
}
801+
802+
resource "google_bigquery_dataset" "dataset" {
803+
dataset_id = "dataset%{random_suffix}"
804+
friendly_name = "test"
805+
description = "This is a test description"
806+
location = "EU"
807+
808+
resource_tags = {
809+
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key1.short_name}" = "${google_tags_tag_value.tag_value1.short_name}"
810+
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key2.short_name}" = "${google_tags_tag_value.tag_value2.short_name}"
811+
}
812+
}
813+
`, context)
814+
}
815+
816+
func testAccBigQueryDataset_bigqueryDatasetResourceTags_update(context map[string]interface{}) string {
817+
return acctest.Nprintf(`
818+
data "google_project" "project" {
819+
}
820+
821+
resource "google_tags_tag_key" "tag_key1" {
822+
parent = "projects/${data.google_project.project.number}"
823+
short_name = "tf_test_tag_key1%{random_suffix}"
824+
}
825+
826+
resource "google_tags_tag_value" "tag_value1" {
827+
parent = "tagKeys/${google_tags_tag_key.tag_key1.name}"
828+
short_name = "tf_test_tag_value1%{random_suffix}"
829+
}
830+
831+
resource "google_tags_tag_key" "tag_key2" {
832+
parent = "projects/${data.google_project.project.number}"
833+
short_name = "tf_test_tag_key2%{random_suffix}"
834+
}
835+
836+
resource "google_tags_tag_value" "tag_value2" {
837+
parent = "tagKeys/${google_tags_tag_key.tag_key2.name}"
838+
short_name = "tf_test_tag_value2%{random_suffix}"
839+
}
840+
841+
resource "google_bigquery_dataset" "dataset" {
842+
dataset_id = "dataset%{random_suffix}"
843+
friendly_name = "test"
844+
description = "This is a test description"
845+
location = "EU"
846+
847+
resource_tags = {
848+
}
849+
}
850+
`, context)
851+
}

website/docs/r/bigquery_dataset.html.markdown

+1-1
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ The following arguments are supported:
339339
LOGICAL is the default if this flag isn't specified.
340340

341341
* `resource_tags` -
342-
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
342+
(Optional)
343343
The tags attached to this table. Tag keys are globally unique. Tag key is expected to be
344344
in the namespaced format, for example "123456789012/environment" where 123456789012 is the
345345
ID of the parent organization or project resource for this tag key. Tag value is expected

0 commit comments

Comments
 (0)