terraform { required_version = ">= 1.0" required_providers { helm = { source = "hashicorp/helm" version = "~> 2.12" } kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.26" } null = { source = "hashicorp/null" version = "~> 3.2" } } } provider "kubernetes" { config_path = var.kubeconfig_path } provider "helm" { kubernetes { config_path = var.kubeconfig_path } } resource "helm_release" "calico_crds" { name = "calico-crds" repository = var.calico.repository chart = "crd.projectcalico.org.v1" version = var.calico.version namespace = var.calico.namespace create_namespace = true } resource "helm_release" "calico" { depends_on = [helm_release.calico_crds] name = "calico" repository = var.calico.repository chart = "tigera-operator" version = var.calico.version namespace = var.calico.namespace create_namespace = true timeout = 600 values = [ yamlencode({ manageCRDs = false apiServer = { enabled = false } goldmane = { enabled = false } whisker = { enabled = false } installation = { controlPlaneReplicas = 1 cni = { type = "Calico" } calicoNetwork = { bgp = "Disabled" ipPools = [ { cidr = var.pod_network_cidr encapsulation = "VXLAN" } ] } } }) ] } resource "null_resource" "calico_ready" { depends_on = [helm_release.calico] triggers = { kubeconfig_path = var.kubeconfig_path calico_version = var.calico.version pod_network_cidr = var.pod_network_cidr } provisioner "local-exec" { interpreter = ["/bin/bash", "-lc"] command = <&2 exit 1 fi known_hosts_file="$(mktemp)" known_hosts_sorted="$(mktemp)" trap 'rm -f "$${known_hosts_file}" "$${known_hosts_sorted}"' EXIT kubectl --kubeconfig "${self.triggers.kubeconfig_path}" -n "${self.triggers.namespace}" get configmap argocd-ssh-known-hosts-cm \ -o jsonpath='{.data.ssh_known_hosts}' > "$${known_hosts_file}" 2>/dev/null || true ssh-keyscan -H "$${repo_host}" >> "$${known_hosts_file}" 2>/dev/null sort -u "$${known_hosts_file}" > "$${known_hosts_sorted}" kubectl --kubeconfig "${self.triggers.kubeconfig_path}" -n "${self.triggers.namespace}" create configmap argocd-ssh-known-hosts-cm \ --from-file=ssh_known_hosts="$${known_hosts_sorted}" \ --dry-run=client -o yaml | kubectl --kubeconfig "${self.triggers.kubeconfig_path}" apply -f - kubectl --kubeconfig "${self.triggers.kubeconfig_path}" -n "${self.triggers.namespace}" create secret generic "${self.triggers.secret_name}" \ --from-literal=type=git \ --from-literal=url="${self.triggers.repo_url}" \ --from-file=sshPrivateKey="${self.triggers.ssh_key_path}" \ --dry-run=client -o yaml | kubectl --kubeconfig "${self.triggers.kubeconfig_path}" apply -f - kubectl --kubeconfig "${self.triggers.kubeconfig_path}" -n "${self.triggers.namespace}" label secret "${self.triggers.secret_name}" \ argocd.argoproj.io/secret-type=repository --overwrite EOT } } resource "helm_release" "extra_tools" { for_each = var.extra_helm_releases depends_on = [null_resource.calico_ready] name = each.key repository = each.value.repository chart = each.value.chart version = each.value.version != "" ? each.value.version : null namespace = each.value.namespace create_namespace = each.value.create_namespace timeout = each.value.timeout values = each.value.values_yaml != "" ? [each.value.values_yaml] : [] dynamic "set" { for_each = each.value.set_values content { name = set.key value = set.value } } }