232 lines
7.8 KiB
HCL
232 lines
7.8 KiB
HCL
/**
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
variable "backup_schedule" {
|
|
description = "Backup schedule."
|
|
type = object({
|
|
retention = string
|
|
daily_recurrence = optional(bool, false)
|
|
weekly_recurrence = optional(string)
|
|
})
|
|
default = null
|
|
|
|
validation {
|
|
condition = (var.backup_schedule == null ? true :
|
|
can(regex("\\d+s", var.backup_schedule.retention)))
|
|
error_message = "Retention must be specified in the following format: \\d+s."
|
|
}
|
|
validation {
|
|
condition = (var.backup_schedule == null ? true :
|
|
(var.backup_schedule.daily_recurrence
|
|
&& var.backup_schedule.weekly_recurrence == null) ||
|
|
(!var.backup_schedule.daily_recurrence
|
|
&& var.backup_schedule.weekly_recurrence != null))
|
|
error_message = "Either daily_recurrence or weekly_recurrence must be specified, but not both."
|
|
}
|
|
}
|
|
|
|
variable "database" {
|
|
description = "Database attributes."
|
|
type = object({
|
|
app_engine_integration_mode = optional(string)
|
|
concurrency_mode = optional(string)
|
|
deletion_policy = optional(string)
|
|
delete_protection_state = optional(string)
|
|
kms_key_name = optional(string)
|
|
location_id = optional(string)
|
|
name = string
|
|
point_in_time_recovery_enablement = optional(string)
|
|
type = optional(string)
|
|
})
|
|
validation {
|
|
condition = (try(var.database.app_engine_integration_mode, null) == null ? true : contains([
|
|
"ENABLED",
|
|
"DISABLED",
|
|
], var.database.app_engine_integration_mode))
|
|
error_message = "Invalid app_engine_integration_mode. If set, possible values are: ENABLED, DISABLE."
|
|
}
|
|
validation {
|
|
condition = (try(var.database.concurrency_mode, null) == null ? true : contains([
|
|
"OPTIMISTIC",
|
|
"PESSIMISTIC",
|
|
"OPTIMISTIC_WITH_ENTITY_GROUPS"
|
|
], var.database.concurrency_mode))
|
|
error_message = "Invalid concurrency_mode. If set, possible values are: OPTIMISTIC, PESIMISTIC, OPTIMISTIC_WITH_ENTITY_GROUPS."
|
|
}
|
|
validation {
|
|
condition = (try(var.database.deletion_policy, null) == null ? true : contains([
|
|
"ABANDON",
|
|
"DELETE"
|
|
], var.database.deletion_policy))
|
|
error_message = "Invalid deletion_policy. If set, possible values are: ABANDON, DELETE."
|
|
}
|
|
validation {
|
|
condition = (try(var.database.deletion_protection_state, null) == null ? true : contains([
|
|
"DELETE_PROTECTION_STATE_UNSPECIFIED",
|
|
"DELETE_PROTECTION_ENABLED",
|
|
"DELETE_PROTECTION_DISABLED"
|
|
], var.database.deletion_protection_state))
|
|
error_message = "Invalid delete_protection_state. If set, possible values are: DELETE_PROTECTION_STATE_UNSPECIFIED, DELETE_PROTECTION_ENABLED, DELETE_PROTECTION_DISABLED."
|
|
}
|
|
|
|
validation {
|
|
condition = (try(var.database.point_in_time_recovery_enablement, null) == null ? true : contains([
|
|
"POINT_IN_TIME_RECOVERY_ENABLED",
|
|
"POINT_IN_TIME_RECOVERY_DISABLED"
|
|
], var.database.point_in_time_recovery_enablement))
|
|
error_message = "Invalid point_in_time_recovery_enablement. If set, possible values are: POINT_IN_TIME_RECOVERY_ENABLED, POINT_IN_TIME_RECOVERY_DISABLED."
|
|
}
|
|
|
|
}
|
|
|
|
variable "database_create" {
|
|
description = "Flag indicating whether the database should be created of not."
|
|
type = string
|
|
default = true
|
|
}
|
|
|
|
variable "documents" {
|
|
description = "Documents."
|
|
type = map(object({
|
|
collection = string
|
|
document_id = string
|
|
fields = any
|
|
}))
|
|
default = {}
|
|
nullable = false
|
|
}
|
|
|
|
variable "fields" {
|
|
description = "Fields."
|
|
type = map(object({
|
|
collection = string
|
|
field = string
|
|
indexes = optional(list(object({
|
|
query_scope = optional(string)
|
|
order = optional(string)
|
|
array_config = optional(string)
|
|
})))
|
|
ttl_config = optional(bool, false)
|
|
}))
|
|
default = {}
|
|
nullable = false
|
|
|
|
validation {
|
|
condition = alltrue([for v1 in var.fields :
|
|
v1.indexes == null ? true : alltrue([for v2 in coalesce(v1.indexes, []) :
|
|
v2.query_scope == null ? true : contains([
|
|
"COLLECTION",
|
|
"COLLECTION_GROUP"
|
|
], v2.query_scope)])])
|
|
error_message = "Invalid query_scope. If set possible values are: COLLECTION, COLLECTION_GROUP."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue([for v1 in var.fields :
|
|
v1.indexes == null ? true : alltrue([for v2 in coalesce(v1.indexes, []) :
|
|
v2.order == null ? true : contains([
|
|
"ASCENDING",
|
|
"DESCENDING"
|
|
], v2.order)])])
|
|
error_message = "Invalid order. If set possible values are: COLLECTION, COLLECTION_GROUP."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue([for v1 in var.fields :
|
|
v1.indexes == null ? true : alltrue([for v2 in coalesce(v1.indexes, []) :
|
|
v2.array_config == null || v2.array_config == "CONTAINS"])])
|
|
error_message = "Invalid array_config, value must be equal to CONTAINS."
|
|
}
|
|
|
|
|
|
validation {
|
|
condition = alltrue([for v1 in var.fields :
|
|
v1.indexes == null ? true : alltrue([for v2 in coalesce(v1.indexes, []) :
|
|
!(v2.order != null && v2.array_config != null)])])
|
|
error_message = "Either order or array_config should be specified, but not both."
|
|
}
|
|
|
|
}
|
|
|
|
variable "indexes" {
|
|
description = "Indexes."
|
|
type = map(object({
|
|
api_scope = optional(string)
|
|
collection = string
|
|
fields = list(object({
|
|
field_path = optional(string)
|
|
order = optional(string)
|
|
array_config = optional(string)
|
|
vector_config = optional(object({
|
|
dimension = optional(number)
|
|
flat = optional(bool)
|
|
}))
|
|
}))
|
|
query_scope = optional(string)
|
|
}))
|
|
default = {}
|
|
nullable = false
|
|
|
|
validation {
|
|
condition = alltrue([for k, v in var.indexes : v.api_scope == null ? true : contains([
|
|
"ANY_API",
|
|
"DATASTORE_MODE_API"
|
|
], v.api_scope)
|
|
])
|
|
error_message = "Invalid api_scope. If set possible values are: ANY_API, DATASTORE_MODE_API."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue([for k, v in var.indexes : v.query_scope == null ? true : contains([
|
|
"COLLECTION",
|
|
"COLLECTION_GROUP",
|
|
"COLLECTION_RECURSIVE"
|
|
], v.query_scope)
|
|
])
|
|
error_message = "Invalid query_scope. If set possible values are: COLLECTION, COLLECTION_GROUP, COLLECTION_RECURSIVE."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue([for k1, v1 in var.indexes :
|
|
v1.fields == null ? true : alltrue([for v2 in coalesce(v1.fields, []) :
|
|
v2.order == null ? true : contains([
|
|
"ASCENDING",
|
|
"DESCENDING"
|
|
], v2.order)])])
|
|
error_message = "Invalid order. If set possible values are: COLLECTION, COLLECTION_GROUP."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue([for k1, v1 in var.indexes :
|
|
v1.fields == null ? true : alltrue([for v2 in coalesce(v1.fields, []) :
|
|
v2.array_config == null || v2.array_config == "CONTAINS"])])
|
|
error_message = "Invalid array_config, value must be equal to CONTAINS."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue([for k1, v1 in var.indexes :
|
|
v1.fields == null ? true : alltrue([for v2 in coalesce(v1.fields, []) :
|
|
length([for v3 in [v2.order != null, v2.array_config != null, v2.vector_config != null] : v3 if v3]) == 1])])
|
|
error_message = "Only one of order, array_config or vector_config can be specified."
|
|
}
|
|
|
|
}
|
|
|
|
variable "project_id" {
|
|
description = "Project id."
|
|
type = string
|
|
}
|