Skip to content

Commit ea6e2a1

Browse files
add dataGovernanceType field to bigquery_routine resource (#9859) (#7149)
[upstream:7d60a01a3e3903292922c83f948a9fe3ee38ff10] Signed-off-by: Modular Magician <[email protected]>
1 parent a58a56d commit ea6e2a1

File tree

4 files changed

+112
-0
lines changed

4 files changed

+112
-0
lines changed

.changelog/9859.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 `dataGovernanceType` to `google_bigquery_routine` resource
3+
```

google-beta/services/bigquery/resource_bigquery_routine.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ the schema as returned by the API.`,
124124
},
125125
},
126126
},
127+
"data_governance_type": {
128+
Type: schema.TypeString,
129+
Optional: true,
130+
ValidateFunc: verify.ValidateEnum([]string{"DATA_MASKING", ""}),
131+
Description: `If set to DATA_MASKING, the function is validated and made available as a masking function. For more information, see https://cloud.google.com/bigquery/docs/user-defined-functions#custom-mask Possible values: ["DATA_MASKING"]`,
132+
},
127133
"description": {
128134
Type: schema.TypeString,
129135
Optional: true,
@@ -392,6 +398,12 @@ func resourceBigQueryRoutineCreate(d *schema.ResourceData, meta interface{}) err
392398
} else if v, ok := d.GetOkExists("determinism_level"); !tpgresource.IsEmptyValue(reflect.ValueOf(determinismLevelProp)) && (ok || !reflect.DeepEqual(v, determinismLevelProp)) {
393399
obj["determinismLevel"] = determinismLevelProp
394400
}
401+
dataGovernanceTypeProp, err := expandBigQueryRoutineDataGovernanceType(d.Get("data_governance_type"), d, config)
402+
if err != nil {
403+
return err
404+
} else if v, ok := d.GetOkExists("data_governance_type"); !tpgresource.IsEmptyValue(reflect.ValueOf(dataGovernanceTypeProp)) && (ok || !reflect.DeepEqual(v, dataGovernanceTypeProp)) {
405+
obj["dataGovernanceType"] = dataGovernanceTypeProp
406+
}
395407
sparkOptionsProp, err := expandBigQueryRoutineSparkOptions(d.Get("spark_options"), d, config)
396408
if err != nil {
397409
return err
@@ -537,6 +549,9 @@ func resourceBigQueryRoutineRead(d *schema.ResourceData, meta interface{}) error
537549
if err := d.Set("determinism_level", flattenBigQueryRoutineDeterminismLevel(res["determinismLevel"], d, config)); err != nil {
538550
return fmt.Errorf("Error reading Routine: %s", err)
539551
}
552+
if err := d.Set("data_governance_type", flattenBigQueryRoutineDataGovernanceType(res["dataGovernanceType"], d, config)); err != nil {
553+
return fmt.Errorf("Error reading Routine: %s", err)
554+
}
540555
if err := d.Set("spark_options", flattenBigQueryRoutineSparkOptions(res["sparkOptions"], d, config)); err != nil {
541556
return fmt.Errorf("Error reading Routine: %s", err)
542557
}
@@ -623,6 +638,12 @@ func resourceBigQueryRoutineUpdate(d *schema.ResourceData, meta interface{}) err
623638
} else if v, ok := d.GetOkExists("determinism_level"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, determinismLevelProp)) {
624639
obj["determinismLevel"] = determinismLevelProp
625640
}
641+
dataGovernanceTypeProp, err := expandBigQueryRoutineDataGovernanceType(d.Get("data_governance_type"), d, config)
642+
if err != nil {
643+
return err
644+
} else if v, ok := d.GetOkExists("data_governance_type"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, dataGovernanceTypeProp)) {
645+
obj["dataGovernanceType"] = dataGovernanceTypeProp
646+
}
626647
sparkOptionsProp, err := expandBigQueryRoutineSparkOptions(d.Get("spark_options"), d, config)
627648
if err != nil {
628649
return err
@@ -882,6 +903,10 @@ func flattenBigQueryRoutineDeterminismLevel(v interface{}, d *schema.ResourceDat
882903
return v
883904
}
884905

906+
func flattenBigQueryRoutineDataGovernanceType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
907+
return v
908+
}
909+
885910
func flattenBigQueryRoutineSparkOptions(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
886911
if v == nil {
887912
return nil
@@ -1114,6 +1139,10 @@ func expandBigQueryRoutineDeterminismLevel(v interface{}, d tpgresource.Terrafor
11141139
return v, nil
11151140
}
11161141

1142+
func expandBigQueryRoutineDataGovernanceType(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1143+
return v, nil
1144+
}
1145+
11171146
func expandBigQueryRoutineSparkOptions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
11181147
l := v.([]interface{})
11191148
if len(l) == 0 || l[0] == nil {

google-beta/services/bigquery/resource_bigquery_routine_generated_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,53 @@ resource "google_bigquery_routine" "spark_jar" {
351351
`, context)
352352
}
353353

354+
func TestAccBigQueryRoutine_bigqueryRoutineDataGovernanceTypeExample(t *testing.T) {
355+
t.Parallel()
356+
357+
context := map[string]interface{}{
358+
"random_suffix": acctest.RandString(t, 10),
359+
}
360+
361+
acctest.VcrTest(t, resource.TestCase{
362+
PreCheck: func() { acctest.AccTestPreCheck(t) },
363+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
364+
CheckDestroy: testAccCheckBigQueryRoutineDestroyProducer(t),
365+
Steps: []resource.TestStep{
366+
{
367+
Config: testAccBigQueryRoutine_bigqueryRoutineDataGovernanceTypeExample(context),
368+
},
369+
{
370+
ResourceName: "google_bigquery_routine.custom_masking_routine",
371+
ImportState: true,
372+
ImportStateVerify: true,
373+
},
374+
},
375+
})
376+
}
377+
378+
func testAccBigQueryRoutine_bigqueryRoutineDataGovernanceTypeExample(context map[string]interface{}) string {
379+
return acctest.Nprintf(`
380+
resource "google_bigquery_dataset" "test" {
381+
dataset_id = "tf_test_dataset_id%{random_suffix}"
382+
}
383+
384+
resource "google_bigquery_routine" "custom_masking_routine" {
385+
dataset_id = google_bigquery_dataset.test.dataset_id
386+
routine_id = "custom_masking_routine"
387+
routine_type = "SCALAR_FUNCTION"
388+
language = "SQL"
389+
data_governance_type = "DATA_MASKING"
390+
definition_body = "SAFE.REGEXP_REPLACE(ssn, '[0-9]', 'X')"
391+
arguments {
392+
name = "ssn"
393+
data_type = "{\"typeKind\" : \"STRING\"}"
394+
}
395+
return_type = "{\"typeKind\" : \"STRING\"}"
396+
}
397+
398+
`, context)
399+
}
400+
354401
func testAccCheckBigQueryRoutineDestroyProducer(t *testing.T) func(s *terraform.State) error {
355402
return func(s *terraform.State) error {
356403
for name, rs := range s.RootModule().Resources {

website/docs/r/bigquery_routine.html.markdown

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,34 @@ resource "google_bigquery_routine" "spark_jar" {
234234
}
235235
}
236236
}
237+
```
238+
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
239+
<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_routine_data_governance_type&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
240+
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
241+
</a>
242+
</div>
243+
## Example Usage - Bigquery Routine Data Governance Type
244+
245+
246+
```hcl
247+
resource "google_bigquery_dataset" "test" {
248+
dataset_id = "tf_test_dataset_id%{random_suffix}"
249+
}
250+
251+
resource "google_bigquery_routine" "custom_masking_routine" {
252+
dataset_id = google_bigquery_dataset.test.dataset_id
253+
routine_id = "custom_masking_routine"
254+
routine_type = "SCALAR_FUNCTION"
255+
language = "SQL"
256+
data_governance_type = "DATA_MASKING"
257+
definition_body = "SAFE.REGEXP_REPLACE(ssn, '[0-9]', 'X')"
258+
arguments {
259+
name = "ssn"
260+
data_type = "{\"typeKind\" : \"STRING\"}"
261+
}
262+
return_type = "{\"typeKind\" : \"STRING\"}"
263+
}
264+
237265
```
238266
## Example Usage - Bigquery Routine Remote Function
239267

@@ -338,6 +366,11 @@ The following arguments are supported:
338366
The determinism level of the JavaScript UDF if defined.
339367
Possible values are: `DETERMINISM_LEVEL_UNSPECIFIED`, `DETERMINISTIC`, `NOT_DETERMINISTIC`.
340368

369+
* `data_governance_type` -
370+
(Optional)
371+
If set to DATA_MASKING, the function is validated and made available as a masking function. For more information, see https://cloud.google.com/bigquery/docs/user-defined-functions#custom-mask
372+
Possible values are: `DATA_MASKING`.
373+
341374
* `spark_options` -
342375
(Optional)
343376
Optional. If language is one of "PYTHON", "JAVA", "SCALA", this field stores the options for spark stored procedure.

0 commit comments

Comments
 (0)