terraform { required_version = ">= 1.6.0" required_providers { kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.30" } } } provider "kubernetes" { host = var.k3s_server_url token = var.k3s_token insecure = true } locals { manifest_dir = "${path.module}/manifests" manifest_files = fileset(local.manifest_dir, "**/*.yaml") raw_documents = flatten([ for f in local.manifest_files : [ for doc in split("\n---", trimspace(file("${local.manifest_dir}/${f}"))) : trimspace(doc) if trimspace(doc) != "" ] ]) decoded_documents = [ for doc in local.raw_documents : yamldecode(doc) if try(yamldecode(doc).kind, "") != "" ] cluster_scoped_kinds = toset([ "Namespace", "CustomResourceDefinition", "ClusterRole", "ClusterRoleBinding", "ClusterIssuer", "PersistentVolume", "StorageClass", "MutatingWebhookConfiguration", "ValidatingWebhookConfiguration", ]) namespaced_documents = [ for m in local.decoded_documents : contains(local.cluster_scoped_kinds, m.kind) ? m : merge( m, { metadata = merge( lookup(m, "metadata", {}), { namespace = var.namespace } ) } ) ] } resource "kubernetes_manifest" "namespace" { manifest = { apiVersion = "v1" kind = "Namespace" metadata = { name = var.namespace } } } resource "kubernetes_manifest" "resources" { for_each = { for idx, m in local.namespaced_documents : tostring(idx) => m } manifest = each.value depends_on = [kubernetes_manifest.namespace] }