Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BigQuery Authorized datasets #4047

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/5700.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
bigquery: added support for authorized datasets to `google_bigquery_dataset.access` and `google_bigquery_dataset_access`
```
4 changes: 4 additions & 0 deletions google-beta/iam_bigquery_dataset.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@ func accessToIamMember(access map[string]interface{}) (string, error) {
// view does not map to an IAM member, use access instead
return "", fmt.Errorf("Failed to convert BigQuery Dataset access to IAM member. To use views with a dataset, please use dataset_access")
}
if _, ok := access["dataset"]; ok {
// dataset does not map to an IAM member, use access instead
return "", fmt.Errorf("Failed to convert BigQuery Dataset access to IAM member. To use views with a dataset, please use dataset_access")
}
if member, ok := access["userByEmail"]; ok {
// service accounts have "gservice" in their email. This is best guess due to lost information
if strings.Contains(member.(string), "gserviceaccount") {
Expand Down
153 changes: 153 additions & 0 deletions google-beta/resource_bigquery_dataset.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,45 @@ milliseconds since the epoch.`,
func bigqueryDatasetAccessSchema() *schema.Resource {
return &schema.Resource{
Schema: map[string]*schema.Schema{
"dataset": {
Type: schema.TypeList,
Optional: true,
Description: `Grants all resources of particular types in a particular dataset read access to the current dataset.`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"dataset": {
Type: schema.TypeList,
Required: true,
Description: `The dataset this entry applies to`,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"dataset_id": {
Type: schema.TypeString,
Required: true,
Description: `The ID of the dataset containing this table.`,
},
"project_id": {
Type: schema.TypeString,
Required: true,
Description: `The ID of the project containing this table.`,
},
},
},
},
"target_types": {
Type: schema.TypeList,
Required: true,
Description: `Which resources in the dataset this entry applies to. Currently, only views are supported,
but additional target types may be added in the future. Possible values: VIEWS`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
},
},
"domain": {
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -666,6 +705,7 @@ func flattenBigQueryDatasetAccess(v interface{}, d *schema.ResourceData, config
"special_group": flattenBigQueryDatasetAccessSpecialGroup(original["specialGroup"], d, config),
"user_by_email": flattenBigQueryDatasetAccessUserByEmail(original["userByEmail"], d, config),
"view": flattenBigQueryDatasetAccessView(original["view"], d, config),
"dataset": flattenBigQueryDatasetAccessDataset(original["dataset"], d, config),
})
}
return transformed
Expand Down Expand Up @@ -719,6 +759,48 @@ func flattenBigQueryDatasetAccessViewTableId(v interface{}, d *schema.ResourceDa
return v
}

func flattenBigQueryDatasetAccessDataset(v interface{}, d *schema.ResourceData, config *Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["dataset"] =
flattenBigQueryDatasetAccessDatasetDataset(original["dataset"], d, config)
transformed["target_types"] =
flattenBigQueryDatasetAccessDatasetTargetTypes(original["targetTypes"], d, config)
return []interface{}{transformed}
}
func flattenBigQueryDatasetAccessDatasetDataset(v interface{}, d *schema.ResourceData, config *Config) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["dataset_id"] =
flattenBigQueryDatasetAccessDatasetDatasetDatasetId(original["datasetId"], d, config)
transformed["project_id"] =
flattenBigQueryDatasetAccessDatasetDatasetProjectId(original["projectId"], d, config)
return []interface{}{transformed}
}
func flattenBigQueryDatasetAccessDatasetDatasetDatasetId(v interface{}, d *schema.ResourceData, config *Config) interface{} {
return v
}

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

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

func flattenBigQueryDatasetCreationTime(v interface{}, d *schema.ResourceData, config *Config) interface{} {
// Handles the string fixed64 format
if strVal, ok := v.(string); ok {
Expand Down Expand Up @@ -900,6 +982,13 @@ func expandBigQueryDatasetAccess(v interface{}, d TerraformResourceData, config
transformed["view"] = transformedView
}

transformedDataset, err := expandBigQueryDatasetAccessDataset(original["dataset"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedDataset); val.IsValid() && !isEmptyValue(val) {
transformed["dataset"] = transformedDataset
}

req = append(req, transformed)
}
return req, nil
Expand Down Expand Up @@ -970,6 +1059,70 @@ func expandBigQueryDatasetAccessViewTableId(v interface{}, d TerraformResourceDa
return v, nil
}

func expandBigQueryDatasetAccessDataset(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})

transformedDataset, err := expandBigQueryDatasetAccessDatasetDataset(original["dataset"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedDataset); val.IsValid() && !isEmptyValue(val) {
transformed["dataset"] = transformedDataset
}

transformedTargetTypes, err := expandBigQueryDatasetAccessDatasetTargetTypes(original["target_types"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedTargetTypes); val.IsValid() && !isEmptyValue(val) {
transformed["targetTypes"] = transformedTargetTypes
}

return transformed, nil
}

func expandBigQueryDatasetAccessDatasetDataset(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
return nil, nil
}
raw := l[0]
original := raw.(map[string]interface{})
transformed := make(map[string]interface{})

transformedDatasetId, err := expandBigQueryDatasetAccessDatasetDatasetDatasetId(original["dataset_id"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedDatasetId); val.IsValid() && !isEmptyValue(val) {
transformed["datasetId"] = transformedDatasetId
}

transformedProjectId, err := expandBigQueryDatasetAccessDatasetDatasetProjectId(original["project_id"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedProjectId); val.IsValid() && !isEmptyValue(val) {
transformed["projectId"] = transformedProjectId
}

return transformed, nil
}

func expandBigQueryDatasetAccessDatasetDatasetDatasetId(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandBigQueryDatasetAccessDatasetDatasetProjectId(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandBigQueryDatasetAccessDatasetTargetTypes(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandBigQueryDatasetDatasetReference(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
transformed := make(map[string]interface{})
transformedDatasetId, err := expandBigQueryDatasetDatasetReferenceDatasetId(d.Get("dataset_id"), d, config)
Expand Down
Loading