locals { app_slug = "${var.instance}${var.component == "" ? "" : "-"}${var.component}" selector = length(var.selector) > 0 ? var.selector : var.labels default_ports = var.svc_type != "NodePort" ? [for port_map in var.port_mapper : { "name" = lower(port_map.name != null && port_map.name != "" ? port_map.name : "${port_map.port}-${port_map.protocol}") "port" = port_map.port "protocol" = port_map.protocol "targetPort" = port_map.target }] : [] node_ports = var.svc_type == "NodePort" ? [for port_map in var.port_mapper : { "port" = port_map.port "targetPort" = port_map.target "nodePort" = port_map.port }] : [] metadata = merge( { "name" = local.app_slug "namespace" = var.namespace "labels" = var.labels }, length(var.annotations) > 0 ? { "annotations" = var.annotations } : {} ) spec = { "ClusterIP" = { type = "ClusterIP" ports = local.default_ports selector = local.selector ipFamilyPolicy = var.ip_family }, "ExternalName" = { type = "ExternalName" externalName = var.target_host ports = local.default_ports }, "NodePort" = { type = "NodePort" selector = local.selector ports = local.node_ports ipFamilyPolicy = var.ip_family }, "LoadBalancer" = { type = "LoadBalancer" selector = local.selector ports = local.default_ports externalTrafficPolicy = var.lb_policy ipFamilyPolicy = var.ip_family } } } resource "kubectl_manifest" "service" { yaml_body = <<-EOF apiVersion: v1 kind: Service metadata: ${jsonencode(local.metadata)} spec: ${jsonencode(local.spec[var.svc_type])} EOF } resource "kubectl_manifest" "endpoint" { count = var.svc_type == "ExternalName" ? 1 : 0 yaml_body = <<-EOF apiVersion: v1 kind: Endpoints metadata: name: "${local.app_slug}" namespace: "${var.namespace}" labels: ${jsonencode(var.labels)} ownerReferences: ${jsonencode(var.owner_references)} subsets: - addresses: - ip: ${var.target_host} ports: ${jsonencode([for port_map in var.port_mapper : { "port" = port_map.port }])} EOF }