Skip to content

Commit 6b83026

Browse files
Add credentials to bigquery connection. (#3546) (#2111)
Signed-off-by: Modular Magician <[email protected]>
1 parent 73748e0 commit 6b83026

File tree

5 files changed

+190
-0
lines changed

5 files changed

+190
-0
lines changed

.changelog/3546.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:breaking-change
2+
bigquery: Add ability to manage credentials to `google_bigquery_connection`. This field is required as the resource is not useful without them.
3+
```

google-beta/resource_bigquery_connection_connection.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,27 @@ func resourceBigqueryConnectionConnection() *schema.Resource {
5050
MaxItems: 1,
5151
Elem: &schema.Resource{
5252
Schema: map[string]*schema.Schema{
53+
"credential": {
54+
Type: schema.TypeList,
55+
Required: true,
56+
Description: `Cloud SQL properties.`,
57+
MaxItems: 1,
58+
Elem: &schema.Resource{
59+
Schema: map[string]*schema.Schema{
60+
"password": {
61+
Type: schema.TypeString,
62+
Required: true,
63+
Description: `Password for database.`,
64+
Sensitive: true,
65+
},
66+
"username": {
67+
Type: schema.TypeString,
68+
Required: true,
69+
Description: `Username for database.`,
70+
},
71+
},
72+
},
73+
},
5374
"database": {
5475
Type: schema.TypeString,
5576
Required: true,
@@ -343,6 +364,8 @@ func flattenBigqueryConnectionConnectionCloudSql(v interface{}, d *schema.Resour
343364
flattenBigqueryConnectionConnectionCloudSqlInstanceId(original["instanceId"], d, config)
344365
transformed["database"] =
345366
flattenBigqueryConnectionConnectionCloudSqlDatabase(original["database"], d, config)
367+
transformed["credential"] =
368+
flattenBigqueryConnectionConnectionCloudSqlCredential(original["credential"], d, config)
346369
transformed["type"] =
347370
flattenBigqueryConnectionConnectionCloudSqlType(original["type"], d, config)
348371
return []interface{}{transformed}
@@ -355,6 +378,15 @@ func flattenBigqueryConnectionConnectionCloudSqlDatabase(v interface{}, d *schem
355378
return v
356379
}
357380

381+
func flattenBigqueryConnectionConnectionCloudSqlCredential(v interface{}, d *schema.ResourceData, config *Config) interface{} {
382+
return []interface{}{
383+
map[string]interface{}{
384+
"username": d.Get("cloud_sql.0.credential.0.username"),
385+
"password": d.Get("cloud_sql.0.credential.0.password"),
386+
},
387+
}
388+
}
389+
358390
func flattenBigqueryConnectionConnectionCloudSqlType(v interface{}, d *schema.ResourceData, config *Config) interface{} {
359391
return v
360392
}
@@ -390,6 +422,13 @@ func expandBigqueryConnectionConnectionCloudSql(v interface{}, d TerraformResour
390422
transformed["database"] = transformedDatabase
391423
}
392424

425+
transformedCredential, err := expandBigqueryConnectionConnectionCloudSqlCredential(original["credential"], d, config)
426+
if err != nil {
427+
return nil, err
428+
} else if val := reflect.ValueOf(transformedCredential); val.IsValid() && !isEmptyValue(val) {
429+
transformed["credential"] = transformedCredential
430+
}
431+
393432
transformedType, err := expandBigqueryConnectionConnectionCloudSqlType(original["type"], d, config)
394433
if err != nil {
395434
return nil, err
@@ -408,6 +447,40 @@ func expandBigqueryConnectionConnectionCloudSqlDatabase(v interface{}, d Terrafo
408447
return v, nil
409448
}
410449

450+
func expandBigqueryConnectionConnectionCloudSqlCredential(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
451+
l := v.([]interface{})
452+
if len(l) == 0 || l[0] == nil {
453+
return nil, nil
454+
}
455+
raw := l[0]
456+
original := raw.(map[string]interface{})
457+
transformed := make(map[string]interface{})
458+
459+
transformedUsername, err := expandBigqueryConnectionConnectionCloudSqlCredentialUsername(original["username"], d, config)
460+
if err != nil {
461+
return nil, err
462+
} else if val := reflect.ValueOf(transformedUsername); val.IsValid() && !isEmptyValue(val) {
463+
transformed["username"] = transformedUsername
464+
}
465+
466+
transformedPassword, err := expandBigqueryConnectionConnectionCloudSqlCredentialPassword(original["password"], d, config)
467+
if err != nil {
468+
return nil, err
469+
} else if val := reflect.ValueOf(transformedPassword); val.IsValid() && !isEmptyValue(val) {
470+
transformed["password"] = transformedPassword
471+
}
472+
473+
return transformed, nil
474+
}
475+
476+
func expandBigqueryConnectionConnectionCloudSqlCredentialUsername(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
477+
return v, nil
478+
}
479+
480+
func expandBigqueryConnectionConnectionCloudSqlCredentialPassword(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
481+
return v, nil
482+
}
483+
411484
func expandBigqueryConnectionConnectionCloudSqlType(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
412485
return v, nil
413486
}

google-beta/resource_bigquery_connection_connection_generated_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ resource "google_sql_database" "db" {
6060
name = "db"
6161
}
6262
63+
resource "random_password" "pwd" {
64+
length = 16
65+
special = false
66+
}
67+
68+
resource "google_sql_user" "user" {
69+
provider = google-beta
70+
name = "user%{random_suffix}"
71+
instance = google_sql_database_instance.instance.name
72+
password = random_password.pwd.result
73+
}
74+
6375
resource "google_bigquery_connection" "connection" {
6476
provider = google-beta
6577
friendly_name = "👋"
@@ -68,6 +80,10 @@ resource "google_bigquery_connection" "connection" {
6880
instance_id = google_sql_database_instance.instance.connection_name
6981
database = google_sql_database.db.name
7082
type = "POSTGRES"
83+
credential {
84+
username = google_sql_user.user.name
85+
password = google_sql_user.user.password
86+
}
7187
}
7288
}
7389
`, context)
@@ -110,6 +126,18 @@ resource "google_sql_database" "db" {
110126
name = "db"
111127
}
112128
129+
resource "random_password" "pwd" {
130+
length = 16
131+
special = false
132+
}
133+
134+
resource "google_sql_user" "user" {
135+
provider = google-beta
136+
name = "user%{random_suffix}"
137+
instance = google_sql_database_instance.instance.name
138+
password = random_password.pwd.result
139+
}
140+
113141
resource "google_bigquery_connection" "connection" {
114142
provider = google-beta
115143
connection_id = "tf-test-my-connection%{random_suffix}"
@@ -120,6 +148,10 @@ resource "google_bigquery_connection" "connection" {
120148
instance_id = google_sql_database_instance.instance.connection_name
121149
database = google_sql_database.db.name
122150
type = "POSTGRES"
151+
credential {
152+
username = google_sql_user.user.name
153+
password = google_sql_user.user.password
154+
}
123155
}
124156
}
125157
`, context)

google-beta/resource_bigquery_connection_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,18 @@ resource "google_sql_database" "db" {
4646
name = "db"
4747
}
4848
49+
resource "random_password" "pwd" {
50+
length = 16
51+
special = false
52+
}
53+
54+
resource "google_sql_user" "user" {
55+
provider = google-beta
56+
name = "username"
57+
instance = google_sql_database_instance.instance.name
58+
password = random_password.pwd.result
59+
}
60+
4961
resource "google_bigquery_connection" "connection" {
5062
provider = google-beta
5163
connection_id = "tf-test-my-connection%{random_suffix}"
@@ -56,6 +68,10 @@ resource "google_bigquery_connection" "connection" {
5668
instance_id = google_sql_database_instance.instance.connection_name
5769
database = google_sql_database.db.name
5870
type = "POSTGRES"
71+
credential {
72+
username = google_sql_user.user.name
73+
password = google_sql_user.user.password
74+
}
5975
}
6076
}
6177
`, context)
@@ -79,6 +95,18 @@ resource "google_sql_database" "db" {
7995
name = "db2"
8096
}
8197
98+
resource "random_password" "pwd" {
99+
length = 16
100+
special = false
101+
}
102+
103+
resource "google_sql_user" "user" {
104+
provider = google-beta
105+
name = "username"
106+
instance = google_sql_database_instance.instance.name
107+
password = random_password.pwd.result
108+
}
109+
82110
resource "google_bigquery_connection" "connection" {
83111
provider = google-beta
84112
connection_id = "tf-test-my-connection%{random_suffix}"
@@ -89,6 +117,10 @@ resource "google_bigquery_connection" "connection" {
89117
instance_id = google_sql_database_instance.instance.connection_name
90118
database = google_sql_database.db.name
91119
type = "MYSQL"
120+
credential {
121+
username = google_sql_user.user.name
122+
password = google_sql_user.user.password
123+
}
92124
}
93125
}
94126
`, context)

website/docs/r/bigquery_connection.html.markdown

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ To get more information about Connection, see:
3333
* How-to Guides
3434
* [Cloud SQL federated queries](https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries)
3535

36+
~> **Warning:** All arguments including `cloud_sql.credential.password` will be stored in the raw
37+
state as plain-text. [Read more about sensitive data in state](/docs/state/sensitive-data.html).
38+
3639
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
3740
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=bigquery_connection_basic&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
3841
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
@@ -58,6 +61,18 @@ resource "google_sql_database" "db" {
5861
name = "db"
5962
}
6063
64+
resource "random_password" "pwd" {
65+
length = 16
66+
special = false
67+
}
68+
69+
resource "google_sql_user" "user" {
70+
provider = google-beta
71+
name = "user"
72+
instance = google_sql_database_instance.instance.name
73+
password = random_password.pwd.result
74+
}
75+
6176
resource "google_bigquery_connection" "connection" {
6277
provider = google-beta
6378
friendly_name = "👋"
@@ -66,6 +81,10 @@ resource "google_bigquery_connection" "connection" {
6681
instance_id = google_sql_database_instance.instance.connection_name
6782
database = google_sql_database.db.name
6883
type = "POSTGRES"
84+
credential {
85+
username = google_sql_user.user.name
86+
password = google_sql_user.user.password
87+
}
6988
}
7089
}
7190
```
@@ -94,6 +113,18 @@ resource "google_sql_database" "db" {
94113
name = "db"
95114
}
96115
116+
resource "random_password" "pwd" {
117+
length = 16
118+
special = false
119+
}
120+
121+
resource "google_sql_user" "user" {
122+
provider = google-beta
123+
name = "user"
124+
instance = google_sql_database_instance.instance.name
125+
password = random_password.pwd.result
126+
}
127+
97128
resource "google_bigquery_connection" "connection" {
98129
provider = google-beta
99130
connection_id = "my-connection"
@@ -104,6 +135,10 @@ resource "google_bigquery_connection" "connection" {
104135
instance_id = google_sql_database_instance.instance.connection_name
105136
database = google_sql_database.db.name
106137
type = "POSTGRES"
138+
credential {
139+
username = google_sql_user.user.name
140+
password = google_sql_user.user.password
141+
}
107142
}
108143
}
109144
```
@@ -128,6 +163,10 @@ The `cloud_sql` block supports:
128163
(Required)
129164
Database name.
130165

166+
* `credential` -
167+
(Required)
168+
Cloud SQL properties. Structure is documented below.
169+
131170
* `type` -
132171
(Required)
133172
Type of the Cloud SQL database.
@@ -137,6 +176,17 @@ The `cloud_sql` block supports:
137176
* `POSTGRES`
138177
* `MYSQL`
139178

179+
180+
The `credential` block supports:
181+
182+
* `username` -
183+
(Required)
184+
Username for database.
185+
186+
* `password` -
187+
(Required)
188+
Password for database. **Note**: This property is sensitive and will not be displayed in the plan.
189+
140190
- - -
141191

142192

0 commit comments

Comments
 (0)