variable "infra" { type = object({ postgres = object({ image = string admin_user = string host = string port = number internal_host = string internal_port = number sslmode = string }) pgadmin = object({ image = string port = number email = string }) silo = object({ image = string admin_user = string host = string port = number console_port = number internal_host = string internal_port = number state_bucket = string backup_bucket = string }) vault = object({ image = string host = string port = number mount = string database_mount = string }) }) } variable "buckets" { type = map(object({ versioning = optional(bool, true) noncurrent_days = optional(number, 30) expire_days = optional(number) })) default = {} validation { condition = alltrue([ for name in keys(var.buckets) : can(regex("^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$", name)) ]) error_message = "Имя бакета: 3–63 символа, строчные латинские буквы, цифры, точки и дефисы." } validation { condition = contains(keys(var.buckets), var.infra.silo.backup_bucket) error_message = "Бакет из infra.silo.backup_bucket должен быть описан в buckets." } validation { condition = !contains(keys(var.buckets), var.infra.silo.state_bucket) error_message = "Бакет из infra.silo.state_bucket создаётся отдельно, в buckets его описывать нельзя." } } variable "databases" { type = map(object({ pgvector = optional(bool, false) })) default = {} validation { condition = alltrue([ for name in keys(var.databases) : can(regex("^[a-z_][a-z0-9_]{0,55}$", name)) ]) error_message = "Имя базы: до 56 символов, строчные латинские буквы, цифры и подчёркивания, не с цифры." } } variable "services" { type = map(object({ buckets = optional(map(string), {}) databases = optional(list(string), []) })) default = {} validation { condition = alltrue(flatten([ for svc in values(var.services) : [for bucket in keys(svc.buckets) : contains(keys(var.buckets), bucket)] ])) error_message = "Сервис ссылается на бакет, которого нет в buckets." } validation { condition = alltrue(flatten([ for svc in values(var.services) : [for access in values(svc.buckets) : contains(["rw", "ro"], access)] ])) error_message = "Доступ к бакету: rw или ro." } validation { condition = alltrue(flatten([ for svc in values(var.services) : [for db in svc.databases : contains(keys(var.databases), db)] ])) error_message = "Сервис ссылается на базу, которой нет в databases." } validation { condition = alltrue(flatten([ for name, svc in var.services : [for db in svc.databases : length("${name}-${db}") <= 63] ])) error_message = "Имя роли <сервис>-<база> длиннее 63 символов." } }