From b592b12b10f09ad8cf6167258a579859172e6fa4 Mon Sep 17 00:00:00 2001 From: Phillip Date: Wed, 21 Oct 2026 13:57:46 -0400 Subject: [PATCH] Map the elasticloadbalancing health key to the ELBV2 capability LocalStack's /_localstack/health reports ALB/NLB support under the key "elasticloadbalancing" (its real AWS service name), not "elbv2". mapServiceName only recognized elbv2/elb/elasticloadbalancingv2, so ELBV2 was never detected even when LocalStack reported it available -- every deploy needing an ALB (which is all of them, since ELBV2 is unconditionally required alongside ECS) was blocked by a false "missing capability" preflight violation. --- .../localstack/LocalStackCapabilityProbe.java | 2 +- .../localstack/LocalStackCapabilityProbeTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cloudforgeci/localstack/LocalStackCapabilityProbe.java b/src/main/java/com/cloudforgeci/localstack/LocalStackCapabilityProbe.java index 9d2cec8..1d5b92f 100644 --- a/src/main/java/com/cloudforgeci/localstack/LocalStackCapabilityProbe.java +++ b/src/main/java/com/cloudforgeci/localstack/LocalStackCapabilityProbe.java @@ -126,7 +126,7 @@ private static java.util.Optional mapServiceName(St } return switch (service.toLowerCase(Locale.ROOT)) { case "ecs" -> java.util.Optional.of(LocalStackServiceCapability.ECS); - case "elbv2", "elb", "elasticloadbalancingv2" -> + case "elbv2", "elb", "elasticloadbalancingv2", "elasticloadbalancing" -> java.util.Optional.of(LocalStackServiceCapability.ELBV2); case "ec2" -> java.util.Optional.of(LocalStackServiceCapability.EC2); case "autoscaling", "application-autoscaling" -> diff --git a/src/test/java/com/cloudforgeci/localstack/LocalStackCapabilityProbeTest.java b/src/test/java/com/cloudforgeci/localstack/LocalStackCapabilityProbeTest.java index 38f288f..a9f81f0 100644 --- a/src/test/java/com/cloudforgeci/localstack/LocalStackCapabilityProbeTest.java +++ b/src/test/java/com/cloudforgeci/localstack/LocalStackCapabilityProbeTest.java @@ -38,4 +38,19 @@ void parsesHealthServicesIntoCapabilities() throws Exception { assertTrue(caps.contains(LocalStackServiceCapability.EFS)); assertTrue(caps.contains(LocalStackServiceCapability.BACKUP)); } + + /** LocalStack's own {@code /_localstack/health} reports ELBv2/ALB support under the key + * {@code elasticloadbalancing} (its real AWS service name), not {@code elbv2} — mapping only + * the latter meant every deploy needing an ALB was blocked as "missing capability" even + * though LocalStack reported it as available. */ + @Test + void mapsElasticLoadBalancingHealthKeyToElbv2Capability() { + ObjectNode root = new ObjectMapper().createObjectNode(); + ObjectNode services = root.putObject("services"); + services.put("ecs", "available"); + services.put("elasticloadbalancing", "available"); + + var caps = LocalStackCapabilityProbe.capabilitiesFromHealth(root, new LinkedHashMap<>()); + assertTrue(caps.contains(LocalStackServiceCapability.ELBV2)); + } }