From 1a9b7a18474eb00e816796a21c63764059a940bc Mon Sep 17 00:00:00 2001 From: jeyrs Date: Mon, 22 Apr 2019 15:50:12 -0700 Subject: [PATCH] refactor(conditions): Do not inject waitForCondition on no conditions - Updated interface to specify cluster, region and account - Make injecting the stage optional on if there are active conditions - Move to orca-clouddriver as this is deploy-centric --- ...ConditionAwareDeployStagePreprocessor.java | 60 ++++++++++++++----- .../pipeline}/conditions/Condition.java | 2 +- .../ConditionConfigurationProperties.java | 2 +- .../conditions/ConditionSupplier.java | 5 +- .../ConfigurationBackedConditionSupplier.java | 9 +-- .../conditions}/WaitForConditionStage.java | 19 +++++- .../conditions}/EvaluateConditionTask.java | 28 +++++---- ...gurationBackedConditionSupplierSpec.groovy | 27 +++------ .../EvaluateConditionTaskSpec.groovy | 52 +++++++++------- .../orca/config/OrcaConfiguration.java | 1 - 10 files changed, 124 insertions(+), 81 deletions(-) rename {orca-core/src/main/java/com/netflix/spinnaker/orca => orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline}/conditions/Condition.java (96%) rename {orca-core/src/main/java/com/netflix/spinnaker/orca => orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline}/conditions/ConditionConfigurationProperties.java (97%) rename {orca-core/src/main/java/com/netflix/spinnaker/orca => orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline}/conditions/ConditionSupplier.java (84%) rename {orca-core/src/main/java/com/netflix/spinnaker/orca => orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline}/conditions/ConfigurationBackedConditionSupplier.java (84%) rename {orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline => orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions}/WaitForConditionStage.java (77%) rename {orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/tasks => orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions}/EvaluateConditionTask.java (78%) rename {orca-core/src/test/groovy/com/netflix/spinnaker/orca => orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline}/conditions/ConfigurationBackedConditionSupplierSpec.groovy (66%) rename {orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks => orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions}/EvaluateConditionTaskSpec.groovy (61%) diff --git a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/ConditionAwareDeployStagePreprocessor.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/ConditionAwareDeployStagePreprocessor.java index 7cacbe7f10..90721833ab 100644 --- a/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/ConditionAwareDeployStagePreprocessor.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/ConditionAwareDeployStagePreprocessor.java @@ -16,29 +16,37 @@ package com.netflix.spinnaker.orca.clouddriver.pipeline; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.Condition; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.ConditionSupplier; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.WaitForConditionStage; import com.netflix.spinnaker.orca.clouddriver.pipeline.servergroup.strategies.DeployStagePreProcessor; import com.netflix.spinnaker.orca.kato.pipeline.support.StageData; -import com.netflix.spinnaker.orca.pipeline.WaitForConditionStage; import com.netflix.spinnaker.orca.pipeline.model.Stage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; @Component +@ConditionalOnBean(ConditionSupplier.class) @ConditionalOnExpression("${tasks.evaluateCondition.enabled:false}") public class ConditionAwareDeployStagePreprocessor implements DeployStagePreProcessor { + private final Logger log = LoggerFactory.getLogger(ConditionAwareDeployStagePreprocessor.class); private final WaitForConditionStage waitForConditionStage; + private final List conditionSuppliers; @Autowired public ConditionAwareDeployStagePreprocessor( - WaitForConditionStage waitForConditionStage + WaitForConditionStage waitForConditionStage, + List conditionSuppliers ) { this.waitForConditionStage = waitForConditionStage; + this.conditionSuppliers = conditionSuppliers; } @Override @@ -48,15 +56,35 @@ public boolean supports(Stage stage) { @Override public List beforeStageDefinitions(Stage stage) { - final StageData stageData = stage.mapTo(StageData.class); - Map ctx = new HashMap<>(); - ctx.put("region", stageData.getRegion()); - ctx.put("cluster", stageData.getCluster()); - - StageDefinition stageDefinition = new StageDefinition(); - stageDefinition.name = "Wait For Condition"; - stageDefinition.context = ctx; - stageDefinition.stageDefinitionBuilder = waitForConditionStage; - return Collections.singletonList(stageDefinition); + try { + final StageData stageData = stage.mapTo(StageData.class); + Set conditions = conditionSuppliers + .stream() + .flatMap(supplier -> supplier.getConditions( + stageData.getCluster(), + stageData.getRegion(), + stageData.getAccount() + ).stream()).filter(Objects::nonNull) + .collect(Collectors.toSet()); + if (conditions.isEmpty()) { + // do no inject the stage if there are no active conditions + return Collections.emptyList(); + } + + Map ctx = new HashMap<>(); + // defines what is required by condition suppliers + ctx.put("region", stageData.getRegion()); + ctx.put("cluster", stageData.getCluster()); + ctx.put("account", stageData.getAccount()); + StageDefinition stageDefinition = new StageDefinition(); + stageDefinition.name = "Wait For Condition"; + stageDefinition.context = ctx; + stageDefinition.stageDefinitionBuilder = waitForConditionStage; + return Collections.singletonList(stageDefinition); + } catch (Exception e) { + log.error("Error determining active conditions. Proceeding with execution {}", stage.getExecution().getId()); + } + + return Collections.emptyList(); } } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/Condition.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/Condition.java similarity index 96% rename from orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/Condition.java rename to orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/Condition.java index a0148a3078..64df49182a 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/Condition.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/Condition.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.conditions; +package com.netflix.spinnaker.orca.clouddriver.pipeline.conditions; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConditionConfigurationProperties.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConditionConfigurationProperties.java similarity index 97% rename from orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConditionConfigurationProperties.java rename to orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConditionConfigurationProperties.java index a1066a8325..d2f76d9bf4 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConditionConfigurationProperties.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConditionConfigurationProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.conditions; +package com.netflix.spinnaker.orca.clouddriver.pipeline.conditions; import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService; import org.springframework.beans.factory.annotation.Autowired; diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConditionSupplier.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConditionSupplier.java similarity index 84% rename from orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConditionSupplier.java rename to orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConditionSupplier.java index 1d2416099d..8313c05a30 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConditionSupplier.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConditionSupplier.java @@ -14,9 +14,8 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.conditions; +package com.netflix.spinnaker.orca.clouddriver.pipeline.conditions; -import com.netflix.spinnaker.orca.pipeline.model.Stage; import java.util.List; /** @@ -26,5 +25,5 @@ public interface ConditionSupplier { /** * returns a list of currently unmet conditions. */ - List getConditions(Stage stage); + List getConditions(String cluster, String region, String account); } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConfigurationBackedConditionSupplier.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConfigurationBackedConditionSupplier.java similarity index 84% rename from orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConfigurationBackedConditionSupplier.java rename to orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConfigurationBackedConditionSupplier.java index dd7bceb9a1..278c5e0ffd 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/conditions/ConfigurationBackedConditionSupplier.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConfigurationBackedConditionSupplier.java @@ -14,10 +14,8 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.conditions; +package com.netflix.spinnaker.orca.clouddriver.pipeline.conditions; -import com.netflix.spinnaker.orca.pipeline.WaitForConditionStage.WaitForConditionContext; -import com.netflix.spinnaker.orca.pipeline.model.Stage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; @@ -41,8 +39,7 @@ public ConfigurationBackedConditionSupplier(ConditionConfigurationProperties con } @Override - public List getConditions(Stage stage) { - final WaitForConditionContext ctx = stage.mapTo(WaitForConditionContext.class); + public List getConditions(String cluster, String region, String account) { final List clusters = conditionsConfigurationProperties.getClusters(); final List activeConditions = conditionsConfigurationProperties.getActiveConditions(); @@ -50,7 +47,7 @@ public List getConditions(Stage stage) { return Collections.emptyList(); } - if (!clusters.contains(ctx.getCluster())) { + if (!clusters.contains(cluster)) { return Collections.emptyList(); } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/WaitForConditionStage.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/WaitForConditionStage.java similarity index 77% rename from orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/WaitForConditionStage.java rename to orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/WaitForConditionStage.java index ac48f47f1d..a0e428afa9 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/WaitForConditionStage.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/WaitForConditionStage.java @@ -14,12 +14,14 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.pipeline; +package com.netflix.spinnaker.orca.clouddriver.pipeline.conditions; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.netflix.spinnaker.orca.clouddriver.tasks.conditions.EvaluateConditionTask; +import com.netflix.spinnaker.orca.pipeline.StageDefinitionBuilder; +import com.netflix.spinnaker.orca.pipeline.TaskNode; import com.netflix.spinnaker.orca.pipeline.model.Stage; -import com.netflix.spinnaker.orca.pipeline.tasks.EvaluateConditionTask; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; @@ -38,16 +40,19 @@ public static final class WaitForConditionContext { private Status status; private String region; private String cluster; + private String account; @JsonCreator public WaitForConditionContext( @JsonProperty("status") Status status, @JsonProperty("region") @Nullable String region, - @JsonProperty("cluster") @Nullable String cluster + @JsonProperty("cluster") @Nullable String cluster, + @JsonProperty("account") @Nullable String account ) { this.status = status; this.region = region; this.cluster = cluster; + this.account = account; } public enum Status { @@ -77,5 +82,13 @@ public String getCluster() { public void setCluster(String cluster) { this.cluster = cluster; } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } } } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateConditionTask.java b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java similarity index 78% rename from orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateConditionTask.java rename to orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java index 04f743d899..97405172cc 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateConditionTask.java +++ b/orca-clouddriver/src/main/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTask.java @@ -14,19 +14,21 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.pipeline.tasks; +package com.netflix.spinnaker.orca.clouddriver.tasks.conditions; import com.netflix.spinnaker.orca.ExecutionStatus; import com.netflix.spinnaker.orca.RetryableTask; import com.netflix.spinnaker.orca.TaskResult; -import com.netflix.spinnaker.orca.conditions.ConditionConfigurationProperties; -import com.netflix.spinnaker.orca.conditions.Condition; -import com.netflix.spinnaker.orca.conditions.ConditionSupplier; -import com.netflix.spinnaker.orca.pipeline.WaitForConditionStage.WaitForConditionContext; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.Condition; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.ConditionConfigurationProperties; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.ConditionSupplier; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.WaitForConditionStage.WaitForConditionContext; +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.WaitForConditionStage.WaitForConditionContext.Status; import com.netflix.spinnaker.orca.pipeline.model.Stage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; @@ -38,20 +40,20 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static com.netflix.spinnaker.orca.pipeline.WaitForConditionStage.WaitForConditionContext.*; @Component +@ConditionalOnBean(ConditionSupplier.class) @ConditionalOnExpression("${tasks.evaluateCondition.enabled:false}") public class EvaluateConditionTask implements RetryableTask { private static final Logger log = LoggerFactory.getLogger(EvaluateConditionTask.class); private final ConditionConfigurationProperties conditionsConfigurationProperties; - private final Optional> suppliers; + private final List suppliers; private final Clock clock; @Autowired public EvaluateConditionTask( ConditionConfigurationProperties conditionsConfigurationProperties, - Optional> suppliers, + List suppliers, Clock clock ) { this.conditionsConfigurationProperties = conditionsConfigurationProperties; @@ -73,7 +75,7 @@ public long getTimeout() { @Override public TaskResult execute(@Nonnull Stage stage) { final WaitForConditionContext ctx = stage.mapTo(WaitForConditionContext.class); - if (ctx.getStatus() == Status.SKIPPED || !suppliers.isPresent()) { + if (ctx.getStatus() == Status.SKIPPED) { return new TaskResult(ExecutionStatus.SUCCEEDED, Collections.singletonMap("status", Status.SKIPPED)); } @@ -88,9 +90,13 @@ public TaskResult execute(@Nonnull Stage stage) { } try { - Set conditions = suppliers.get() + Set conditions = suppliers .stream() - .flatMap(supplier -> supplier.getConditions(stage).stream()).filter(Objects::nonNull) + .flatMap(supplier -> supplier.getConditions( + ctx.getCluster(), + ctx.getRegion(), + ctx.getAccount() + ).stream()).filter(Objects::nonNull) .collect(Collectors.toSet()); log.info("Found conditions: {}", conditions); diff --git a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/conditions/ConfigurationBackedConditionSupplierSpec.groovy b/orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConfigurationBackedConditionSupplierSpec.groovy similarity index 66% rename from orca-core/src/test/groovy/com/netflix/spinnaker/orca/conditions/ConfigurationBackedConditionSupplierSpec.groovy rename to orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConfigurationBackedConditionSupplierSpec.groovy index 02d82288ec..ba4b2d15ad 100644 --- a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/conditions/ConfigurationBackedConditionSupplierSpec.groovy +++ b/orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/pipeline/conditions/ConfigurationBackedConditionSupplierSpec.groovy @@ -14,17 +14,14 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.conditions +package com.netflix.spinnaker.orca.clouddriver.pipeline.conditions import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService -import com.netflix.spinnaker.orca.pipeline.WaitForConditionStage import com.netflix.spinnaker.orca.time.MutableClock import spock.lang.Specification import spock.lang.Subject import spock.lang.Unroll -import static com.netflix.spinnaker.orca.test.model.ExecutionBuilder.stage - class ConfigurationBackedConditionSupplierSpec extends Specification { def configService = Stub(DynamicConfigService) { getConfig(_ as Class, _ as String, _ as Object) >> { type, name, defaultValue -> return defaultValue } @@ -40,29 +37,21 @@ class ConfigurationBackedConditionSupplierSpec extends Specification { @Unroll def "should return configured conditions"() { given: - def stage = stage { - refId = "1" - type = WaitForConditionStage.STAGE_TYPE - startTime = clock.millis() - context = ctx - } - - and: conditionsConfigurationProperties.setClusters(clusters) conditionsConfigurationProperties.setActiveConditions(activeConditions) when: - def result = conditionSupplier.getConditions(stage) + def result = conditionSupplier.getConditions(cluster, "region", "account") then: result.size() == numberOfResultingConditions where: - ctx | clusters | activeConditions | numberOfResultingConditions - [cluster: "foo"] | [] | [] | 0 - [cluster: "foo"] | ["foo", "bar"] | [] | 0 - [cluster: "foo"] | ["bar"] | [ "c1", "c2"] | 0 - [cluster: "foo"] | ["foo", "bar"] | [ "c1", "c2"] | 2 - [cluster: "foo"] | [] | [ "c1", "c2"] | 0 + cluster | clusters | activeConditions | numberOfResultingConditions + "foo" | [] | [] | 0 + "foo" | ["foo", "bar"] | [] | 0 + "foo" | ["bar"] | [ "c1", "c2"] | 0 + "foo" | ["foo", "bar"] | [ "c1", "c2"] | 2 + "foo" | [] | [ "c1", "c2"] | 0 } } diff --git a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateConditionTaskSpec.groovy b/orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTaskSpec.groovy similarity index 61% rename from orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateConditionTaskSpec.groovy rename to orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTaskSpec.groovy index fa220db58e..7b89671f19 100644 --- a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateConditionTaskSpec.groovy +++ b/orca-clouddriver/src/test/groovy/com/netflix/spinnaker/orca/clouddriver/tasks/conditions/EvaluateConditionTaskSpec.groovy @@ -14,21 +14,22 @@ * limitations under the License. */ -package com.netflix.spinnaker.orca.pipeline.tasks +package com.netflix.spinnaker.orca.clouddriver.tasks.conditions import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService import com.netflix.spinnaker.orca.ExecutionStatus -import com.netflix.spinnaker.orca.conditions.Condition -import com.netflix.spinnaker.orca.conditions.ConditionSupplier -import com.netflix.spinnaker.orca.conditions.ConditionConfigurationProperties +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.Condition +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.ConditionConfigurationProperties +import com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.ConditionSupplier import com.netflix.spinnaker.orca.time.MutableClock import spock.lang.Specification import spock.lang.Subject import spock.lang.Unroll + import java.time.Duration -import static com.netflix.spinnaker.orca.pipeline.WaitForConditionStage.* -import static com.netflix.spinnaker.orca.pipeline.WaitForConditionStage.WaitForConditionContext.Status.* +import static com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.WaitForConditionStage.* +import static com.netflix.spinnaker.orca.clouddriver.pipeline.conditions.WaitForConditionStage.WaitForConditionContext.Status.* import static com.netflix.spinnaker.orca.test.model.ExecutionBuilder.stage class EvaluateConditionTaskSpec extends Specification { @@ -44,7 +45,7 @@ class EvaluateConditionTaskSpec extends Specification { @Subject def task = new EvaluateConditionTask( conditionsConfigurationProperties, - Optional.of([conditionSupplier]), + [conditionSupplier], clock ) @@ -54,7 +55,10 @@ class EvaluateConditionTaskSpec extends Specification { type = STAGE_TYPE startTime = clock.millis() context = [ - status: WAITING + status: WAITING.toString(), + region: "region", + cluster: "cluster", + account: "account" ] } @@ -65,7 +69,7 @@ class EvaluateConditionTaskSpec extends Specification { def result = task.execute(stage) then: - 0 * conditionSupplier.getConditions(stage) + 0 * conditionSupplier.getConditions("cluster", "region", "account") result.status == ExecutionStatus.RUNNING when: @@ -76,14 +80,18 @@ class EvaluateConditionTaskSpec extends Specification { result = task.execute(stage) then: - 1 * conditionSupplier.getConditions(stage) >> [new Condition("a", "b")] + 1 * conditionSupplier.getConditions( + "cluster", + "region", + "account" + ) >> [new Condition("a", "b")] result.status == ExecutionStatus.RUNNING when: result = task.execute(stage) then: - 1 * conditionSupplier.getConditions(stage) >> [] + 1 * conditionSupplier.getConditions("cluster", "region", "account") >> [] result.status == ExecutionStatus.SUCCEEDED when: @@ -92,7 +100,7 @@ class EvaluateConditionTaskSpec extends Specification { then: result.status == ExecutionStatus.SUCCEEDED - 0 * conditionSupplier.getConditions(stage) + 0 * conditionSupplier.getConditions(_, _, _) } @Unroll @@ -102,7 +110,12 @@ class EvaluateConditionTaskSpec extends Specification { refId = "1" type = STAGE_TYPE startTime = clock.millis() - context = ctx + context = [ + status: initialWaitStatus.toString(), + region: "region", + cluster: "cluster", + account: "account" + ] } and: @@ -114,15 +127,14 @@ class EvaluateConditionTaskSpec extends Specification { def result = task.execute(stage) then: - conditionSupplier.getConditions(stage) >> conditions + conditionSupplier.getConditions("cluster", "region", "account") >> conditions result.status == executionStatus - result.getContext().status == waitStatus where: - ctx | conditions | waitStatus | executionStatus - [:] | [] | SKIPPED | ExecutionStatus.SUCCEEDED - [status: WAITING] | [] | SKIPPED | ExecutionStatus.SUCCEEDED - [status: SKIPPED] | [] | SKIPPED | ExecutionStatus.SUCCEEDED - [status: WAITING] | [new Condition("n", "d")] | WAITING | ExecutionStatus.RUNNING + initialWaitStatus | conditions | executionStatus + WAITING | [] | ExecutionStatus.SUCCEEDED + SKIPPED | [] | ExecutionStatus.SUCCEEDED + WAITING | [new Condition("n", "d")] | ExecutionStatus.RUNNING + SKIPPED | [new Condition("n", "d")] | ExecutionStatus.SUCCEEDED } } diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/config/OrcaConfiguration.java b/orca-core/src/main/java/com/netflix/spinnaker/orca/config/OrcaConfiguration.java index dcd8d4ae11..4767f71adc 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/config/OrcaConfiguration.java +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/config/OrcaConfiguration.java @@ -67,7 +67,6 @@ @Configuration @ComponentScan({ "com.netflix.spinnaker.orca.locks", - "com.netflix.spinnaker.orca.conditions", "com.netflix.spinnaker.orca.pipeline", "com.netflix.spinnaker.orca.deprecation", "com.netflix.spinnaker.orca.pipeline.util",