From bad7a0c80baf22e1b18348d03033f57a3e52763d Mon Sep 17 00:00:00 2001 From: Johannes Grumboeck Date: Fri, 5 Jan 2024 09:13:49 +0100 Subject: [PATCH 1/4] feat(ecs): Add support for ECS deployment circuit breaker --- .../spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java | 1 + .../clouddriver/ecs/cache/client/ServiceCacheClient.java | 1 + .../spinnaker/clouddriver/ecs/cache/model/Service.java | 1 + .../deploy/description/CreateServerGroupDescription.java | 2 ++ .../ecs/deploy/ops/CreateServerGroupAtomicOperation.java | 6 ++++++ .../clouddriver/ecs/provider/agent/ServiceCachingAgent.java | 1 + .../deploy/ops/CreateServerGroupAtomicOperationSpec.groovy | 5 ++++- 7 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java b/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java index ed60d2ef954..6fcd97fdcc0 100644 --- a/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java +++ b/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java @@ -153,6 +153,7 @@ public void getLoadBalancersForApplicationTest() { serviceAttributes.put("minimumHealthyPercent", 10); serviceAttributes.put("subnets", Arrays.asList("testSubnet")); serviceAttributes.put("securityGroups", Arrays.asList("test-security")); + serviceAttributes.put("enableDeploymentCircuitBreaker", false); serviceAttributes.put("createdAt", createdAtLong); DefaultCacheResult testResultForService = diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java index 2dc4ed7fe4e..98eb7a2a8ff 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java @@ -60,6 +60,7 @@ protected Service convert(CacheData cacheData) { service.setMinimumHealthyPercent((Integer) attributes.get("minimumHealthyPercent")); service.setSubnets((List) attributes.get("subnets")); service.setSecurityGroups((List) attributes.get("securityGroups")); + service.setEnableDeploymentCircuitBreaker((Boolean) attributes.get("enableDeploymentCircuitBreaker")); if (attributes.containsKey("loadBalancers")) { List> loadBalancers = diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java index 58adf6c0b51..cf5c195d431 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java @@ -38,6 +38,7 @@ public class Service { List loadBalancers; List subnets; List securityGroups; + boolean enableDeploymentCircuitBreaker; long createdAt; Moniker moniker; } diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java index d9e0974bbf2..fbe06153cd5 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java @@ -99,6 +99,8 @@ public class CreateServerGroupDescription extends AbstractECSDescription { String taskDefinitionArtifactAccount; Map containerToImageMap; boolean enableExecuteCommand; + boolean enableDeploymentCircuitBreaker; + /** * @deprecated this field only allows for one container to be specified. ECS supports the ability diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperation.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperation.java index 3fe345cd3c2..686cffcc477 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperation.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperation.java @@ -536,6 +536,12 @@ protected CreateServiceRequest makeServiceRequest( DeploymentConfiguration deploymentConfiguration = new DeploymentConfiguration().withMinimumHealthyPercent(100).withMaximumPercent(200); + DeploymentCircuitBreaker deploymentCircuitBreaker = + new DeploymentCircuitBreaker() + .withEnable(description.isEnableDeploymentCircuitBreaker()) + .withRollback(false); + deploymentConfiguration.setDeploymentCircuitBreaker(deploymentCircuitBreaker); + CreateServiceRequest request = new CreateServiceRequest() .withServiceName(newServerGroupName.getServiceName()) diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java index 2c05a35ec16..b34e41c7e14 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java @@ -123,6 +123,7 @@ public Map convertServiceToAttributes(Service service) { service.getNetworkConfiguration().getAwsvpcConfiguration().getSecurityGroups()); } + attributes.put("enableDeploymentCircuitBreaker", service.getDeploymentConfiguration().getDeploymentCircuitBreaker().getEnable()); attributes.put("createdAt", service.getCreatedAt().getTime()); attributes.put("moniker", moniker); diff --git a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy index 60f709b9014..1dbbd2f957a 100644 --- a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy +++ b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy @@ -180,6 +180,7 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { request.launchType == null request.platformVersion == null request.enableExecuteCommand == false + request.enableDeploymentCircuitBreaker == false }) >> new CreateServiceResult().withService(service) result.getServerGroupNames().size() == 1 @@ -246,7 +247,8 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { securityGroupNames: ['helloworld'], associatePublicIpAddress: true, serviceDiscoveryAssociations: [serviceRegistry], - enableExecuteCommand: true + enableExecuteCommand: true, + enableDeploymentCircuitBreaker: true ) def operation = new CreateServerGroupAtomicOperation(description) @@ -311,6 +313,7 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { request.launchType == 'FARGATE' request.platformVersion == '1.0.0' request.enableExecuteCommand == true + request.enableDeploymentCircuitBreaker == true } as CreateServiceRequest) >> new CreateServiceResult().withService(service) result.getServerGroupNames().size() == 1 From 269d174a035144846133305a156330cb9d7888af Mon Sep 17 00:00:00 2001 From: Johannes Grumboeck Date: Fri, 12 Jan 2024 22:15:15 +0100 Subject: [PATCH 2/4] ffeat(ecs): Formatting of code --- .../clouddriver/ecs/cache/client/ServiceCacheClient.java | 3 ++- .../ecs/deploy/description/CreateServerGroupDescription.java | 1 - .../clouddriver/ecs/provider/agent/ServiceCachingAgent.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java index 98eb7a2a8ff..358826f0dd6 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java @@ -60,7 +60,8 @@ protected Service convert(CacheData cacheData) { service.setMinimumHealthyPercent((Integer) attributes.get("minimumHealthyPercent")); service.setSubnets((List) attributes.get("subnets")); service.setSecurityGroups((List) attributes.get("securityGroups")); - service.setEnableDeploymentCircuitBreaker((Boolean) attributes.get("enableDeploymentCircuitBreaker")); + service.setEnableDeploymentCircuitBreaker( + (Boolean) attributes.get("enableDeploymentCircuitBreaker")); if (attributes.containsKey("loadBalancers")) { List> loadBalancers = diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java index fbe06153cd5..2a5bbc94fec 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/deploy/description/CreateServerGroupDescription.java @@ -101,7 +101,6 @@ public class CreateServerGroupDescription extends AbstractECSDescription { boolean enableExecuteCommand; boolean enableDeploymentCircuitBreaker; - /** * @deprecated this field only allows for one container to be specified. ECS supports the ability * to have multiple target groups and container ports to be mapped to one or more containers. diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java index b34e41c7e14..6bfbcea2cbc 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java @@ -123,7 +123,9 @@ public Map convertServiceToAttributes(Service service) { service.getNetworkConfiguration().getAwsvpcConfiguration().getSecurityGroups()); } - attributes.put("enableDeploymentCircuitBreaker", service.getDeploymentConfiguration().getDeploymentCircuitBreaker().getEnable()); + attributes.put( + "enableDeploymentCircuitBreaker", + service.getDeploymentConfiguration().getDeploymentCircuitBreaker().getEnable()); attributes.put("createdAt", service.getCreatedAt().getTime()); attributes.put("moniker", moniker); From e4275631068612551e360a200fc1854d691578b6 Mon Sep 17 00:00:00 2001 From: Johannes Grumboeck Date: Sat, 13 Jan 2024 00:04:37 +0100 Subject: [PATCH 3/4] feat(ecs): remove unnecessary lines of code, oriented at enableExecuteCommand --- .../spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java | 1 - .../clouddriver/ecs/cache/client/ServiceCacheClient.java | 2 -- .../netflix/spinnaker/clouddriver/ecs/cache/model/Service.java | 1 - .../clouddriver/ecs/provider/agent/ServiceCachingAgent.java | 3 --- 4 files changed, 7 deletions(-) diff --git a/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java b/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java index 6fcd97fdcc0..ed60d2ef954 100644 --- a/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java +++ b/clouddriver-ecs/src/integration/java/com/netflix/spinnaker/clouddriver/ecs/test/LoadBalancersSpec.java @@ -153,7 +153,6 @@ public void getLoadBalancersForApplicationTest() { serviceAttributes.put("minimumHealthyPercent", 10); serviceAttributes.put("subnets", Arrays.asList("testSubnet")); serviceAttributes.put("securityGroups", Arrays.asList("test-security")); - serviceAttributes.put("enableDeploymentCircuitBreaker", false); serviceAttributes.put("createdAt", createdAtLong); DefaultCacheResult testResultForService = diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java index 358826f0dd6..2dc4ed7fe4e 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/client/ServiceCacheClient.java @@ -60,8 +60,6 @@ protected Service convert(CacheData cacheData) { service.setMinimumHealthyPercent((Integer) attributes.get("minimumHealthyPercent")); service.setSubnets((List) attributes.get("subnets")); service.setSecurityGroups((List) attributes.get("securityGroups")); - service.setEnableDeploymentCircuitBreaker( - (Boolean) attributes.get("enableDeploymentCircuitBreaker")); if (attributes.containsKey("loadBalancers")) { List> loadBalancers = diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java index cf5c195d431..58adf6c0b51 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/cache/model/Service.java @@ -38,7 +38,6 @@ public class Service { List loadBalancers; List subnets; List securityGroups; - boolean enableDeploymentCircuitBreaker; long createdAt; Moniker moniker; } diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java index 6bfbcea2cbc..2c05a35ec16 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/ServiceCachingAgent.java @@ -123,9 +123,6 @@ public Map convertServiceToAttributes(Service service) { service.getNetworkConfiguration().getAwsvpcConfiguration().getSecurityGroups()); } - attributes.put( - "enableDeploymentCircuitBreaker", - service.getDeploymentConfiguration().getDeploymentCircuitBreaker().getEnable()); attributes.put("createdAt", service.getCreatedAt().getTime()); attributes.put("moniker", moniker); From 4774f6638cea6dbb594b2729c5eebeaa26365ae2 Mon Sep 17 00:00:00 2001 From: Johannes Grumboeck Date: Sat, 13 Jan 2024 00:06:47 +0100 Subject: [PATCH 4/4] fix(ecs): used wrong syntax to test for enabled deploymentCircuitBreaker --- .../deploy/ops/CreateServerGroupAtomicOperationSpec.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy index 1dbbd2f957a..0e5300320b0 100644 --- a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy +++ b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy @@ -180,7 +180,7 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { request.launchType == null request.platformVersion == null request.enableExecuteCommand == false - request.enableDeploymentCircuitBreaker == false + request.deploymentConfiguration.deploymentCircuitBreaker.enable == false }) >> new CreateServiceResult().withService(service) result.getServerGroupNames().size() == 1 @@ -313,7 +313,7 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { request.launchType == 'FARGATE' request.platformVersion == '1.0.0' request.enableExecuteCommand == true - request.enableDeploymentCircuitBreaker == true + request.deploymentConfiguration.deploymentCircuitBreaker.enable == true } as CreateServiceRequest) >> new CreateServiceResult().withService(service) result.getServerGroupNames().size() == 1