From 5dc392022d1e1cb30e5ac2f1c87e713ebdcc3861 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 23:34:10 -0800 Subject: [PATCH] fix(stageExecution): In evaluable variable stage restart scenario variables are not cleaned properly (#16) (backport #4307) (#4327) Co-authored-by: Oscar Michel Herrera --- .../orca/pipeline/EvaluateVariablesStage.java | 16 ++++++++++++ .../tasks/EvaluateVariablesStageSpec.groovy | 25 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/EvaluateVariablesStage.java b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/EvaluateVariablesStage.java index 827c1f552c..1949417799 100644 --- a/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/EvaluateVariablesStage.java +++ b/orca-core/src/main/java/com/netflix/spinnaker/orca/pipeline/EvaluateVariablesStage.java @@ -49,6 +49,22 @@ public void taskGraph(@Nonnull StageExecution stage, @Nonnull TaskNode.Builder b builder.withTask("evaluateVariables", EvaluateVariablesTask.class); } + @Override + public void prepareStageForRestart(@Nonnull StageExecution stage) { + stage.getOutputs().clear(); + EvaluateVariablesStageContext context = stage.mapTo(EvaluateVariablesStageContext.class); + + List variables = + Optional.ofNullable(context.getVariables()).orElse(Collections.emptyList()); + for (Variable var : variables) { + if (var.sourceExpression instanceof String) { + var.value = var.sourceExpression.toString().replace("{", "${"); + var.sourceExpression = null; + } + } + stage.getContext().put("variables", variables); + } + @Override public boolean processExpressions( @Nonnull StageExecution stage, diff --git a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateVariablesStageSpec.groovy b/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateVariablesStageSpec.groovy index 3d0eb9e584..4a6219c51f 100644 --- a/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateVariablesStageSpec.groovy +++ b/orca-core/src/test/groovy/com/netflix/spinnaker/orca/pipeline/tasks/EvaluateVariablesStageSpec.groovy @@ -81,4 +81,29 @@ class EvaluateVariablesStageSpec extends Specification { shouldContinue == false stage.context.notifications[0].address == "someone@somewhere.com" } + + void "Should correctly clean variables in restart scenario"() { + setup: + def summary = new ExpressionEvaluationSummary() + + def stage = stage { + refId = "1" + type = "evaluateVariables" + context["variables"] = [ + ["key": "status", "value": "expressionToEvaluate"], + ] + } + + when: + evaluateVariablesStage.processExpressions(stage, contextParameterProcessor, summary) + evaluateVariablesStage.prepareStageForRestart(stage) + def variables = stage.mapTo(EvaluateVariablesStage.EvaluateVariablesStageContext.class).getVariables() + def variablesCleaned = false + variables.each { + variablesCleaned = it.sourceExpression == null + } + + then: + variablesCleaned == true + } }