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 2020/11/13 15:06:06 UTC

[brooklyn-server] branch master updated (a64ab7b -> 867fe7d)

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git.


    from a64ab7b  add an extra maybe method
     add 9fc8476  First draft taskfactory
     add 1d152cf  Better? Outputstream handling
     new 3b56db7  installTo for winrm supports urls
     new 5653ff6  Merge remote-tracking branch 'upstream/master' into winrmtaskfactory
     new a7704d0  Buffer the text stream from winrm4j
     new 2af8527  Update to latest winrm latest
     new 867fe7d  This closes #1124

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../brooklyn/api/location/MachineLocation.java     |  7 ++
 .../core/effector/ssh/SshEffectorTasks.java        |  3 +-
 .../brooklyn/location/ssh/SshMachineLocation.java  | 11 +--
 .../ssh/internal/AbstractSshExecTaskFactory.java   |  3 +-
 .../util/core/task/system/ProcessTaskFactory.java  |  3 +-
 .../util/core/task/system/ProcessTaskStub.java     |  5 +-
 .../internal/AbstractProcessTaskFactory.java       |  3 +-
 .../system/internal/SystemProcessTaskFactory.java  |  3 +-
 .../brooklyn/core/location/SimulatedLocation.java  | 18 ++++-
 pom.xml                                            |  2 +-
 .../location/winrm/PlainWinRmExecTaskFactory.java  | 47 ++++++------
 .../location/winrm/WinRmMachineLocation.java       | 72 +++++++++++++++----
 .../location/winrm/WinRmPutTaskFactory.java        | 69 +++++++++---------
 .../brooklyn/location/winrm/WinRmPutTaskStub.java  | 25 ++++---
 .../location/winrm/WinRmPutTaskWrapper.java        | 84 +++++++++++-----------
 .../apache/brooklyn/location/winrm/WinRmTasks.java | 57 +++++++++++++++
 .../util/core/internal/winrm/WinRmTool.java        |  2 +-
 .../core/internal/winrm/winrm4j/Winrm4jTool.java   | 35 +++++----
 18 files changed, 292 insertions(+), 157 deletions(-)
 copy core/src/main/java/org/apache/brooklyn/util/core/task/ssh/internal/PlainSshExecTaskFactory.java => software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRmExecTaskFactory.java (53%)
 copy core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskFactory.java => software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskFactory.java (65%)
 copy core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskStub.java => software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskStub.java (85%)
 copy core/src/main/java/org/apache/brooklyn/util/core/task/ssh/SshPutTaskWrapper.java => software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskWrapper.java (74%)
 create mode 100644 software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmTasks.java


[brooklyn-server] 01/05: installTo for winrm supports urls

Posted by he...@apache.org.
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 3b56db700b251150e02345bb3e8f24f9fc447b1e
Author: Duncan Grant <du...@cloudsoft.io>
AuthorDate: Tue Nov 10 08:19:49 2020 +0000

    installTo for winrm supports urls
---
 .../brooklyn/api/location/MachineLocation.java     |  12 --
 .../brooklyn/location/ssh/SshMachineLocation.java  |   6 -
 .../brooklyn/core/location/SimulatedLocation.java  |  30 ----
 pom.xml                                            |   2 +-
 ...Factory.java => PlainWinRmExecTaskFactory.java} |  26 +--
 .../location/winrm/WinRmMachineLocation.java       |  43 +----
 .../location/winrm/WinRmPutTaskFactory.java        | 120 +++++++++++++
 .../brooklyn/location/winrm/WinRmPutTaskStub.java  |  68 ++++++++
 .../location/winrm/WinRmPutTaskWrapper.java        | 185 +++++++++++++++++++++
 .../winrm/{WinRMTasks.java => WinRmTasks.java}     |  13 +-
 .../core/internal/winrm/winrm4j/Winrm4jTool.java   |  45 ++---
 11 files changed, 421 insertions(+), 129 deletions(-)

diff --git a/api/src/main/java/org/apache/brooklyn/api/location/MachineLocation.java b/api/src/main/java/org/apache/brooklyn/api/location/MachineLocation.java
index 508c5d4..d207886 100644
--- a/api/src/main/java/org/apache/brooklyn/api/location/MachineLocation.java
+++ b/api/src/main/java/org/apache/brooklyn/api/location/MachineLocation.java
@@ -48,19 +48,7 @@ public interface MachineLocation extends AddressableLocation, HasNetworkAddresse
 
     String getUser();
 
-    int execCommands(String summaryForLogging, List<String> commands);
-
-    int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands);
-
-    int execCommands(String summaryForLogging, List<String> commands, Map<String, ?> env);
-
     int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands, Map<String, ?> env);
 
-    int execScript(String summaryForLogging, List<String> commands);
-
-    int execScript(Map<String, ?> props, String summaryForLogging, List<String> commands);
-
-    int execScript(String summaryForLogging, List<String> commands, Map<String, ?> env);
-
     int execScript(Map<String, ?> props, String summaryForLogging, List<String> commands, Map<String, ?> env);
 }
diff --git a/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java b/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java
index 14df87d..d5ed481 100644
--- a/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java
+++ b/core/src/main/java/org/apache/brooklyn/location/ssh/SshMachineLocation.java
@@ -699,15 +699,12 @@ public class SshMachineLocation extends AbstractMachineLocation implements Machi
      * and/or {@code commandPrepend} and {@code commandAppend} similar to
      * (currently supported in SshjTool) {@code separator}.)
      */
-    @Override
     public int execCommands(String summaryForLogging, List<String> commands) {
         return execCommands(MutableMap.<String,Object>of(), summaryForLogging, commands, MutableMap.<String,Object>of());
     }
-    @Override
     public int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands) {
         return execCommands(props, summaryForLogging, commands, MutableMap.<String,Object>of());
     }
-    @Override
     public int execCommands(String summaryForLogging, List<String> commands, Map<String, ?> env) {
         return execCommands(MutableMap.<String,Object>of(), summaryForLogging, commands, env);
     }
@@ -723,15 +720,12 @@ public class SshMachineLocation extends AbstractMachineLocation implements Machi
      * flags 'noStdoutLogging' and 'noStderrLogging' are set. To set a logging prefix, use
      * the flag 'logPrefix'.
      */
-    @Override
     public int execScript(String summaryForLogging, List<String> commands) {
         return execScript(MutableMap.<String,Object>of(), summaryForLogging, commands, MutableMap.<String,Object>of());
     }
-    @Override
     public int execScript(Map<String,?> props, String summaryForLogging, List<String> commands) {
         return execScript(props, summaryForLogging, commands, MutableMap.<String,Object>of());
     }
-    @Override
     public int execScript(String summaryForLogging, List<String> commands, Map<String,?> env) {
         return execScript(MutableMap.<String,Object>of(), summaryForLogging, commands, env);
     }
diff --git a/core/src/test/java/org/apache/brooklyn/core/location/SimulatedLocation.java b/core/src/test/java/org/apache/brooklyn/core/location/SimulatedLocation.java
index 41be3f5..83faa97 100644
--- a/core/src/test/java/org/apache/brooklyn/core/location/SimulatedLocation.java
+++ b/core/src/test/java/org/apache/brooklyn/core/location/SimulatedLocation.java
@@ -170,41 +170,11 @@ public class SimulatedLocation extends AbstractLocation implements MachineProvis
     }
 
     @Override
-    public int execCommands(String summaryForLogging, List<String> commands) {
-        return 0;
-    }
-
-    @Override
-    public int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands) {
-        return 0;
-    }
-
-    @Override
-    public int execCommands(String summaryForLogging, List<String> commands, Map<String, ?> env) {
-        return 0;
-    }
-
-    @Override
     public int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands, Map<String, ?> env) {
         return 0;
     }
 
     @Override
-    public int execScript(String summaryForLogging, List<String> commands) {
-        return 0;
-    }
-
-    @Override
-    public int execScript(Map<String, ?> props, String summaryForLogging, List<String> commands) {
-        return 0;
-    }
-
-    @Override
-    public int execScript(String summaryForLogging, List<String> commands, Map<String, ?> env) {
-        return 0;
-    }
-
-    @Override
     public int execScript(Map<String, ?> props, String summaryForLogging, List<String> commands, Map<String, ?> env) {
         return 0;
     }
diff --git a/pom.xml b/pom.xml
index 1c56a1a..572103e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,7 +164,7 @@
         <jax-rs-api.version>2.1.1</jax-rs-api.version> <!-- differs from jclouds 2.1.2, which depends on v2.0.1 -->
         <maxmind.version>2.8.0-rc1</maxmind.version>
         <maxmind-db.version>1.2.1</maxmind-db.version>
-        <winrm4j.version>0.9.0-SNAPSHOT</winrm4j.version> <!--  FIXME NO CHECK IN -->
+        <winrm4j.version>0.10.0-SNAPSHOT</winrm4j.version> <!--  FIXME NO CHECK IN -->
         <felix-osgi-compendium.version>1.4.0</felix-osgi-compendium.version>
         <kubernetes-client.version>4.9.0</kubernetes-client.version>
 
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRMExecTaskFactory.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRmExecTaskFactory.java
similarity index 70%
rename from software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRMExecTaskFactory.java
rename to software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRmExecTaskFactory.java
index 0fa344e..0fa3baf 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRMExecTaskFactory.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/PlainWinRmExecTaskFactory.java
@@ -25,47 +25,47 @@ import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
 
 import java.util.List;
 
-public class PlainWinRMExecTaskFactory<RET> extends AbstractSshExecTaskFactory<PlainSshExecTaskFactory<RET>,RET> {
+public class PlainWinRmExecTaskFactory<RET> extends AbstractSshExecTaskFactory<PlainSshExecTaskFactory<RET>,RET> {
 
     /** constructor where machine will be added later */
-    public PlainWinRMExecTaskFactory(String ...commands) {
+    public PlainWinRmExecTaskFactory(String ...commands) {
         super(commands);
     }
 
     /** convenience constructor to supply machine immediately */
-    public PlainWinRMExecTaskFactory(WinRmMachineLocation machine, String ...commands) {
+    public PlainWinRmExecTaskFactory(WinRmMachineLocation machine, String ...commands) {
         this(commands);
         machine(machine);
     }
 
     /** Constructor where machine will be added later */
-    public PlainWinRMExecTaskFactory(List<String> commands) {
+    public PlainWinRmExecTaskFactory(List<String> commands) {
         this(commands.toArray(new String[commands.size()]));
     }
 
     /** Convenience constructor to supply machine immediately */
-    public PlainWinRMExecTaskFactory(WinRmMachineLocation machine, List<String> commands) {
+    public PlainWinRmExecTaskFactory(WinRmMachineLocation machine, List<String> commands) {
         this(machine, commands.toArray(new String[commands.size()]));
     }
 
     @Override
-    public <T2> PlainWinRMExecTaskFactory<T2> returning(ScriptReturnType type) {
-        return (PlainWinRMExecTaskFactory<T2>) super.<T2>returning(type);
+    public <T2> PlainWinRmExecTaskFactory<T2> returning(ScriptReturnType type) {
+        return (PlainWinRmExecTaskFactory<T2>) super.<T2>returning(type);
     }
 
     @Override
-    public <RET2> PlainWinRMExecTaskFactory<RET2> returning(Function<ProcessTaskWrapper<?>, RET2> resultTransformation) {
-        return (PlainWinRMExecTaskFactory<RET2>) super.returning(resultTransformation);
+    public <RET2> PlainWinRmExecTaskFactory<RET2> returning(Function<ProcessTaskWrapper<?>, RET2> resultTransformation) {
+        return (PlainWinRmExecTaskFactory<RET2>) super.returning(resultTransformation);
     }
 
     @Override
-    public PlainWinRMExecTaskFactory<Boolean> returningIsExitCodeZero() {
-        return (PlainWinRMExecTaskFactory<Boolean>) super.returningIsExitCodeZero();
+    public PlainWinRmExecTaskFactory<Boolean> returningIsExitCodeZero() {
+        return (PlainWinRmExecTaskFactory<Boolean>) super.returningIsExitCodeZero();
     }
 
     @Override
-    public PlainWinRMExecTaskFactory<String> requiringZeroAndReturningStdout() {
-        return (PlainWinRMExecTaskFactory<String>) super.requiringZeroAndReturningStdout();
+    public PlainWinRmExecTaskFactory<String> requiringZeroAndReturningStdout() {
+        return (PlainWinRmExecTaskFactory<String>) super.requiringZeroAndReturningStdout();
     }
 }
 
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
index 1198697..efc0cb6 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
@@ -205,42 +205,12 @@ public class WinRmMachineLocation extends AbstractMachineLocation implements Mac
     }
 
     @Override
-    public int execCommands(String summaryForLogging, List<String> commands) {
-        return executeCommand(commands).getStatusCode();
-    }
-
-    @Override
-    public int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands) {
-        return executeCommand(props, commands).getStatusCode();
-    }
-
-    @Override
-    public int execCommands(String summaryForLogging, List<String> commands, Map<String, ?> env) {
-        return executeCommand(ImmutableMap.of(Winrm4jTool.ENVIRONMENT, env),commands).getStatusCode();
-    }
-
-    @Override
     public int execCommands(Map<String, ?> props, String summaryForLogging, List<String> commands, Map<String, ?> env) {
         ImmutableMap<Object, Object> properties = ImmutableMap.builder().putAll(props).put(Winrm4jTool.ENVIRONMENT, env).build();
         return executeCommand(properties, commands).getStatusCode();
     }
 
     @Override
-    public int execScript(String summaryForLogging, List<String> commands) {
-        return executePsScript(commands).getStatusCode();
-    }
-
-    @Override
-    public int execScript(Map<String, ?> props, String summaryForLogging, List<String> commands) {
-        return executePsScript(props, commands).getStatusCode();
-    }
-
-    @Override
-    public int execScript(String summaryForLogging, List<String> commands, Map<String, ?> env) {
-        return executePsScript(ImmutableMap.of(Winrm4jTool.ENVIRONMENT,env), commands).getStatusCode();
-    }
-
-    @Override
     public int execScript(Map<String, ?> props, String summaryForLogging, List<String> commands, Map<String, ?> env) {
         ImmutableMap<Object, Object> properties = ImmutableMap.builder().putAll(props).put(Winrm4jTool.ENVIRONMENT, env).build();
         return executePsScript(properties, commands).getStatusCode();
@@ -556,12 +526,13 @@ public class WinRmMachineLocation extends AbstractMachineLocation implements Mac
             sgsO.setLogPrefix("[curl @ "+getAddress()+":stdout] ").start();
             sgsE.setLogPrefix("[curl @ "+getAddress()+":stderr] ").start();
             Map<String, ?> winrmProps = MutableMap.<String, Object>builder().putAll(props).put("out", outO).put("err", outE).build();
-//            int result = execScript(winrmProps,"",ImmutableList.of(
-//                    "$WebClient = New-Object System.Net.WebClient",
-//                    "$WebClient.DownloadFile(" + url + "," + destPath + ")"
-//            ));
-
-            int result = 1;
+            ImmutableList<String> commands = ImmutableList.of(
+                    "$tmp = New-TemporaryFile",
+                    "echo $WebClient = New-Object System.Net.WebClient > $tmp.FullName",
+                    "echo $WebClient.DownloadFile(" + url + "," + destPath + ") >> $tmp.FullName",
+                    "powershell -c $tmp.FullName"
+            );
+            int result = execCommands(winrmProps,"", commands, ImmutableMap.of());
 
             if (result != 0) {
                 LOG.debug("installing {} to {} on {}, curl failed, attempting local fetch and copy", new Object[] { url, destPath, this });
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskFactory.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskFactory.java
new file mode 100644
index 0000000..23081bc
--- /dev/null
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskFactory.java
@@ -0,0 +1,120 @@
+/*
+ * 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.location.winrm;
+
+import com.google.common.base.Suppliers;
+import org.apache.brooklyn.api.mgmt.TaskFactory;
+import org.apache.brooklyn.util.stream.KnownSizeInputStream;
+import org.apache.brooklyn.util.stream.ReaderInputStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InputStream;
+import java.io.Reader;
+
+public class WinRmPutTaskFactory extends WinRmPutTaskStub implements TaskFactory<WinRmPutTaskWrapper> {
+
+    private static final Logger log = LoggerFactory.getLogger(WinRmPutTaskFactory.class);
+
+    private boolean dirty = false;
+
+    /** constructor where machine will be added later */
+    public WinRmPutTaskFactory(String remoteFile) {
+        remoteFile(remoteFile);
+    }
+
+    /** convenience constructor to supply machine immediately */
+    public WinRmPutTaskFactory(WinRmMachineLocation machine, String remoteFile) {
+        machine(machine);
+        remoteFile(remoteFile);
+    }
+
+    protected WinRmPutTaskFactory self() { return this; }
+
+    protected void markDirty() {
+        dirty = true;
+    }
+
+    public WinRmPutTaskFactory machine(WinRmMachineLocation machine) {
+        markDirty();
+        this.machine = machine;
+        return self();
+    }
+
+    public WinRmPutTaskFactory remoteFile(String remoteFile) {
+        this.remoteFile = remoteFile;
+        return self();
+    }
+
+    public WinRmPutTaskFactory summary(String summary) {
+        markDirty();
+        this.summary = summary;
+        return self();
+    }
+
+    public WinRmPutTaskFactory contents(String contents) {
+        markDirty();
+        this.contents = Suppliers.ofInstance(KnownSizeInputStream.of(contents));
+        return self();
+    }
+
+    public WinRmPutTaskFactory contents(byte[] contents) {
+        markDirty();
+        this.contents = Suppliers.ofInstance(KnownSizeInputStream.of(contents));
+        return self();
+    }
+
+    public WinRmPutTaskFactory contents(InputStream stream) {
+        markDirty();
+        this.contents = Suppliers.ofInstance(stream);
+        return self();
+    }
+
+    public WinRmPutTaskFactory contents(Reader reader) {
+        markDirty();
+        this.contents = Suppliers.ofInstance(new ReaderInputStream(reader));
+        return self();
+    }
+
+    public WinRmPutTaskFactory allowFailure() {
+        markDirty();
+        allowFailure = true;
+        return self();
+    }
+
+    public WinRmPutTaskFactory createDirectory() {
+        markDirty();
+        createDirectory = true;
+        return self();
+    }
+
+    @Override
+    public WinRmPutTaskWrapper newTask() {
+        dirty = false;
+        return new WinRmPutTaskWrapper(this);
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        // help let people know of API usage error
+        if (dirty)
+            log.warn("Task "+this+" was modified but modification was never used");
+        super.finalize();
+    }
+}
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskStub.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskStub.java
new file mode 100644
index 0000000..28a27bd
--- /dev/null
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskStub.java
@@ -0,0 +1,68 @@
+/*
+ * 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.location.winrm;
+
+import com.google.common.base.Supplier;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.util.core.config.ConfigBag;
+import org.apache.brooklyn.util.core.task.ssh.SshPutTaskStub;
+
+import java.io.InputStream;
+
+public class WinRmPutTaskStub {
+    protected String remoteFile;
+    protected WinRmMachineLocation machine;
+    protected Supplier<? extends InputStream> contents;
+    protected String summary;
+    protected String permissions;
+    protected boolean allowFailure = false;
+    protected boolean createDirectory = false;
+    protected final ConfigBag config = ConfigBag.newInstance();
+
+    protected WinRmPutTaskStub() {
+    }
+
+    protected WinRmPutTaskStub(WinRmPutTaskStub constructor) {
+        this.remoteFile = constructor.remoteFile;
+        this.machine = constructor.machine;
+        this.contents = constructor.contents;
+        this.summary = constructor.summary;
+        this.allowFailure = constructor.allowFailure;
+        this.createDirectory = constructor.createDirectory;
+        this.permissions = constructor.permissions;
+        this.config.copy(constructor.config);
+    }
+
+    public String getRemoteFile() {
+        return remoteFile;
+    }
+
+    public String getSummary() {
+        if (summary!=null) return summary;
+        return "scp put: "+remoteFile;
+    }
+
+    public WinRmMachineLocation getMachine() {
+        return machine;
+    }
+
+    protected ConfigBag getConfig() {
+        return config;
+    }
+}
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskWrapper.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskWrapper.java
new file mode 100644
index 0000000..1315010
--- /dev/null
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmPutTaskWrapper.java
@@ -0,0 +1,185 @@
+/*
+ * 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.location.winrm;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.mgmt.TaskWrapper;
+import org.apache.brooklyn.util.core.config.ConfigBag;
+import org.apache.brooklyn.util.core.internal.ssh.SshTool;
+import org.apache.brooklyn.util.core.task.TaskBuilder;
+import org.apache.brooklyn.util.core.task.Tasks;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.concurrent.Callable;
+
+public class WinRmPutTaskWrapper extends WinRmPutTaskStub implements TaskWrapper<Void> {
+    private static final Logger log = LoggerFactory.getLogger(WinRmPutTaskWrapper.class);
+
+    private final Task<Void> task;
+
+    protected Integer exitCodeOfCopy = null;
+    protected Exception exception = null;
+    protected boolean successful = false;
+
+    // package private as only AbstractWinRmTaskFactory should invoke
+    WinRmPutTaskWrapper(WinRmPutTaskFactory constructor) {
+        super(constructor);
+        TaskBuilder<Void> tb = TaskBuilder.<Void>builder().dynamic(false).displayName(getSummary());
+        task = tb.body(new WinRmPutJob()).build();
+    }
+
+    @Override
+    public Task<Void> asTask() {
+        return getTask();
+    }
+
+    @Override
+    public Task<Void> getTask() {
+        return task;
+    }
+
+    // TODO:
+    //   verify
+    //   copyAsRoot
+    //   owner
+    //   lastModificationDate - see {@link #PROP_LAST_MODIFICATION_DATE}; not supported by all SshTool implementations
+    //   lastAccessDate - see {@link #PROP_LAST_ACCESS_DATE}; not supported by all SshTool implementations
+
+    private class WinRmPutJob implements Callable<Void> {
+        @Override
+        public Void call() throws Exception {
+            try {
+                Preconditions.checkNotNull(getMachine(), "machine");
+
+                String remoteFile = getRemoteFile();
+
+                if (createDirectory) {
+                    String remoteDir = remoteFile;
+                    int exitCodeOfCreate = -1;
+                    try {
+                        int li = remoteDir.lastIndexOf("/");
+                        if (li>=0) {
+                            remoteDir = remoteDir.substring(0, li+1);
+                            exitCodeOfCreate = getMachine().execCommands(ImmutableMap.of(), "creating directory for "+getSummary(),
+                                    Arrays.asList("md "+remoteDir), ImmutableMap.of());
+                        } else {
+                            // nothing to create
+                            exitCodeOfCreate = 0;
+                        }
+                    } catch (Exception e) {
+                        if (log.isDebugEnabled())
+                            log.debug("WinRM put "+getRemoteFile()+" (create dir, in task "+getSummary()+") to "+getMachine()+" threw exception: "+e);
+                        exception = e;
+                    }
+                    if (exception!=null || !((Integer)0).equals(exitCodeOfCreate)) {
+                        if (!allowFailure) {
+                            if (exception != null) {
+                                throw new IllegalStateException(getSummary()+" (creating dir "+remoteDir+" for WinRM put task) ended with exception, in "+ Tasks.current()+": "+exception, exception);
+                            }
+                            if (exitCodeOfCreate!=0) {
+                                exception = new IllegalStateException(getSummary()+" (creating dir "+remoteDir+" WinRM put task) ended with exit code "+exitCodeOfCreate+", in "+Tasks.current());
+                                throw exception;
+                            }
+                        }
+                        // not successful, but allowed
+                        return null;
+                    }
+                }
+
+                ConfigBag config = ConfigBag.newInstanceCopying(getConfig());
+                if (permissions!=null) config.put(SshTool.PROP_PERMISSIONS, permissions);
+
+                exitCodeOfCopy = getMachine().copyTo(config.getAllConfig(), contents.get(), remoteFile);
+
+                if (log.isDebugEnabled())
+                    log.debug("WinRM put "+getRemoteFile()+" (task "+getSummary()+") to "+getMachine()+" completed with exit code "+exitCodeOfCopy);
+            } catch (Exception e) {
+                if (log.isDebugEnabled())
+                    log.debug("WinRM put "+getRemoteFile()+" (task "+getSummary()+") to "+getMachine()+" threw exception: "+e);
+                exception = e;
+            }
+
+            if (exception!=null || !((Integer)0).equals(exitCodeOfCopy)) {
+                if (!allowFailure) {
+                    if (exception != null) {
+                        throw new IllegalStateException(getSummary()+" (WinRM put task) ended with exception, in "+Tasks.current()+": "+exception, exception);
+                    }
+                    if (exitCodeOfCopy!=0) {
+                        exception = new IllegalStateException(getSummary()+" (WinRM put task) ended with exit code "+exitCodeOfCopy+", in "+Tasks.current());
+                        throw exception;
+                    }
+                }
+                // not successful, but allowed
+                return null;
+            }
+
+            // TODO verify
+
+            successful = (exception==null && ((Integer)0).equals(exitCodeOfCopy));
+            return null;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return super.toString()+"["+task+"]";
+    }
+
+    /** blocks, throwing if there was an exception */
+    public Void get() {
+        return getTask().getUnchecked();
+    }
+
+    /** returns the exit code from the copy, 0 on success;
+     * null if it has not completed or threw exception
+     * (not sure if this is ever a non-zero integer or if it is meaningful)
+     * <p>
+     * most callers will want the simpler {@link #isSuccessful()} */
+    public Integer getExitCode() {
+        return exitCodeOfCopy;
+    }
+
+    /** returns any exception encountered in the operation */
+    public Exception getException() {
+        return exception;
+    }
+
+    /** blocks until the task completes; does not throw
+     * @return*/
+    public WinRmPutTaskWrapper block() {
+        getTask().blockUntilEnded();
+        return this;
+    }
+
+    /** true iff the ssh job has completed (with or without failure) */
+    public boolean isDone() {
+        return getTask().isDone();
+    }
+
+    /** true iff the scp has completed successfully; guaranteed to be set before {@link #isDone()} or {@link #block()} are satisfied */
+    public boolean isSuccessful() {
+        return successful;
+    }
+
+
+}
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRMTasks.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmTasks.java
similarity index 81%
rename from software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRMTasks.java
rename to software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmTasks.java
index fb89ad5..7ae2663 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRMTasks.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmTasks.java
@@ -20,8 +20,6 @@ package org.apache.brooklyn.location.winrm;
 
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
 import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.location.winrm.PlainWinRMExecTaskFactory;
-import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
@@ -29,9 +27,9 @@ import org.apache.brooklyn.util.net.Urls;
 
 import java.util.Map;
 
-public class WinRMTasks {
+public class WinRmTasks {
     public static ProcessTaskFactory<Integer> newWinrmExecTaskFactory(org.apache.brooklyn.location.winrm.WinRmMachineLocation winRmMachineLocation, String ...commands) {
-        return new PlainWinRMExecTaskFactory<>(winRmMachineLocation, commands);
+        return new PlainWinRmExecTaskFactory<>(winRmMachineLocation, commands);
     }
 
     public static TaskFactory<?> installFromUrl(final ResourceUtils utils, final Map<String, ?> props, final WinRmMachineLocation location, final String url, final String destPath) {
@@ -49,4 +47,11 @@ public class WinRMTasks {
             }
         };
     }
+
+    public static WinRmPutTaskFactory newWinrmPutTaskFactory(WinRmMachineLocation winRmMachineLocation, String remoteFile) {
+        return newWinRmPutTaskFactory(winRmMachineLocation, true, remoteFile);
+    }
+    public static WinRmPutTaskFactory newWinRmPutTaskFactory(WinRmMachineLocation machine, final boolean useMachineConfig, String remoteFile) {
+        return new WinRmPutTaskFactory(machine, remoteFile);
+    }
 }
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java b/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
index 784e7d1..4295168 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
@@ -115,19 +115,12 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
 
     @Override
     public org.apache.brooklyn.util.core.internal.winrm.WinRmToolResponse executeCommand(final List<String> commands) {
-        return exec(new Function<io.cloudsoft.winrm4j.winrm.WinRmTool, io.cloudsoft.winrm4j.winrm.WinRmToolResponse>() {
-            @Override public WinRmToolResponse apply(io.cloudsoft.winrm4j.winrm.WinRmTool tool) {
-                OutputStream outputStream = bag.get(ShellTool.PROP_OUT_STREAM);
-                OutputStream errorStream = bag.get(ShellTool.PROP_ERR_STREAM);
-                try(Writer out = outputStream != null ? new OutputStreamWriter(outputStream): new StringWriter();
-                Writer err = errorStream != null ? new OutputStreamWriter(errorStream): new StringWriter()) {
-                    return tool.executeCommand(commands, out, err);
-                } catch (IOException e) {
-                    // TODO Duncan
-                    e.printStackTrace();
-                    return null;
-                }
-            }
+        return exec(tool -> {
+            OutputStream outputStream = bag.get(ShellTool.PROP_OUT_STREAM);
+            OutputStream errorStream = bag.get(ShellTool.PROP_ERR_STREAM);
+            Writer out = outputStream != null ? new OutputStreamWriter(outputStream): new StringWriter();
+            Writer err = errorStream != null ? new OutputStreamWriter(errorStream): new StringWriter();
+            return tool.executeCommand(commands, out, err);
         });
     }
 
@@ -136,17 +129,15 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
     public org.apache.brooklyn.util.core.internal.winrm.WinRmToolResponse executeScript(final List<String> commands) {
         return executeCommand(commands);
     }
-    
+
     @Override
     public org.apache.brooklyn.util.core.internal.winrm.WinRmToolResponse executePs(final List<String> commands) {
-        return exec(new Function<io.cloudsoft.winrm4j.winrm.WinRmTool, io.cloudsoft.winrm4j.winrm.WinRmToolResponse>() {
-            @Override public WinRmToolResponse apply(io.cloudsoft.winrm4j.winrm.WinRmTool tool) {
-                OutputStream outputStream = bag.get(ShellTool.PROP_OUT_STREAM);
-                OutputStream errorStream = bag.get(ShellTool.PROP_ERR_STREAM);
-                Writer out = outputStream != null ? new OutputStreamWriter(outputStream): new StringWriter();
-                Writer err = errorStream != null ? new OutputStreamWriter(errorStream): new StringWriter();
-                return tool.executePs(commands, out, err);
-            }
+        return exec(tool -> {
+            OutputStream outputStream = bag.get(ShellTool.PROP_OUT_STREAM);
+            OutputStream errorStream = bag.get(ShellTool.PROP_ERR_STREAM);
+            Writer out = outputStream != null ? new OutputStreamWriter(outputStream): new StringWriter();
+            Writer err = errorStream != null ? new OutputStreamWriter(errorStream): new StringWriter();
+            return tool.executePs(commands, out, err);
         });
     }
 
@@ -161,9 +152,9 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
             int i=0;
             while ((bytesRead = source.read(inputData)) > 0) {
                 i++;
-                
+
                 LOG.debug("Copying chunk "+i+" to "+destination+" on "+host);
-                
+
                 byte[] chunk;
                 if (bytesRead == chunkSize) {
                     chunk = inputData;
@@ -176,7 +167,7 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
                 expectedFileSize += bytesRead;
             }
             LOG.debug("Finished copying to "+destination+" on "+host);
-            
+
             return new org.apache.brooklyn.util.core.internal.winrm.WinRmToolResponse("", "", 0);
         } catch (java.io.IOException e) {
             throw propagate(e, "Failed copying to server at "+destination);
@@ -186,7 +177,7 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
     private org.apache.brooklyn.util.core.internal.winrm.WinRmToolResponse exec(Function<io.cloudsoft.winrm4j.winrm.WinRmTool, io.cloudsoft.winrm4j.winrm.WinRmToolResponse> task) {
         Collection<Throwable> exceptions = Lists.newArrayList();
         Stopwatch totalStopwatch = Stopwatch.createStarted();
-        
+
         for (int i = 0; i < execTries; i++) {
             Stopwatch stopwatch = Stopwatch.createStarted();
             Duration connectTimestamp = null;
@@ -212,7 +203,7 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
                 String timeMsg = "total time "+Duration.of(totalStopwatch).toStringRounded()
                         + ", this attempt failed after "+Duration.of(failTimestamp).toStringRounded()
                         + (connectTimestamp != null ? ", connected in "+Duration.of(connectTimestamp).toStringRounded() : "");
-                
+
                 if ((i + 1) == execTries) {
                     LOG.info("Propagating exception - WinRM failed on "+user+"@"+host+":"+port+" "
                             + (logCredentials ? "password=" + password : "")


[brooklyn-server] 02/05: Merge remote-tracking branch 'upstream/master' into winrmtaskfactory

Posted by he...@apache.org.
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 5653ff682b41cc85ea4e36eb1e0665f7a05726de
Merge: 3b56db7 aebee7b
Author: Duncan Grant <du...@cloudsoft.io>
AuthorDate: Thu Nov 12 10:41:09 2020 +0000

    Merge remote-tracking branch 'upstream/master' into winrmtaskfactory

 .../BrooklynComponentTemplateResolver.java         |  17 +-
 .../creation/BrooklynEntityDecorationResolver.java |   3 +-
 .../spi/dsl/methods/BrooklynDslCommon.java         |  27 +-
 .../brooklyn/CustomTypeConfigYamlOsgiTest.java     |   6 +
 .../camp/brooklyn/CustomTypeConfigYamlTest.java    | 339 +++++++++++++++------
 .../brooklyn/spi/dsl/DslSerializationTest.java     |  22 +-
 .../core/objs/proxy/InternalEntityFactory.java     |  53 ++--
 .../core/resolve/jackson/BeanWithTypeUtils.java    | 169 +++++++++-
 .../jackson/BrooklynJacksonSerializationUtils.java |   1 +
 ...BrooklynRegisteredTypeJacksonSerialization.java |   9 +
 .../core/resolve/jackson/WrappedValue.java         |   2 +
 .../jackson/WrappedValuesSerialization.java        |  35 ++-
 .../core/typereg/BasicBrooklynTypeRegistry.java    |  28 +-
 .../brooklyn/entity/group/AbstractGroupImpl.java   |  10 +-
 .../core/flags/BrooklynTypeNameResolution.java     |   7 +
 .../brooklyn/util/core/flags/TypeCoercions.java    |  29 +-
 .../brooklyn/util/core/task/ValueResolver.java     |  18 +-
 .../core/resolve/jackson/MapperTestFixture.java    |  12 +
 .../jackson/WrappedValuesSerializationTest.java    |  17 +-
 .../util/core/internal/ssh/RecordingSshTool.java   |   8 +-
 .../JcloudsTypeCoercionsWithBuilderTest.java       |   2 +-
 .../java/org/apache/brooklyn/util/guava/Maybe.java |  14 +-
 .../org/apache/brooklyn/util/guava/TypeTokens.java |  13 +
 .../org/apache/brooklyn/util/time/Duration.java    |   2 +
 .../apache/brooklyn/util/guava/TypeTokensTest.java |  40 +++
 25 files changed, 712 insertions(+), 171 deletions(-)


[brooklyn-server] 04/05: Update to latest winrm latest

Posted by he...@apache.org.
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 2af8527687e8680ebe84e55a549af3bc9ca45c02
Author: Duncan Grant <du...@cloudsoft.io>
AuthorDate: Thu Nov 12 21:26:47 2020 +0000

    Update to latest winrm latest
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 572103e..ee415b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,7 +164,7 @@
         <jax-rs-api.version>2.1.1</jax-rs-api.version> <!-- differs from jclouds 2.1.2, which depends on v2.0.1 -->
         <maxmind.version>2.8.0-rc1</maxmind.version>
         <maxmind-db.version>1.2.1</maxmind-db.version>
-        <winrm4j.version>0.10.0-SNAPSHOT</winrm4j.version> <!--  FIXME NO CHECK IN -->
+        <winrm4j.version>0.10.0</winrm4j.version>
         <felix-osgi-compendium.version>1.4.0</felix-osgi-compendium.version>
         <kubernetes-client.version>4.9.0</kubernetes-client.version>
 


[brooklyn-server] 03/05: Buffer the text stream from winrm4j

Posted by he...@apache.org.
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 a7704d0e1ead1d5f568eb7f2ddf833b39c5ebc33
Author: Duncan Grant <du...@cloudsoft.io>
AuthorDate: Thu Nov 12 14:35:37 2020 +0000

    Buffer the text stream from winrm4j
    
    In case of craziness coming from the winrm4j script.
---
 .../brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java    | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java b/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
index 4295168..0ce9bc5 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
@@ -118,8 +118,8 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
         return exec(tool -> {
             OutputStream outputStream = bag.get(ShellTool.PROP_OUT_STREAM);
             OutputStream errorStream = bag.get(ShellTool.PROP_ERR_STREAM);
-            Writer out = outputStream != null ? new OutputStreamWriter(outputStream): new StringWriter();
-            Writer err = errorStream != null ? new OutputStreamWriter(errorStream): new StringWriter();
+            Writer out = outputStream != null ? new BufferedWriter(new OutputStreamWriter(outputStream)): new StringWriter();
+            Writer err = errorStream != null ? new BufferedWriter(new OutputStreamWriter(errorStream)): new StringWriter();
             return tool.executeCommand(commands, out, err);
         });
     }
@@ -135,8 +135,8 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
         return exec(tool -> {
             OutputStream outputStream = bag.get(ShellTool.PROP_OUT_STREAM);
             OutputStream errorStream = bag.get(ShellTool.PROP_ERR_STREAM);
-            Writer out = outputStream != null ? new OutputStreamWriter(outputStream): new StringWriter();
-            Writer err = errorStream != null ? new OutputStreamWriter(errorStream): new StringWriter();
+            Writer out = outputStream != null ? new BufferedWriter(new OutputStreamWriter(outputStream)): new StringWriter();
+            Writer err = errorStream != null ? new BufferedWriter(new OutputStreamWriter(errorStream)): new StringWriter();
             return tool.executePs(commands, out, err);
         });
     }


[brooklyn-server] 05/05: This closes #1124

Posted by he...@apache.org.
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 867fe7dc0ee343a3858984d7093c699a40e988fe
Merge: a64ab7b 2af8527
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Nov 13 15:05:56 2020 +0000

    This closes #1124

 .../brooklyn/api/location/MachineLocation.java     |   7 +
 .../core/effector/ssh/SshEffectorTasks.java        |   3 +-
 .../brooklyn/location/ssh/SshMachineLocation.java  |  11 +-
 .../ssh/internal/AbstractSshExecTaskFactory.java   |   3 +-
 .../util/core/task/system/ProcessTaskFactory.java  |   3 +-
 .../util/core/task/system/ProcessTaskStub.java     |   5 +-
 .../internal/AbstractProcessTaskFactory.java       |   3 +-
 .../system/internal/SystemProcessTaskFactory.java  |   3 +-
 .../brooklyn/core/location/SimulatedLocation.java  |  18 +-
 pom.xml                                            |   2 +-
 .../location/winrm/PlainWinRmExecTaskFactory.java  |  72 ++++++++
 .../location/winrm/WinRmMachineLocation.java       |  72 ++++++--
 .../location/winrm/WinRmPutTaskFactory.java        | 120 +++++++++++++
 .../brooklyn/location/winrm/WinRmPutTaskStub.java  |  68 ++++++++
 .../location/winrm/WinRmPutTaskWrapper.java        | 185 +++++++++++++++++++++
 .../apache/brooklyn/location/winrm/WinRmTasks.java |  57 +++++++
 .../util/core/internal/winrm/WinRmTool.java        |   2 +-
 .../core/internal/winrm/winrm4j/Winrm4jTool.java   |  35 ++--
 18 files changed, 628 insertions(+), 41 deletions(-)