# Manage the Nearle Stack (Jupiter, Atlantis, Fiesta) plus the shared core # workers, Ingress and Traefik middlewares. # # NOTE: each of these manifest files contains MULTIPLE '---'-separated YAML # documents (e.g. a StatefulSet + Service + HTTPRoute in one file). Terraform's # built-in yamldecode() only parses a single document, so each file is split # on the '---' separator first and turned into a for_each map, one # kubernetes_manifest per document. This has been verified safe for these # specific files (the number of '---' lines matches document-count minus one # in each case - no embedded '---' inside any script/config content). locals { # Splits a multi-document YAML file into a map keyed by # "//" (namespace omitted for cluster-scoped # resources), suitable for a kubernetes_manifest for_each. jupiter_docs = { for doc in [ for chunk in split("\n---\n", file("${path.module}/../manifests/nearle/nearle-jupiter.yaml")) : yamldecode(chunk) if trimspace(chunk) != "" ] : "${doc.kind}/${lookup(doc.metadata, "namespace", "")}/${doc.metadata.name}" => doc } atlantis_docs = { for doc in [ for chunk in split("\n---\n", file("${path.module}/../manifests/nearle/nearle-atlantis.yaml")) : yamldecode(chunk) if trimspace(chunk) != "" ] : "${doc.kind}/${lookup(doc.metadata, "namespace", "")}/${doc.metadata.name}" => doc } fiesta_docs = { for doc in [ for chunk in split("\n---\n", file("${path.module}/../manifests/nearle/nearle-fiesta.yaml")) : yamldecode(chunk) if trimspace(chunk) != "" ] : "${doc.kind}/${lookup(doc.metadata, "namespace", "")}/${doc.metadata.name}" => doc } core_workers_docs = { for doc in [ for chunk in split("\n---\n", file("${path.module}/../manifests/core/workers.yaml")) : yamldecode(chunk) if trimspace(chunk) != "" ] : "${doc.kind}/${lookup(doc.metadata, "namespace", "")}/${doc.metadata.name}" => doc } core_ingress_docs = { for doc in [ for chunk in split("\n---\n", file("${path.module}/../manifests/core/ingress-unified.yaml")) : yamldecode(chunk) if trimspace(chunk) != "" ] : "${doc.kind}/${lookup(doc.metadata, "namespace", "")}/${doc.metadata.name}" => doc } traefik_middlewares_docs = { for doc in [ for chunk in split("\n---\n", file("${path.module}/../manifests/core/traefik-middlewares.yaml")) : yamldecode(chunk) if trimspace(chunk) != "" ] : "${doc.kind}/${lookup(doc.metadata, "namespace", "")}/${doc.metadata.name}" => doc } } # 1. Jupiter (StatefulSet + Service) resource "kubernetes_manifest" "nearle_jupiter" { for_each = local.jupiter_docs manifest = each.value } # 2. Atlantis (StatefulSet + Service + HTTPRoute) resource "kubernetes_manifest" "nearle_atlantis" { for_each = local.atlantis_docs manifest = each.value } # 3. Fiesta (StatefulSet + Service + HTTPRoute) resource "kubernetes_manifest" "nearle_fiesta" { for_each = local.fiesta_docs manifest = each.value } # 4. Workers (CPU-heavy, isolated node pool - 5 StatefulSets) resource "kubernetes_manifest" "core_workers" { for_each = local.core_workers_docs manifest = each.value } # 5. Ingress (queue.workolik.com, jupiter/fiesta/atlantis.nearle.app) resource "kubernetes_manifest" "core_ingress" { for_each = local.core_ingress_docs manifest = each.value } # 6. Traefik CORS middlewares (alaska + nearle) resource "kubernetes_manifest" "traefik_middlewares" { for_each = local.traefik_middlewares_docs manifest = each.value }