Fix MetalLB pool apply ordering

This commit is contained in:
juvdiaz 2026-05-26 23:12:22 -06:00
parent 7c0a74cf51
commit 1108e21b1b
1 changed files with 43 additions and 25 deletions

View File

@ -75,6 +75,35 @@ ip6.arpa:53 {
prometheus :9253 prometheus :9253
} }
EOT EOT
metallb_ip_address_pool_manifest = yamlencode({
apiVersion = "metallb.io/v1beta1"
kind = "IPAddressPool"
metadata = {
name = var.metallb.pool_name
namespace = var.metallb.namespace
}
spec = {
addresses = var.metallb.address_pool
}
})
metallb_l2_advertisement_manifest = yamlencode({
apiVersion = "metallb.io/v1beta1"
kind = "L2Advertisement"
metadata = {
name = var.metallb.pool_name
namespace = var.metallb.namespace
}
spec = {
ipAddressPools = [var.metallb.pool_name]
}
})
metallb_l2_manifests = join("\n---\n", compact([
local.metallb_ip_address_pool_manifest,
var.metallb.l2_advertisement_enabled ? local.metallb_l2_advertisement_manifest : "",
]))
} }
resource "helm_release" "calico_crds" { resource "helm_release" "calico_crds" {
@ -536,39 +565,28 @@ resource "helm_release" "metallb" {
] ]
} }
resource "kubernetes_manifest" "metallb_ip_address_pool" { resource "null_resource" "metallb_l2_config" {
for_each = var.metallb.enabled && length(var.metallb.address_pool) > 0 ? { enabled = true } : {} for_each = var.metallb.enabled && length(var.metallb.address_pool) > 0 ? { enabled = true } : {}
depends_on = [helm_release.metallb] depends_on = [helm_release.metallb]
manifest = { triggers = {
apiVersion = "metallb.io/v1beta1" kubeconfig_path = var.kubeconfig_path
kind = "IPAddressPool" manifest_hash = sha256(local.metallb_l2_manifests)
metadata = {
name = var.metallb.pool_name
namespace = var.metallb.namespace
} }
spec = {
addresses = var.metallb.address_pool
}
}
}
resource "kubernetes_manifest" "metallb_l2_advertisement" { provisioner "local-exec" {
for_each = var.metallb.enabled && var.metallb.l2_advertisement_enabled && length(var.metallb.address_pool) > 0 ? { enabled = true } : {} interpreter = ["/bin/bash", "-lc"]
command = <<EOT
set -euo pipefail
depends_on = [kubernetes_manifest.metallb_ip_address_pool] kubectl --kubeconfig "${self.triggers.kubeconfig_path}" wait --for=condition=Established --timeout=180s crd/ipaddresspools.metallb.io
kubectl --kubeconfig "${self.triggers.kubeconfig_path}" wait --for=condition=Established --timeout=180s crd/l2advertisements.metallb.io
manifest = { cat <<'METALLB_MANIFESTS' | kubectl --kubeconfig "${self.triggers.kubeconfig_path}" apply -f -
apiVersion = "metallb.io/v1beta1" ${local.metallb_l2_manifests}
kind = "L2Advertisement" METALLB_MANIFESTS
metadata = { EOT
name = var.metallb.pool_name
namespace = var.metallb.namespace
}
spec = {
ipAddressPools = [var.metallb.pool_name]
}
} }
} }