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 }] : [] 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.cluster_ports selector = local.selector }, "ExternalName" = { type = "ExternalName" externalName = var.target_host ports = local.default_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 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)} subsets: - addresses: - ip: ${var.target_host} ports: ${jsonencode([for port_map in var.port_mapper : { "port" = port_map.port }])} EOF }