variable "region" { description = "Region for the STACKIT Cloud" type = string default = "eu01" } variable "project_id" { description = "STACKIT Cloud project ID" type = string } variable "service_account_token" { description = "Service account token for authentication" sensitive = true type = string } variable "service_account_key_path" { type = string default = "" } variable "organization_id" { description = "Organization ID" type = string } variable "owner_email" { description = "Email of the project owner" type = string default = null } variable "security_groups" { type = map(object({ name = optional(string) description = optional(string) rules = list(object({ direction = string description = optional(string) ether_type = optional(string) icmp_parameters = optional(object({ type = optional(number) code = optional(number) })) ip_range = optional(string) port_range = optional(object({ min = number max = number })) protocol = optional(object({ name = optional(string) number = optional(number) })) remote_security_group_id = optional(string) })) })) } variable "postgres_instances" { type = map(object({ name = string version = number flavor = object({ cpu = number, ram = number }) storage = object({ class = string, size = number }) replicas = number acl = list(string) backup_schedule = string users = list(object({ username = string roles = set(string) })) databases = list(object({ name = string owner = string })) })) } # Network definition map variable "networks" { type = map(object({ name = string # IPv4 settings ipv4_gateway = optional(string) ipv4_nameservers = optional(list(string)) ipv4_prefix = optional(string) ipv4_prefix_length = optional(number) # IPv6 settings ipv6_gateway = optional(string) ipv6_nameservers = optional(list(string)) ipv6_prefix = optional(string) ipv6_prefix_length = optional(number) # Flags & labels labels = optional(map(string)) no_ipv4_gateway = optional(bool) no_ipv6_gateway = optional(bool) routed = optional(bool) # NIC‑specific options nics = optional(map(object({ nic_ipv4 = optional(string) nic_name = string nic_allowed_addresses = optional(list(string)) nic_labels = optional(map(string)) nic_security = optional(bool) nic_security_group_ids = optional(list(string)) nic_security_group_names = optional(list(string)) }))) })) default = {} } variable "ske_clusters" { type = map(object({ name = string kubernetes_version_min = string node_pools = list(object({ name = string machine_type = string availability_zones = list(string) volume_size = number minimum = number maximum = number })) })) } variable "observability_instances" { description = "Map of Observability instances to create" type = map(object({ # Required name = string plan_name = string # Optional instance settings acl = optional(list(string)) metrics_retention_days = optional(number) metrics_retention_days_5m_downsampling = optional(number) metrics_retention_days_1h_downsampling = optional(number) alert_config = optional(any) parameters = optional(map(string)) # Control credential creation create_credentials = optional(bool, true) credentials_count = optional(number, 1) # alert‑groups alertgroups = optional(map(object({ name = string interval = optional(string) rules = list(object({ alert = string expression = string for = optional(string) labels = optional(map(string)) annotations = optional(map(string)) })) })), {}) # log‑alert‑groups logalertgroups = optional(map(object({ name = string interval = optional(string) rules = list(object({ alert = string expression = string for = optional(string) labels = optional(map(string)) annotations = optional(map(string)) })) })), {}) # scrape‑configs scrapeconfigs = optional(map(object({ name = string metrics_path = string targets = list(object({ urls = list(string) labels = optional(map(string)) })) basic_auth = optional(object({ username = string password = string })) saml2 = optional(object({ enable_url_parameters = optional(bool) })) sample_limit = optional(number) scheme = optional(string) scrape_interval = optional(string) scrape_timeout = optional(string) })), {}) })) default = {} validation { condition = alltrue([ for k, v in var.observability_instances : contains([ "Observability-Medium-EU01", "Observability-Monitoring-XL-EU01", "Observability-Large-EU01", "Observability-Monitoring-Basic-EU01", "Observability-Monitoring-Large-EU01", "Observability-Basic-EU01", "Observability-Monitoring-Medium-EU01", "Observability-Monitoring-XXL-EU01", "Observability-Metrics-Endpoint-100k-EU01", "Observability-Frontend-Starter-EU01", "Observability-Monitoring-Starter-EU01", "Observability-Starter-EU01", ], v.plan_name) ]) error_message = <<-EOM One or more observability_instances specify an invalid plan_name. See the provider error output for the list of supported plans. Allowed values: Observability-Medium-EU01 Observability-Monitoring-XL-EU01 Observability-Large-EU01 Observability-Monitoring-Basic-EU01 Observability-Monitoring-Large-EU01 Observability-Basic-EU01 Observability-Monitoring-Medium-EU01 Observability-Monitoring-XXL-EU01 Observability-Metrics-Endpoint-100k-EU01 Observability-Frontend-Starter-EU01 Observability-Monitoring-Starter-EU01 Observability-Starter-EU01 EOM } }