Repository: incubator-brooklyn Updated Branches: refs/heads/master b4547d95c -> f0b755f41
Add stdOut and stdErr to WinRmDriver Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/cda8935d Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/cda8935d Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/cda8935d Branch: refs/heads/master Commit: cda8935d5e4f06c86074b262e64f74fea22eb7cc Parents: 6fe9fc7 Author: Valentin Aitken <[email protected]> Authored: Thu Aug 20 00:05:23 2015 +0300 Committer: Valentin Aitken <[email protected]> Committed: Fri Aug 28 10:52:39 2015 +0300 ---------------------------------------------------------------------- .../AbstractSoftwareProcessWinRmDriver.java | 73 +++++++++++++++----- 1 file changed, 56 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/cda8935d/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java index 3965f4a..f5d441d 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java @@ -18,29 +18,35 @@ */ package org.apache.brooklyn.entity.software.base; -import java.io.File; -import java.io.InputStream; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; - +import com.google.common.collect.ImmutableList; +import io.cloudsoft.winrm4j.winrm.WinRmToolResponse; import org.apache.brooklyn.api.entity.EntityLocal; +import org.apache.brooklyn.api.mgmt.Task; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.config.ConfigKey; +import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; import org.apache.brooklyn.core.sensor.Sensors; -import org.python.core.PyException; import org.apache.brooklyn.location.winrm.WinRmMachineLocation; +import org.apache.brooklyn.util.core.task.Tasks; import org.apache.brooklyn.util.exceptions.ReferenceWithError; import org.apache.brooklyn.util.repeat.Repeater; +import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.Duration; +import org.python.core.PyException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import io.cloudsoft.winrm4j.winrm.WinRmToolResponse; - -import com.google.api.client.util.Strings; -import com.google.common.collect.ImmutableList; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; public abstract class AbstractSoftwareProcessWinRmDriver extends AbstractSoftwareProcessDriver { + private static final Logger LOG = LoggerFactory.getLogger(AbstractSoftwareProcessDriver.class); AttributeSensor<String> WINDOWS_USERNAME = Sensors.newStringSensor("windows.username", "Default Windows username to be used when connecting to the Entity's VM"); @@ -119,20 +125,53 @@ public abstract class AbstractSoftwareProcessWinRmDriver extends AbstractSoftwar protected WinRmToolResponse executeCommand(ConfigKey<String> regularCommandKey, ConfigKey<String> powershellCommandKey, boolean allowNoOp) { String regularCommand = getEntity().getConfig(regularCommandKey); String powershellCommand = getEntity().getConfig(powershellCommandKey); - if (Strings.isNullOrEmpty(regularCommand) && Strings.isNullOrEmpty(powershellCommand)) { + if (Strings.isBlank(regularCommand) && Strings.isBlank(powershellCommand)) { if (allowNoOp) { return new WinRmToolResponse("", "", 0); } else { throw new IllegalStateException(String.format("Exactly one of %s or %s must be set", regularCommandKey.getName(), powershellCommandKey.getName())); } - } else if (!Strings.isNullOrEmpty(regularCommand) && !Strings.isNullOrEmpty(powershellCommand)) { + } else if (!Strings.isBlank(regularCommand) && !Strings.isBlank(powershellCommand)) { throw new IllegalStateException(String.format("%s and %s cannot both be set", regularCommandKey.getName(), powershellCommandKey.getName())); } - if (Strings.isNullOrEmpty(regularCommand)) { - return getLocation().executePsScript(ImmutableList.of(powershellCommand)); + ByteArrayOutputStream stdIn = new ByteArrayOutputStream(); + ByteArrayOutputStream stdOut = new ByteArrayOutputStream(); + ByteArrayOutputStream stdErr = new ByteArrayOutputStream(); + + Task<?> currentTask = Tasks.current(); + if (currentTask != null) { + writeToStream(stdIn, Strings.isBlank(regularCommand) ? powershellCommand : regularCommand); + Tasks.addTagDynamically(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDIN, stdIn)); + + if (BrooklynTaskTags.stream(currentTask, BrooklynTaskTags.STREAM_STDOUT)==null) { + Tasks.addTagDynamically(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDOUT, stdOut)); + Tasks.addTagDynamically(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDERR, stdErr)); + } + } + + WinRmToolResponse response; + if (Strings.isBlank(regularCommand)) { + response = getLocation().executePsScript(ImmutableList.of(powershellCommand)); } else { - return getLocation().executeScript(ImmutableList.of(regularCommand)); + response = getLocation().executeScript(ImmutableList.of(regularCommand)); + } + + if (currentTask != null) { + if (BrooklynTaskTags.stream(currentTask, BrooklynTaskTags.STREAM_STDOUT)==null) { + writeToStream(stdOut, response.getStdOut()); + writeToStream(stdErr, response.getStdErr()); + } + } + + return response; + } + + private void writeToStream(ByteArrayOutputStream stream, String string) { + try { + stream.write(string.getBytes()); + } catch (IOException e) { + LOG.warn("Problem populating one of the std streams for task of entity " + getEntity(), e); } }
