Skip to content

Commit 4ce2a20

Browse files
Feat: Add new files for datasources google_bigquery_tables (#11552)
[upstream:6231f4d544bcad3612ba6834c211f6e29c8f0cb4] Signed-off-by: Modular Magician <[email protected]>
1 parent c975919 commit 4ce2a20

File tree

5 files changed

+262
-0
lines changed

5 files changed

+262
-0
lines changed

.changelog/11552.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-datasource
2+
`google_bigquery_tables`
3+
```

google-beta/provider/provider_mmv1_resources.go

+1
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ var handwrittenDatasources = map[string]*schema.Resource{
170170
"google_beyondcorp_app_connector": beyondcorp.DataSourceGoogleBeyondcorpAppConnector(),
171171
"google_beyondcorp_app_gateway": beyondcorp.DataSourceGoogleBeyondcorpAppGateway(),
172172
"google_billing_account": billing.DataSourceGoogleBillingAccount(),
173+
"google_bigquery_tables": bigquery.DataSourceGoogleBigQueryTables(),
173174
"google_bigquery_dataset": bigquery.DataSourceGoogleBigqueryDataset(),
174175
"google_bigquery_default_service_account": bigquery.DataSourceGoogleBigqueryDefaultServiceAccount(),
175176
"google_certificate_manager_certificates": certificatemanager.DataSourceGoogleCertificateManagerCertificates(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package bigquery
4+
5+
import (
6+
"fmt"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
10+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
11+
)
12+
13+
func DataSourceGoogleBigQueryTables() *schema.Resource {
14+
15+
dsSchema := map[string]*schema.Schema{
16+
"dataset_id": {
17+
Type: schema.TypeString,
18+
Required: true,
19+
Description: "The ID of the dataset containing the tables.",
20+
},
21+
"project": {
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Description: "The ID of the project in which the dataset is located. If it is not provided, the provider project is used.",
25+
},
26+
"tables": {
27+
Type: schema.TypeList,
28+
Computed: true,
29+
Elem: &schema.Resource{
30+
Schema: map[string]*schema.Schema{
31+
"labels": {
32+
Type: schema.TypeMap,
33+
Computed: true,
34+
Elem: &schema.Schema{
35+
Type: schema.TypeString,
36+
},
37+
},
38+
"table_id": {
39+
Type: schema.TypeString,
40+
Computed: true,
41+
},
42+
},
43+
},
44+
},
45+
}
46+
47+
return &schema.Resource{
48+
Read: DataSourceGoogleBigQueryTablesRead,
49+
Schema: dsSchema,
50+
}
51+
}
52+
53+
func DataSourceGoogleBigQueryTablesRead(d *schema.ResourceData, meta interface{}) error {
54+
55+
config := meta.(*transport_tpg.Config)
56+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
57+
if err != nil {
58+
return err
59+
}
60+
61+
datasetID := d.Get("dataset_id").(string)
62+
63+
project, err := tpgresource.GetProject(d, config)
64+
65+
if err != nil {
66+
return fmt.Errorf("Error fetching project: %s", err)
67+
}
68+
69+
params := make(map[string]string)
70+
tables := make([]map[string]interface{}, 0)
71+
72+
for {
73+
74+
url, err := tpgresource.ReplaceVars(d, config, "{{BigQueryBasePath}}projects/{{project}}/datasets/{{dataset_id}}/tables")
75+
if err != nil {
76+
return err
77+
}
78+
79+
url, err = transport_tpg.AddQueryParams(url, params)
80+
if err != nil {
81+
return err
82+
}
83+
84+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
85+
Config: config,
86+
Method: "GET",
87+
RawURL: url,
88+
UserAgent: userAgent,
89+
})
90+
if err != nil {
91+
return fmt.Errorf("Error retrieving tables: %s", err)
92+
}
93+
94+
pageTables := flattenDataSourceGoogleBigQueryTablesList(res["tables"])
95+
tables = append(tables, pageTables...)
96+
97+
pToken, ok := res["nextPageToken"]
98+
if ok && pToken != nil && pToken.(string) != "" {
99+
params["pageToken"] = pToken.(string)
100+
} else {
101+
break
102+
}
103+
}
104+
105+
if err := d.Set("tables", tables); err != nil {
106+
return fmt.Errorf("Error retrieving tables: %s", err)
107+
}
108+
109+
id := fmt.Sprintf("projects/%s/datasets/%s/tables", project, datasetID)
110+
d.SetId(id)
111+
112+
return nil
113+
}
114+
115+
func flattenDataSourceGoogleBigQueryTablesList(res interface{}) []map[string]interface{} {
116+
117+
if res == nil {
118+
return make([]map[string]interface{}, 0)
119+
}
120+
121+
ls := res.([]interface{})
122+
123+
tables := make([]map[string]interface{}, 0, len(ls))
124+
125+
for _, raw := range ls {
126+
output := raw.(map[string]interface{})
127+
128+
var mLabels map[string]interface{}
129+
var mTableName string
130+
131+
if oLabels, ok := output["labels"].(map[string]interface{}); ok {
132+
mLabels = oLabels
133+
} else {
134+
mLabels = make(map[string]interface{}) // Initialize as an empty map if labels are missing
135+
}
136+
137+
if oTableReference, ok := output["tableReference"].(map[string]interface{}); ok {
138+
if tableID, ok := oTableReference["tableId"].(string); ok {
139+
mTableName = tableID
140+
}
141+
}
142+
tables = append(tables, map[string]interface{}{
143+
"labels": mLabels,
144+
"table_id": mTableName,
145+
})
146+
}
147+
148+
return tables
149+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package bigquery_test
4+
5+
import (
6+
"fmt"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
10+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
11+
)
12+
13+
func TestAccDataSourceGoogleBigqueryTables_basic(t *testing.T) {
14+
t.Parallel()
15+
16+
context := map[string]interface{}{
17+
"random_suffix": acctest.RandString(t, 10),
18+
}
19+
20+
acctest.VcrTest(t, resource.TestCase{
21+
PreCheck: func() { acctest.AccTestPreCheck(t) },
22+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
23+
CheckDestroy: testAccCheckBigQueryTableDestroyProducer(t),
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccDataSourceGoogleBigqueryTables_basic(context),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttr("data.google_bigquery_tables.example", "tables.#", "1"),
29+
resource.TestCheckResourceAttr("data.google_bigquery_tables.example", "tables.0.table_id", fmt.Sprintf("tf_test_table_%s", context["random_suffix"])),
30+
resource.TestCheckResourceAttr("data.google_bigquery_tables.example", "tables.0.labels.%", "1"),
31+
resource.TestCheckResourceAttr("data.google_bigquery_tables.example", "tables.0.labels.goog-terraform-provisioned", "true"),
32+
),
33+
},
34+
},
35+
})
36+
}
37+
38+
func testAccDataSourceGoogleBigqueryTables_basic(context map[string]interface{}) string {
39+
return acctest.Nprintf(`
40+
41+
resource "google_bigquery_dataset" "test" {
42+
dataset_id = "tf_test_ds_%{random_suffix}"
43+
friendly_name = "testing"
44+
description = "This is a test description"
45+
location = "US"
46+
default_table_expiration_ms = 3600000
47+
}
48+
49+
resource "google_bigquery_table" "test" {
50+
dataset_id = google_bigquery_dataset.test.dataset_id
51+
table_id = "tf_test_table_%{random_suffix}"
52+
deletion_protection = false
53+
schema = <<EOF
54+
[
55+
{
56+
"name": "name",
57+
"type": "STRING",
58+
"mode": "NULLABLE"
59+
}
60+
]
61+
EOF
62+
}
63+
64+
data "google_bigquery_tables" "example" {
65+
dataset_id = google_bigquery_table.test.dataset_id
66+
}
67+
`, context)
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
subcategory: "BigQuery"
3+
description: |-
4+
A datasource to retrieve a list of tables in a dataset.
5+
---
6+
7+
# `google_bigquery_tables`
8+
9+
Get a list of tables in a BigQuery dataset. For more information see
10+
the [official documentation](https://cloud.google.com/bigquery/docs)
11+
and [API](https://cloud.google.com/bigquery/docs/reference/rest/v2/tables).
12+
13+
## Example Usage
14+
15+
```hcl
16+
data "google_bigquery_tables" "tables" {
17+
dataset_id = "my-bq-dataset"
18+
project = "my-project"
19+
}
20+
```
21+
22+
## Argument Reference
23+
24+
The following arguments are supported:
25+
26+
* `dataset_id` - (Required) The dataset ID.
27+
28+
* `project` - (Optional) The ID of the project in which the resource belongs.
29+
If it is not provided, the provider project is used.
30+
31+
## Attributes Reference
32+
33+
The following attributes are exported:
34+
35+
* `tables` - A list of all retrieved BigQuery tables. Structure is [defined below](#nested_tables).
36+
37+
<a name="nested_tables"></a>The `tables` block supports:
38+
39+
* `labels` - User-provided table labels, in key/value pairs.
40+
* `table_id` - The name of the table.
41+

0 commit comments

Comments
 (0)