Skip to content

Commit

Permalink
Add resource tags to BigQuery Dataset in the Beta provider (#10971)
Browse files Browse the repository at this point in the history
[upstream:bc527bd05d95340af8f53282d470651186279c97]

Signed-off-by: Modular Magician <[email protected]>
  • Loading branch information
modular-magician committed Jun 17, 2024
1 parent 3170282 commit f361971
Show file tree
Hide file tree
Showing 5 changed files with 248 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/10971.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
bigquery: added `resource_tags` field to `google_bigquery_dataset` resource (beta)
```
40 changes: 40 additions & 0 deletions google-beta/services/bigquery/resource_bigquery_dataset.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,16 @@ Changing this forces a new resource to be created.`,
Optional: true,
Description: `Defines the time travel window in hours. The value can be from 48 to 168 hours (2 to 7 days).`,
},
"resource_tags": {
Type: schema.TypeMap,
Optional: true,
Description: `The tags attached to this table. Tag keys are globally unique. Tag key is expected to be
in the namespaced format, for example "123456789012/environment" where 123456789012 is the
ID of the parent organization or project resource for this tag key. Tag value is expected
to be the short name, for example "Production". See [Tag definitions](/iam/docs/tags-access-control#definitions)
for more details.`,
Elem: &schema.Schema{Type: schema.TypeString},
},
"storage_billing_model": {
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -556,6 +566,12 @@ func resourceBigQueryDatasetCreate(d *schema.ResourceData, meta interface{}) err
} else if v, ok := d.GetOkExists("storage_billing_model"); !tpgresource.IsEmptyValue(reflect.ValueOf(storageBillingModelProp)) && (ok || !reflect.DeepEqual(v, storageBillingModelProp)) {
obj["storageBillingModel"] = storageBillingModelProp
}
resourceTagsProp, err := expandBigQueryDatasetResourceTags(d.Get("resource_tags"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("resource_tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(resourceTagsProp)) && (ok || !reflect.DeepEqual(v, resourceTagsProp)) {
obj["resourceTags"] = resourceTagsProp
}
labelsProp, err := expandBigQueryDatasetEffectiveLabels(d.Get("effective_labels"), d, config)
if err != nil {
return err
Expand Down Expand Up @@ -720,6 +736,9 @@ func resourceBigQueryDatasetRead(d *schema.ResourceData, meta interface{}) error
if err := d.Set("storage_billing_model", flattenBigQueryDatasetStorageBillingModel(res["storageBillingModel"], d, config)); err != nil {
return fmt.Errorf("Error reading Dataset: %s", err)
}
if err := d.Set("resource_tags", flattenBigQueryDatasetResourceTags(res["resourceTags"], d, config)); err != nil {
return fmt.Errorf("Error reading Dataset: %s", err)
}
if err := d.Set("terraform_labels", flattenBigQueryDatasetTerraformLabels(res["labels"], d, config)); err != nil {
return fmt.Errorf("Error reading Dataset: %s", err)
}
Expand Down Expand Up @@ -827,6 +846,12 @@ func resourceBigQueryDatasetUpdate(d *schema.ResourceData, meta interface{}) err
} else if v, ok := d.GetOkExists("storage_billing_model"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, storageBillingModelProp)) {
obj["storageBillingModel"] = storageBillingModelProp
}
resourceTagsProp, err := expandBigQueryDatasetResourceTags(d.Get("resource_tags"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("resource_tags"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, resourceTagsProp)) {
obj["resourceTags"] = resourceTagsProp
}
labelsProp, err := expandBigQueryDatasetEffectiveLabels(d.Get("effective_labels"), d, config)
if err != nil {
return err
Expand Down Expand Up @@ -1268,6 +1293,10 @@ func flattenBigQueryDatasetStorageBillingModel(v interface{}, d *schema.Resource
return v
}

func flattenBigQueryDatasetResourceTags(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}

func flattenBigQueryDatasetTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
if v == nil {
return v
Expand Down Expand Up @@ -1653,6 +1682,17 @@ func expandBigQueryDatasetStorageBillingModel(v interface{}, d tpgresource.Terra
return v, nil
}

func expandBigQueryDatasetResourceTags(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
if v == nil {
return map[string]string{}, nil
}
m := make(map[string]string)
for k, val := range v.(map[string]interface{}) {
m[k] = val.(string)
}
return m, nil
}

func expandBigQueryDatasetEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
if v == nil {
return map[string]string{}, nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,77 @@ resource "google_bigquery_dataset" "dataset" {
`, context)
}

func TestAccBigQueryDataset_bigqueryDatasetResourceTagsExample(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.ProtoV5ProviderBetaFactories(t),
CheckDestroy: testAccCheckBigQueryDatasetDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccBigQueryDataset_bigqueryDatasetResourceTagsExample(context),
},
{
ResourceName: "google_bigquery_dataset.dataset",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
},
})
}

func testAccBigQueryDataset_bigqueryDatasetResourceTagsExample(context map[string]interface{}) string {
return acctest.Nprintf(`
data "google_project" "project" {
provider = "google-beta"
}
resource "google_tags_tag_key" "tag_key1" {
provider = "google-beta"
parent = "projects/${data.google_project.project.number}"
short_name = "tf_test_tag_key1%{random_suffix}"
}
resource "google_tags_tag_value" "tag_value1" {
provider = "google-beta"
parent = "tagKeys/${google_tags_tag_key.tag_key1.name}"
short_name = "tf_test_tag_value1%{random_suffix}"
}
resource "google_tags_tag_key" "tag_key2" {
provider = "google-beta"
parent = "projects/${data.google_project.project.number}"
short_name = "tf_test_tag_key2%{random_suffix}"
}
resource "google_tags_tag_value" "tag_value2" {
provider = "google-beta"
parent = "tagKeys/${google_tags_tag_key.tag_key2.name}"
short_name = "tf_test_tag_value2%{random_suffix}"
}
resource "google_bigquery_dataset" "dataset" {
provider = google-beta
dataset_id = "dataset%{random_suffix}"
friendly_name = "test"
description = "This is a test description"
location = "EU"
resource_tags = {
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key1.short_name}" = "${google_tags_tag_value.tag_value1.short_name}"
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key2.short_name}" = "${google_tags_tag_value.tag_value2.short_name}"
}
}
`, context)
}

func testAccCheckBigQueryDatasetDestroyProducer(t *testing.T) func(s *terraform.State) error {
return func(s *terraform.State) error {
for name, rs := range s.RootModule().Resources {
Expand Down
126 changes: 126 additions & 0 deletions google-beta/services/bigquery/resource_bigquery_dataset_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package bigquery_test

import (
Expand Down Expand Up @@ -420,6 +422,40 @@ func TestAccBigQueryDataset_invalidLongID(t *testing.T) {
})
}

func TestAccBigQueryDataset_bigqueryDatasetResourceTags_update(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.ProtoV5ProviderBetaFactories(t),
CheckDestroy: testAccCheckBigQueryDatasetDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccBigQueryDataset_bigqueryDatasetResourceTags_basic(context),
},
{
ResourceName: "google_bigquery_dataset.dataset",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
{
Config: testAccBigQueryDataset_bigqueryDatasetResourceTags_update(context),
},
{
ResourceName: "google_bigquery_dataset.dataset",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
},
})
}

func testAccAddTable(t *testing.T, datasetID string, tableID string) resource.TestCheckFunc {
// Not actually a check, but adds a table independently of terraform
return func(s *terraform.State) error {
Expand Down Expand Up @@ -737,3 +773,93 @@ resource "google_bigquery_dataset" "test" {
}
`, datasetID)
}

func testAccBigQueryDataset_bigqueryDatasetResourceTags_basic(context map[string]interface{}) string {
return acctest.Nprintf(`
data "google_project" "project" {
provider = "google-beta"
}
resource "google_tags_tag_key" "tag_key1" {
provider = google-beta
parent = "projects/${data.google_project.project.number}"
short_name = "tf_test_tag_key1%{random_suffix}"
}
resource "google_tags_tag_value" "tag_value1" {
provider = google-beta
parent = "tagKeys/${google_tags_tag_key.tag_key1.name}"
short_name = "tf_test_tag_value1%{random_suffix}"
}
resource "google_tags_tag_key" "tag_key2" {
provider = google-beta
parent = "projects/${data.google_project.project.number}"
short_name = "tf_test_tag_key2%{random_suffix}"
}
resource "google_tags_tag_value" "tag_value2" {
provider = google-beta
parent = "tagKeys/${google_tags_tag_key.tag_key2.name}"
short_name = "tf_test_tag_value2%{random_suffix}"
}
resource "google_bigquery_dataset" "dataset" {
provider = google-beta
dataset_id = "dataset%{random_suffix}"
friendly_name = "test"
description = "This is a test description"
location = "EU"
resource_tags = {
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key1.short_name}" = "${google_tags_tag_value.tag_value1.short_name}"
"${data.google_project.project.project_id}/${google_tags_tag_key.tag_key2.short_name}" = "${google_tags_tag_value.tag_value2.short_name}"
}
}
`, context)
}

func testAccBigQueryDataset_bigqueryDatasetResourceTags_update(context map[string]interface{}) string {
return acctest.Nprintf(`
data "google_project" "project" {
provider = "google-beta"
}
resource "google_tags_tag_key" "tag_key1" {
provider = google-beta
parent = "projects/${data.google_project.project.number}"
short_name = "tf_test_tag_key1%{random_suffix}"
}
resource "google_tags_tag_value" "tag_value1" {
provider = google-beta
parent = "tagKeys/${google_tags_tag_key.tag_key1.name}"
short_name = "tf_test_tag_value1%{random_suffix}"
}
resource "google_tags_tag_key" "tag_key2" {
provider = google-beta
parent = "projects/${data.google_project.project.number}"
short_name = "tf_test_tag_key2%{random_suffix}"
}
resource "google_tags_tag_value" "tag_value2" {
provider = google-beta
parent = "tagKeys/${google_tags_tag_key.tag_key2.name}"
short_name = "tf_test_tag_value2%{random_suffix}"
}
resource "google_bigquery_dataset" "dataset" {
provider = google-beta
dataset_id = "dataset%{random_suffix}"
friendly_name = "test"
description = "This is a test description"
location = "EU"
resource_tags = {
}
}
`, context)
}
8 changes: 8 additions & 0 deletions website/docs/r/bigquery_dataset.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,14 @@ The following arguments are supported:
or to PHYSICAL to use physical bytes instead.
LOGICAL is the default if this flag isn't specified.

* `resource_tags` -
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
The tags attached to this table. Tag keys are globally unique. Tag key is expected to be
in the namespaced format, for example "123456789012/environment" where 123456789012 is the
ID of the parent organization or project resource for this tag key. Tag value is expected
to be the short name, for example "Production". See [Tag definitions](/iam/docs/tags-access-control#definitions)
for more details.

* `project` - (Optional) The ID of the project in which the resource belongs.
If it is not provided, the provider project is used.

Expand Down

0 comments on commit f361971

Please sign in to comment.