locals { selector = var.selector==null?var.labels:var.selector app_slug = "${var.instance}${var.component==""?"":"-"}${var.component}" cluster_ports = var.svc_type == "ClusterIP" ? [for idx, target in var.targets : { "name" = target "port" = var.ports[idx] "protocol" = var.protocols[idx] "targetPort" = target }] : [] ext_ports = var.svc_type == "ExternalName" ? [for idx, target in var.targets : { "name" = target "port" = var.ports[idx] "protocol" = var.protocols[idx] "targetPort" = var.ports[idx] }] : [] lb_ports = var.svc_type == "LoadBalancer" ? [for idx, port in var.lb_ports : { "port" = port "targetPort" = var.ports[idx] }] : [] node_ports = var.svc_type == "NodePort" ? [for idx, port in var.ports : { "port" = port "targetPort" = port "nodePort" = var.node_ports[idx] }] : [] 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.cluster_ports selector = local.selector }, "ExternalName" = { type = "ExternalName" externalName = var.target_host ports = local.ext_ports }, "NodePort" = { type = "NodePort" selector = local.selector ports = local.node_ports }, "LoadBalancer" = { type = "LoadBalancer" selector = local.selector ports = local.lb_ports externalTrafficPolicy = var.lb_policy } } } resource "kubectl_manifest" "service" { yaml_body = <<-EOF apiVersion: v1 kind: Service metadata: ${jsonencode(local.metadata)} spec: ${jsonencode(local.spec[var.svc_type])} EOF }