2020-05-02 08:33:48 -07:00
|
|
|
/**
|
2021-02-15 00:38:10 -08:00
|
|
|
* Copyright 2021 Google LLC
|
2020-05-02 08:33:48 -07:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
locals {
|
2020-11-21 00:45:56 -08:00
|
|
|
access_domain = { for k, v in var.access : k => v if v.type == "domain" }
|
|
|
|
access_group = { for k, v in var.access : k => v if v.type == "group" }
|
|
|
|
access_special = { for k, v in var.access : k => v if v.type == "special_group" }
|
|
|
|
access_user = { for k, v in var.access : k => v if v.type == "user" }
|
|
|
|
access_view = { for k, v in var.access : k => v if v.type == "view" }
|
|
|
|
identities_view = {
|
|
|
|
for k, v in local.access_view : k => try(
|
|
|
|
zipmap(
|
|
|
|
["project", "dataset", "table"],
|
|
|
|
split("|", var.access_identities[k])
|
|
|
|
),
|
|
|
|
{ project = null, dataset = null, table = null }
|
|
|
|
)
|
2020-05-02 08:33:48 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
resource "google_bigquery_dataset" "default" {
|
|
|
|
project = var.project_id
|
|
|
|
dataset_id = var.id
|
|
|
|
friendly_name = var.friendly_name
|
|
|
|
description = "Terraform managed."
|
|
|
|
labels = var.labels
|
|
|
|
location = var.location
|
|
|
|
|
|
|
|
delete_contents_on_destroy = var.options.delete_contents_on_destroy
|
|
|
|
default_table_expiration_ms = var.options.default_table_expiration_ms
|
|
|
|
default_partition_expiration_ms = var.options.default_partition_expiration_ms
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "access" {
|
2020-05-03 06:10:36 -07:00
|
|
|
for_each = var.dataset_access ? local.access_domain : {}
|
|
|
|
content {
|
|
|
|
role = access.value.role
|
|
|
|
domain = try(var.access_identities[access.key])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "access" {
|
2020-05-03 06:10:36 -07:00
|
|
|
for_each = var.dataset_access ? local.access_group : {}
|
|
|
|
content {
|
|
|
|
role = access.value.role
|
|
|
|
group_by_email = try(var.access_identities[access.key])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "access" {
|
2020-05-03 06:10:36 -07:00
|
|
|
for_each = var.dataset_access ? local.access_special : {}
|
2020-05-02 08:33:48 -07:00
|
|
|
content {
|
2020-05-03 06:10:36 -07:00
|
|
|
role = access.value.role
|
|
|
|
special_group = try(var.access_identities[access.key])
|
2020-05-02 08:33:48 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "access" {
|
2020-05-03 06:10:36 -07:00
|
|
|
for_each = var.dataset_access ? local.access_user : {}
|
|
|
|
content {
|
|
|
|
role = access.value.role
|
|
|
|
user_by_email = try(var.access_identities[access.key])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "access" {
|
2020-05-03 06:10:36 -07:00
|
|
|
for_each = var.dataset_access ? local.access_view : {}
|
2020-05-02 08:33:48 -07:00
|
|
|
content {
|
|
|
|
view {
|
2020-11-21 00:45:56 -08:00
|
|
|
project_id = local.identities_view[access.key].project
|
|
|
|
dataset_id = local.identities_view[access.key].dataset
|
|
|
|
table_id = local.identities_view[access.key].table
|
2020-05-02 08:33:48 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "default_encryption_configuration" {
|
2020-05-02 08:33:48 -07:00
|
|
|
for_each = var.encryption_key == null ? [] : [""]
|
|
|
|
content {
|
|
|
|
kms_key_name = var.encryption_key
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-03 06:10:36 -07:00
|
|
|
resource "google_bigquery_dataset_access" "domain" {
|
|
|
|
for_each = var.dataset_access ? {} : local.access_domain
|
2020-07-28 09:28:59 -07:00
|
|
|
provider = google-beta
|
2020-05-02 08:33:48 -07:00
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
role = each.value.role
|
2020-05-03 06:10:36 -07:00
|
|
|
domain = try(var.access_identities[each.key])
|
|
|
|
}
|
|
|
|
|
|
|
|
resource "google_bigquery_dataset_access" "group_by_email" {
|
|
|
|
for_each = var.dataset_access ? {} : local.access_group
|
2020-07-28 09:28:59 -07:00
|
|
|
provider = google-beta
|
2020-05-03 06:10:36 -07:00
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
role = each.value.role
|
|
|
|
group_by_email = try(var.access_identities[each.key])
|
|
|
|
}
|
|
|
|
|
|
|
|
resource "google_bigquery_dataset_access" "special_group" {
|
|
|
|
for_each = var.dataset_access ? {} : local.access_special
|
2020-07-28 09:28:59 -07:00
|
|
|
provider = google-beta
|
2020-05-03 06:10:36 -07:00
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
role = each.value.role
|
|
|
|
special_group = try(var.access_identities[each.key])
|
2020-05-02 08:33:48 -07:00
|
|
|
}
|
|
|
|
|
2020-05-03 06:10:36 -07:00
|
|
|
resource "google_bigquery_dataset_access" "user_by_email" {
|
|
|
|
for_each = var.dataset_access ? {} : local.access_user
|
2020-07-28 09:28:59 -07:00
|
|
|
provider = google-beta
|
2020-05-03 06:10:36 -07:00
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
role = each.value.role
|
|
|
|
user_by_email = try(var.access_identities[each.key])
|
|
|
|
}
|
2020-05-02 08:33:48 -07:00
|
|
|
|
|
|
|
resource "google_bigquery_dataset_access" "views" {
|
2020-05-03 06:10:36 -07:00
|
|
|
for_each = var.dataset_access ? {} : local.access_view
|
2020-07-28 09:28:59 -07:00
|
|
|
provider = google-beta
|
2020-05-02 08:33:48 -07:00
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
view {
|
2020-11-21 00:45:56 -08:00
|
|
|
project_id = local.identities_view[each.key].project
|
|
|
|
dataset_id = local.identities_view[each.key].dataset
|
|
|
|
table_id = local.identities_view[each.key].table
|
2020-05-02 08:33:48 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-21 00:45:56 -08:00
|
|
|
resource "google_bigquery_dataset_iam_binding" "bindings" {
|
|
|
|
for_each = var.iam
|
2021-03-30 08:02:20 -07:00
|
|
|
project = var.project_id
|
2020-11-21 00:45:56 -08:00
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
role = each.key
|
|
|
|
members = each.value
|
|
|
|
}
|
|
|
|
|
2020-05-02 08:33:48 -07:00
|
|
|
resource "google_bigquery_table" "default" {
|
2021-06-01 09:36:53 -07:00
|
|
|
provider = google-beta
|
|
|
|
for_each = var.tables
|
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
table_id = each.key
|
|
|
|
friendly_name = each.value.friendly_name
|
|
|
|
description = "Terraform managed."
|
|
|
|
clustering = try(each.value.options.clustering, null)
|
|
|
|
expiration_time = try(each.value.options.expiration_time, null)
|
|
|
|
labels = each.value.labels
|
|
|
|
schema = each.value.schema
|
|
|
|
deletion_protection = each.value.deletion_protection
|
2020-05-02 08:33:48 -07:00
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "encryption_configuration" {
|
2020-05-02 08:33:48 -07:00
|
|
|
for_each = try(each.value.options.encryption_key, null) != null ? [""] : []
|
|
|
|
content {
|
|
|
|
kms_key_name = each.value.options.encryption_key
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "range_partitioning" {
|
2020-05-02 08:33:48 -07:00
|
|
|
for_each = try(each.value.partitioning.range, null) != null ? [""] : []
|
|
|
|
content {
|
|
|
|
field = each.value.partitioning.field
|
|
|
|
range {
|
|
|
|
start = each.value.partitioning.range.start
|
|
|
|
end = each.value.partitioning.range.end
|
|
|
|
interval = each.value.partitioning.range.interval
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-30 08:02:20 -07:00
|
|
|
dynamic "time_partitioning" {
|
2020-05-02 08:33:48 -07:00
|
|
|
for_each = try(each.value.partitioning.time, null) != null ? [""] : []
|
|
|
|
content {
|
|
|
|
expiration_ms = each.value.partitioning.time.expiration_ms
|
|
|
|
field = each.value.partitioning.field
|
|
|
|
type = each.value.partitioning.time.type
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
resource "google_bigquery_table" "views" {
|
2021-06-01 09:36:53 -07:00
|
|
|
depends_on = [google_bigquery_table.default]
|
|
|
|
for_each = var.views
|
|
|
|
project = var.project_id
|
|
|
|
dataset_id = google_bigquery_dataset.default.dataset_id
|
|
|
|
table_id = each.key
|
|
|
|
friendly_name = each.value.friendly_name
|
|
|
|
description = "Terraform managed."
|
|
|
|
labels = each.value.labels
|
|
|
|
deletion_protection = each.value.deletion_protection
|
2020-05-02 08:33:48 -07:00
|
|
|
|
|
|
|
view {
|
|
|
|
query = each.value.query
|
|
|
|
use_legacy_sql = each.value.use_legacy_sql
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|