You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2023/03/24 11:44:34 UTC
[brooklyn-server] 04/08: allow configurable interpolation mode on more workflow steps - blueprints and commands
This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 26b1a9a0895f5fcc349e093bfd77604025b51aa5
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Fri Mar 24 08:43:22 2023 +0000
allow configurable interpolation mode on more workflow steps - blueprints and commands
---
.../steps/appmodel/AddEntityWorkflowStep.java | 24 +++----
.../steps/appmodel/AddPolicyWorkflowStep.java | 24 +++----
.../appmodel/ApplyInitializerWorkflowStep.java | 22 ++----
.../appmodel/DeployApplicationWorkflowStep.java | 25 +++----
.../steps/appmodel/HasBlueprintWorkflowStep.java | 78 ++++++++++++++++++++++
.../workflow/steps/external/SshWorkflowStep.java | 9 ++-
.../brooklyn/location/winrm/WinrmWorkflowStep.java | 8 ++-
7 files changed, 123 insertions(+), 67 deletions(-)
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddEntityWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddEntityWorkflowStep.java
index ce38235543..4713391a9f 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddEntityWorkflowStep.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddEntityWorkflowStep.java
@@ -42,9 +42,11 @@ import org.apache.brooklyn.core.workflow.WorkflowExecutionContext;
import org.apache.brooklyn.core.workflow.WorkflowStepDefinition;
import org.apache.brooklyn.core.workflow.WorkflowStepInstanceExecutionContext;
import org.apache.brooklyn.core.workflow.steps.appmodel.DeployApplicationWorkflowStep.StartMode;
+import org.apache.brooklyn.core.workflow.steps.variables.SetVariableWorkflowStep;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.core.text.TemplateProcessor;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.guava.Maybe;
import org.apache.brooklyn.util.text.Identifiers;
@@ -57,24 +59,21 @@ import javax.annotation.Nullable;
import java.util.List;
import java.util.Map;
-public class AddEntityWorkflowStep extends WorkflowStepDefinition {
+public class AddEntityWorkflowStep extends WorkflowStepDefinition implements HasBlueprintWorkflowStep {
private static final Logger LOG = LoggerFactory.getLogger(AddEntityWorkflowStep.class);
public static final String SHORTHAND = "[ ${type} ]";
- public static final ConfigKey<Object> BLUEPRINT = ConfigKeys.newConfigKey(Object.class, "blueprint");
- public static final ConfigKey<String> TYPE = ConfigKeys.newStringConfigKey("type");
public static final ConfigKey<String> FORMAT = ConfigKeys.newStringConfigKey("format");
// sync is not completely idempotent (in the call to start it) but very useful for testing;
// option not included in documentation, but used for tests
public static final ConfigKey<StartMode> START = ConfigKeys.newConfigKey(StartMode.class, "start", "Default 'async'");
- // don't try to instantiate 'type' here
- @JsonDeserialize(using = JsonPassThroughDeserializer.class)
- void setBlueprint(Object blueprint) {
- setInput(BLUEPRINT, blueprint);
+ @Override
+ public Logger logger() {
+ return LOG;
}
@Override
@@ -85,11 +84,7 @@ public class AddEntityWorkflowStep extends WorkflowStepDefinition {
@Override
public void validateStep(@Nullable ManagementContext mgmt, @Nullable WorkflowExecutionContext workflow) {
super.validateStep(mgmt, workflow);
-
- boolean hasBlueprint = getInput().containsKey(BLUEPRINT.getName());
- boolean hasType = getInput().containsKey(TYPE.getName());
- if (!hasBlueprint && !hasType) throw new IllegalArgumentException("A '"+BLUEPRINT.getName()+"' must be defined or a type supplied in shorthand");
- if (hasBlueprint && hasType) throw new IllegalArgumentException("Cannot provide both a '"+BLUEPRINT.getName()+"' and a type in shorthand");
+ validateStepBlueprint(mgmt, workflow);
}
@Override
@@ -102,10 +97,7 @@ public class AddEntityWorkflowStep extends WorkflowStepDefinition {
@Override
protected Object doTaskBody(WorkflowStepInstanceExecutionContext context) {
- Object blueprint = input.get(BLUEPRINT.getName());
- if (blueprint == null) {
- blueprint = "type: " + StringEscapes.JavaStringEscapes.wrapJavaString(context.getInput(TYPE));
- }
+ Object blueprint = resolveBlueprint(context);
List<String> preCreatedEntityIds = Maybe.ofDisallowingNull(getStepState(context)).map(MutableList::copyOf).orNull();
List<String> newCreatedEntityIds = MutableList.of();
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddPolicyWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddPolicyWorkflowStep.java
index 2ec1ab42eb..8995389c25 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddPolicyWorkflowStep.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/AddPolicyWorkflowStep.java
@@ -48,7 +48,7 @@ import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
-public class AddPolicyWorkflowStep extends WorkflowStepDefinition {
+public class AddPolicyWorkflowStep extends WorkflowStepDefinition implements HasBlueprintWorkflowStep {
private static final Logger LOG = LoggerFactory.getLogger(AddPolicyWorkflowStep.class);
@@ -60,24 +60,19 @@ public class AddPolicyWorkflowStep extends WorkflowStepDefinition {
public static final ConfigKey<Object> ENTITY = ConfigKeys.newConfigKey(Object.class, "entity");
@Override
- public void populateFromShorthand(String expression) {
- populateFromShorthandTemplate(SHORTHAND, expression);
+ public Logger logger() {
+ return LOG;
}
- // don't try to instantiate 'type' here
- @JsonDeserialize(using = JsonPassThroughDeserializer.class)
- void setBlueprint(Object blueprint) {
- setInput(BLUEPRINT, blueprint);
+ @Override
+ public void populateFromShorthand(String expression) {
+ populateFromShorthandTemplate(SHORTHAND, expression);
}
@Override
public void validateStep(@Nullable ManagementContext mgmt, @Nullable WorkflowExecutionContext workflow) {
super.validateStep(mgmt, workflow);
-
- boolean hasBlueprint = getInput().containsKey(BLUEPRINT.getName());
- boolean hasType = getInput().containsKey(TYPE.getName());
- if (!hasBlueprint && !hasType) throw new IllegalArgumentException("A '"+BLUEPRINT.getName()+"' must be defined or a type supplied in shorthand");
- if (hasBlueprint && hasType) throw new IllegalArgumentException("Cannot provide both a '"+BLUEPRINT.getName()+"' and a type in shorthand");
+ validateStepBlueprint(mgmt, workflow);
}
@Override
@@ -85,10 +80,7 @@ public class AddPolicyWorkflowStep extends WorkflowStepDefinition {
Object entityToFind = context.getInput(ENTITY);
Entity entity = entityToFind != null ? DeleteEntityWorkflowStep.findEntity(context, entityToFind).get() : context.getEntity();
- Object blueprint = input.get(BLUEPRINT.getName());
- if (blueprint == null) {
- blueprint = "type: " + StringEscapes.JavaStringEscapes.wrapJavaString(context.getInput(TYPE));
- }
+ Object blueprint = resolveBlueprint(context);
AbstractBrooklynObjectSpec spec = null;
EntityAdjunct inst = null;
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/ApplyInitializerWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/ApplyInitializerWorkflowStep.java
index 086233982d..14d825781c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/ApplyInitializerWorkflowStep.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/ApplyInitializerWorkflowStep.java
@@ -44,20 +44,17 @@ import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
-public class ApplyInitializerWorkflowStep extends WorkflowStepDefinition {
+public class ApplyInitializerWorkflowStep extends WorkflowStepDefinition implements HasBlueprintWorkflowStep {
private static final Logger LOG = LoggerFactory.getLogger(ApplyInitializerWorkflowStep.class);
public static final String SHORTHAND = "[ ${type} [ \" at \" ${entity} ] ]";
- public static final ConfigKey<Object> BLUEPRINT = ConfigKeys.newConfigKey(Object.class, "blueprint");
- public static final ConfigKey<String> TYPE = ConfigKeys.newStringConfigKey("type");
public static final ConfigKey<Object> ENTITY = ConfigKeys.newConfigKey(Object.class, "entity");
- // don't try to instantiate 'type' here
- @JsonDeserialize(using = JsonPassThroughDeserializer.class)
- void setBlueprint(Object blueprint) {
- setInput(BLUEPRINT, blueprint);
+ @Override
+ public Logger logger() {
+ return LOG;
}
@Override
@@ -68,11 +65,7 @@ public class ApplyInitializerWorkflowStep extends WorkflowStepDefinition {
@Override
public void validateStep(@Nullable ManagementContext mgmt, @Nullable WorkflowExecutionContext workflow) {
super.validateStep(mgmt, workflow);
-
- boolean hasBlueprint = getInput().containsKey(BLUEPRINT.getName());
- boolean hasType = getInput().containsKey(TYPE.getName());
- if (!hasBlueprint && !hasType) throw new IllegalArgumentException("A '"+BLUEPRINT.getName()+"' must be defined or a type supplied in shorthand");
- if (hasBlueprint && hasType) throw new IllegalArgumentException("Cannot provide both a '"+BLUEPRINT.getName()+"' and a type in shorthand");
+ validateStepBlueprint(mgmt, workflow);
}
@Override
@@ -80,10 +73,7 @@ public class ApplyInitializerWorkflowStep extends WorkflowStepDefinition {
Object entityToFind = context.getInput(ENTITY);
Entity entity = entityToFind != null ? DeleteEntityWorkflowStep.findEntity(context, entityToFind).get() : context.getEntity();
- Object blueprint = input.get(BLUEPRINT.getName());
- if (blueprint == null) {
- blueprint = "type: " + StringEscapes.JavaStringEscapes.wrapJavaString(context.getInput(TYPE));
- }
+ Object blueprint = resolveBlueprint(context);
EntityInitializer initializer;
try {
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/DeployApplicationWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/DeployApplicationWorkflowStep.java
index da018209ae..a065534071 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/DeployApplicationWorkflowStep.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/DeployApplicationWorkflowStep.java
@@ -42,14 +42,12 @@ import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
-public class DeployApplicationWorkflowStep extends WorkflowStepDefinition {
+public class DeployApplicationWorkflowStep extends WorkflowStepDefinition implements HasBlueprintWorkflowStep {
private static final Logger LOG = LoggerFactory.getLogger(DeployApplicationWorkflowStep.class);
public static final String SHORTHAND = "[ ${type} ]";
- public static final ConfigKey<Object> BLUEPRINT = ConfigKeys.newConfigKey(Object.class, "blueprint");
- public static final ConfigKey<String> TYPE = ConfigKeys.newStringConfigKey("type");
public static final ConfigKey<String> FORMAT = ConfigKeys.newStringConfigKey("format");
// sync is not completely idempotent (in the call to start it) but very useful for testing;
@@ -61,24 +59,19 @@ public class DeployApplicationWorkflowStep extends WorkflowStepDefinition {
}
@Override
- public void populateFromShorthand(String expression) {
- populateFromShorthandTemplate(SHORTHAND, expression);
+ public Logger logger() {
+ return LOG;
}
- // don't try to instantiate 'type' here
- @JsonDeserialize(using = JsonPassThroughDeserializer.class)
- void setBlueprint(Object blueprint) {
- setInput(BLUEPRINT, blueprint);
+ @Override
+ public void populateFromShorthand(String expression) {
+ populateFromShorthandTemplate(SHORTHAND, expression);
}
@Override
public void validateStep(@Nullable ManagementContext mgmt, @Nullable WorkflowExecutionContext workflow) {
super.validateStep(mgmt, workflow);
-
- boolean hasBlueprint = getInput().containsKey(BLUEPRINT.getName());
- boolean hasType = getInput().containsKey(TYPE.getName());
- if (!hasBlueprint && !hasType) throw new IllegalArgumentException("A '"+BLUEPRINT.getName()+"' must be defined or a type supplied in shorthand");
- if (hasBlueprint && hasType) throw new IllegalArgumentException("Cannot provide both a '"+BLUEPRINT.getName()+"' and a type in shorthand");
+ validateStepBlueprint(mgmt, workflow);
}
@Override
@@ -91,9 +84,7 @@ public class DeployApplicationWorkflowStep extends WorkflowStepDefinition {
@Override
protected Object doTaskBody(WorkflowStepInstanceExecutionContext context) {
- Object blueprint = context.getInput(BLUEPRINT);
- if (blueprint == null)
- blueprint = "services: [ { type: " + StringEscapes.JavaStringEscapes.wrapJavaString(context.getInput(TYPE)) + " } ]";
+ Object blueprint = resolveBlueprint(context, () -> "services: [ { type: " + StringEscapes.JavaStringEscapes.wrapJavaString(context.getInput(TYPE)) + " } ]");
String createdAppId = getStepState(context);
Application app = null;
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/HasBlueprintWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/HasBlueprintWorkflowStep.java
new file mode 100644
index 0000000000..4a7d0a8547
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/appmodel/HasBlueprintWorkflowStep.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.workflow.steps.appmodel;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.resolve.jackson.JsonPassThroughDeserializer;
+import org.apache.brooklyn.core.workflow.WorkflowExecutionContext;
+import org.apache.brooklyn.core.workflow.WorkflowStepInstanceExecutionContext;
+import org.apache.brooklyn.core.workflow.steps.variables.SetVariableWorkflowStep;
+import org.apache.brooklyn.util.core.text.TemplateProcessor;
+import org.apache.brooklyn.util.text.StringEscapes;
+import org.slf4j.Logger;
+
+import javax.annotation.Nullable;
+import java.util.Map;
+import java.util.function.Supplier;
+
+public interface HasBlueprintWorkflowStep {
+
+ ConfigKey<Object> BLUEPRINT = ConfigKeys.newConfigKey(Object.class, "blueprint");
+ ConfigKey<String> TYPE = ConfigKeys.newStringConfigKey("type");
+
+ ConfigKey<SetVariableWorkflowStep.InterpolationMode> INTERPOLATION_MODE = ConfigKeys.newConfigKeyWithDefault(SetVariableWorkflowStep.INTERPOLATION_MODE, SetVariableWorkflowStep.InterpolationMode.FULL);
+ ConfigKey<TemplateProcessor.InterpolationErrorMode> INTERPOLATION_ERRORS = ConfigKeys.newConfigKeyWithDefault(SetVariableWorkflowStep.INTERPOLATION_ERRORS, TemplateProcessor.InterpolationErrorMode.IGNORE);
+
+ Map<String, Object> getInput();
+ Logger logger();
+
+ default void validateStepBlueprint(@Nullable ManagementContext mgmt, @Nullable WorkflowExecutionContext workflow) {
+ boolean hasBlueprint = getInput().containsKey(BLUEPRINT.getName());
+ boolean hasType = getInput().containsKey(TYPE.getName());
+ if (!hasBlueprint && !hasType) throw new IllegalArgumentException("A '"+BLUEPRINT.getName()+"' must be defined or a type supplied");
+ if (hasBlueprint && hasType) throw new IllegalArgumentException("Cannot provide both a '"+BLUEPRINT.getName()+"' and a '"+TYPE.getName()+"'");
+ }
+
+ default Object resolveBlueprint(WorkflowStepInstanceExecutionContext context) {
+ return resolveBlueprint(context, () -> "type: " + StringEscapes.JavaStringEscapes.wrapJavaString(context.getInput(TYPE)));
+ }
+ default Object resolveBlueprint(WorkflowStepInstanceExecutionContext context, Supplier<String> defaultValue) {
+ Object blueprint = getInput().get(BLUEPRINT.getName());
+ if (blueprint == null) {
+ return defaultValue.get();
+ }
+ logger().debug("Blueprint (pre-resolution) is: "+blueprint);
+ Object result = new SetVariableWorkflowStep.ConfigurableInterpolationEvaluation(context, null, blueprint,
+ context.getInputOrDefault(INTERPOLATION_MODE), context.getInputOrDefault(INTERPOLATION_ERRORS)).evaluate();
+ logger().debug("Blueprint (post-resolution: "+context.getInputOrDefault(INTERPOLATION_MODE)+"/"+context.getInputOrDefault(INTERPOLATION_ERRORS)+") is: "+result);
+ return result;
+ }
+
+ <T> void setInput(ConfigKey<T> key, T value);
+
+ // don't try to instantiate 'type' here
+ @JsonDeserialize(using = JsonPassThroughDeserializer.class)
+ default void setBlueprint(Object blueprint) {
+ setInput(BLUEPRINT, blueprint);
+ }
+
+}
diff --git a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
index 9a0d7c5092..1e08d59e6e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
+++ b/core/src/main/java/org/apache/brooklyn/core/workflow/steps/external/SshWorkflowStep.java
@@ -25,6 +25,7 @@ import org.apache.brooklyn.core.config.MapConfigKey;
import org.apache.brooklyn.core.location.Locations;
import org.apache.brooklyn.core.workflow.WorkflowStepDefinition;
import org.apache.brooklyn.core.workflow.WorkflowStepInstanceExecutionContext;
+import org.apache.brooklyn.core.workflow.steps.variables.SetVariableWorkflowStep;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.json.ShellEnvironmentSerializer;
@@ -33,6 +34,7 @@ import org.apache.brooklyn.util.core.task.DynamicTasks;
import org.apache.brooklyn.util.core.task.ssh.SshTasks;
import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
+import org.apache.brooklyn.util.core.text.TemplateProcessor;
import org.apache.brooklyn.util.text.Strings;
import org.apache.brooklyn.util.time.Duration;
@@ -50,6 +52,9 @@ public class SshWorkflowStep extends WorkflowStepDefinition {
public static final ConfigKey<DslPredicates.DslPredicate<Integer>> EXIT_CODE = ConfigKeys.newConfigKey(new TypeToken<DslPredicates.DslPredicate<Integer>>() {}, "exit_code");
public static final ConfigKey<Integer> OUTPUT_MAX_SIZE = ConfigKeys.newIntegerConfigKey("output_max_size", "Maximum size for stdout and stderr, or -1 for no limit", 100000);
+ ConfigKey<SetVariableWorkflowStep.InterpolationMode> INTERPOLATION_MODE = ConfigKeys.newConfigKeyWithDefault(SetVariableWorkflowStep.INTERPOLATION_MODE, SetVariableWorkflowStep.InterpolationMode.FULL);
+ ConfigKey<TemplateProcessor.InterpolationErrorMode> INTERPOLATION_ERRORS = ConfigKeys.newConfigKeyWithDefault(SetVariableWorkflowStep.INTERPOLATION_ERRORS, TemplateProcessor.InterpolationErrorMode.IGNORE);
+
@Override
public void populateFromShorthand(String expression) {
populateFromShorthandTemplate(SHORTHAND, expression);
@@ -57,7 +62,9 @@ public class SshWorkflowStep extends WorkflowStepDefinition {
@Override
protected Object doTaskBody(WorkflowStepInstanceExecutionContext context) {
- String command = context.getInput(COMMAND);
+ String command = new SetVariableWorkflowStep.ConfigurableInterpolationEvaluation<>(context, TypeToken.of(String.class), getInput().get(COMMAND.getName()),
+ context.getInputOrDefault(INTERPOLATION_MODE), context.getInputOrDefault(INTERPOLATION_ERRORS)).evaluate();
+
if (Strings.isBlank(command)) throw new IllegalStateException("'command' is required");
SshMachineLocation machine;
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinrmWorkflowStep.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinrmWorkflowStep.java
index ec93d75a27..26e05d8737 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinrmWorkflowStep.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinrmWorkflowStep.java
@@ -26,12 +26,14 @@ import org.apache.brooklyn.core.location.Machines;
import org.apache.brooklyn.core.workflow.WorkflowStepDefinition;
import org.apache.brooklyn.core.workflow.WorkflowStepInstanceExecutionContext;
import org.apache.brooklyn.core.workflow.steps.external.SshWorkflowStep;
+import org.apache.brooklyn.core.workflow.steps.variables.SetVariableWorkflowStep;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.json.ShellEnvironmentSerializer;
import org.apache.brooklyn.util.core.predicates.DslPredicates;
import org.apache.brooklyn.util.core.task.DynamicTasks;
import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
+import org.apache.brooklyn.util.core.text.TemplateProcessor;
import org.apache.brooklyn.util.text.Strings;
import java.util.Map;
@@ -46,6 +48,9 @@ public class WinrmWorkflowStep extends WorkflowStepDefinition {
public static final ConfigKey<DslPredicates.DslPredicate<Integer>> EXIT_CODE = ConfigKeys.newConfigKey(new TypeToken<DslPredicates.DslPredicate<Integer>>() {}, "exit_code");
public static final ConfigKey<Integer> OUTPUT_MAX_SIZE = ConfigKeys.newIntegerConfigKey("output_max_size", "Maximum size for stdout and stderr, or -1 for no limit", 100000);
+ ConfigKey<SetVariableWorkflowStep.InterpolationMode> INTERPOLATION_MODE = ConfigKeys.newConfigKeyWithDefault(SetVariableWorkflowStep.INTERPOLATION_MODE, SetVariableWorkflowStep.InterpolationMode.FULL);
+ ConfigKey<TemplateProcessor.InterpolationErrorMode> INTERPOLATION_ERRORS = ConfigKeys.newConfigKeyWithDefault(SetVariableWorkflowStep.INTERPOLATION_ERRORS, TemplateProcessor.InterpolationErrorMode.IGNORE);
+
@Override
public void populateFromShorthand(String expression) {
populateFromShorthandTemplate(SHORTHAND, expression);
@@ -53,7 +58,8 @@ public class WinrmWorkflowStep extends WorkflowStepDefinition {
@Override
protected Object doTaskBody(WorkflowStepInstanceExecutionContext context) {
- String command = context.getInput(COMMAND);
+ String command = new SetVariableWorkflowStep.ConfigurableInterpolationEvaluation<>(context, TypeToken.of(String.class), getInput().get(COMMAND.getName()),
+ context.getInputOrDefault(INTERPOLATION_MODE), context.getInputOrDefault(INTERPOLATION_ERRORS)).evaluate();
if (Strings.isBlank(command)) throw new IllegalStateException("'command' is required");
WinRmMachineLocation machine;