You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2016/02/11 16:05:41 UTC

[1/2] brooklyn-server git commit: Upgrade winrm4j to version 0.3.1

Repository: brooklyn-server
Updated Branches:
  refs/heads/master f9a59e5d4 -> 5b01f8fb2


Upgrade winrm4j to version 0.3.1

- added config key for use Https or not
- added config key for using NTLM


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/8b9f3ac2
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/8b9f3ac2
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/8b9f3ac2

Branch: refs/heads/master
Commit: 8b9f3ac25551d2ec0a85bcb7211e57e543b6ec58
Parents: f9a59e5
Author: Valentin Aitken <bo...@gmail.com>
Authored: Tue Feb 2 00:24:52 2016 +0200
Committer: Valentin Aitken <bo...@gmail.com>
Committed: Thu Feb 11 16:47:12 2016 +0200

----------------------------------------------------------------------
 .../camp/brooklyn/ByonLocationsYamlTest.java    |  2 +-
 .../location/jclouds/JcloudsLocation.java       | 11 +--
 .../jclouds/JcloudsWinRmMachineLocation.java    |  5 --
 .../brooklyn/logback-logger-excludes.xml        |  2 +
 pom.xml                                         |  2 +-
 .../software/base/EmptyWindowsProcess.java      |  2 +-
 .../base/EmptyWindowsProcessWinRmDriver.java    |  3 +-
 .../software/base/VanillaWindowsProcess.java    |  6 +-
 .../base/VanillaWindowsProcessImpl.java         |  9 ++-
 .../base/VanillaWindowsProcessWinRmDriver.java  |  3 +-
 .../location/WinRmMachineLocationLiveTest.java  |  2 +-
 .../winrm/AdvertiseWinrmLoginPolicy.java        |  3 +-
 .../location/winrm/WinRmMachineLocation.java    | 74 ++++++++++++++++----
 .../util/core/internal/winrm/WinRmTool.java     | 13 +++-
 .../internal/winrm/winrm4j/Winrm4jTool.java     | 19 ++++-
 15 files changed, 121 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
index ff89c25..31faa35 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ByonLocationsYamlTest.java
@@ -266,7 +266,7 @@ public class ByonLocationsYamlTest extends AbstractYamlTest {
     
     private void assertMachine(WinRmMachineLocation machine, UserAndHostAndPort conn, Map<String, ?> config) {
         assertEquals(machine.getAddress().getHostAddress(), conn.getHostAndPort().getHostText());
-        assertEquals(machine.getConfig(WinRmMachineLocation.WINRM_PORT), (Integer) conn.getHostAndPort().getPort());
+        assertEquals(machine.getPort(), conn.getHostAndPort().getPort());
         assertEquals(machine.getUser(), conn.getUser());
         for (Map.Entry<String, ?> entry : config.entrySet()) {
             Object actualVal = machine.getConfig(ConfigKeys.newConfigKey(Object.class, entry.getKey()));

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
index 05972a2..23b3d8c 100644
--- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java
@@ -731,7 +731,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
 
             boolean windows = isWindows(node, setup);
             if (windows) {
-                int newLoginPort = node.getLoginPort() == 22 ? 5985 : node.getLoginPort();
+                int newLoginPort = node.getLoginPort() == 22 ? (getConfig(WinRmMachineLocation.USE_HTTPS_WINRM) ? 5986 : 5985) : node.getLoginPort();
                 String newLoginUser = "root".equals(node.getCredentials().getUser()) ? "Administrator" : node.getCredentials().getUser();
                 LOG.debug("jclouds created Windows VM {}; transforming connection details: loginPort from {} to {}; loginUser from {} to {}", 
                         new Object[] {node, node.getLoginPort(), newLoginPort, node.getCredentials().getUser(), newLoginUser});
@@ -1535,7 +1535,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         boolean windows = isWindows(template, config);
         if (windows) {
             if (!(config.containsKey(JcloudsLocationConfig.USER_METADATA_STRING) || config.containsKey(JcloudsLocationConfig.USER_METADATA_MAP))) {
-                config.put(JcloudsLocationConfig.USER_METADATA_STRING, WinRmMachineLocation.getDefaultUserMetadataString());
+                config.put(JcloudsLocationConfig.USER_METADATA_STRING, WinRmMachineLocation.getDefaultUserMetadataString(config()));
             }
         }
                
@@ -2297,7 +2297,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                     .configure("jcloudsParent", this)
                     .configure("displayName", vmHostname)
                     .configure("address", address)
-                    .configure(WinRmMachineLocation.WINRM_PORT, sshHostAndPort.isPresent() ? sshHostAndPort.get().getPort() : node.getLoginPort())
+                    .configure(WinRmMachineLocation.WINRM_CONFIG_PORT, sshHostAndPort.isPresent() ? sshHostAndPort.get().getPort() : node.getLoginPort())
                     .configure("user", getUser(setup))
                     .configure(WinRmMachineLocation.USER, setup.get(USER))
                     .configure(WinRmMachineLocation.PASSWORD, setup.get(PASSWORD))
@@ -2476,7 +2476,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
                     hostAndPortOverride = ((SshMachineLocation)machine).getSshHostAndPort();
                 } else if (machine instanceof WinRmMachineLocation) {
                     String host = ((WinRmMachineLocation)machine).getAddress().getHostAddress();
-                    int port = ((WinRmMachineLocation)machine).config().get(WinRmMachineLocation.WINRM_PORT);
+                    int port = ((WinRmMachineLocation)machine).getPort();
                     hostAndPortOverride = HostAndPort.fromParts(host, port);
                 } else {
                     LOG.warn("Unexpected machine {} of type {}; expected SSH or WinRM", machine, (machine != null ? machine.getClass() : null));
@@ -2644,7 +2644,8 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         String user = (users.size() == 1) ? Iterables.getOnlyElement(users) : "{" + Joiner.on(",").join(users) + "}";
         String vmIp = hostAndPortOverride.isPresent() ? hostAndPortOverride.get().getHostText() : getFirstReachableAddress(node, setup);
         if (vmIp==null) LOG.warn("Unable to extract IP for "+node+" ("+setup.getDescription()+"): subsequent connection attempt will likely fail");
-        int vmPort = hostAndPortOverride.isPresent() ? hostAndPortOverride.get().getPortOrDefault(5985) : 5985;
+        int defaultWinRmPort = getConfig(WinRmMachineLocation.USE_HTTPS_WINRM) ? 5986 : 5985;
+        int vmPort = hostAndPortOverride.isPresent() ? hostAndPortOverride.get().getPortOrDefault(defaultWinRmPort) : defaultWinRmPort;
 
         String connectionDetails = user + "@" + vmIp + ":" + vmPort;
         final HostAndPort hostAndPort = hostAndPortOverride.isPresent() ? hostAndPortOverride.get() : HostAndPort.fromParts(vmIp, vmPort);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsWinRmMachineLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsWinRmMachineLocation.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsWinRmMachineLocation.java
index b58e783..7a2fe3d 100644
--- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsWinRmMachineLocation.java
+++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsWinRmMachineLocation.java
@@ -162,11 +162,6 @@ public class JcloudsWinRmMachineLocation extends WinRmMachineLocation implements
     }
 
     @Override
-    public int getPort() {
-        return getConfig(WINRM_PORT);
-    }
-    
-    @Override
     public JcloudsLocation getParent() {
         return jcloudsParent;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/logging/logback-includes/src/main/resources/brooklyn/logback-logger-excludes.xml
----------------------------------------------------------------------
diff --git a/logging/logback-includes/src/main/resources/brooklyn/logback-logger-excludes.xml b/logging/logback-includes/src/main/resources/brooklyn/logback-logger-excludes.xml
index 9f8738b..93e6138 100644
--- a/logging/logback-includes/src/main/resources/brooklyn/logback-logger-excludes.xml
+++ b/logging/logback-includes/src/main/resources/brooklyn/logback-logger-excludes.xml
@@ -61,4 +61,6 @@
         <appender-ref ref="FILE" />
     </logger>
 
+    <logger name="org.apache.cxf" level="WARN"/>
+    <logger name="io.cloudsoft.winrm4j.winrm.WinRmTool" level="WARN"/>
 </included>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5078260..c1e2003 100644
--- a/pom.xml
+++ b/pom.xml
@@ -147,7 +147,7 @@
         <jsr311-api.version>1.1.1</jsr311-api.version>
         <maxmind.version>0.8.1</maxmind.version>
         <jna.version>4.0.0</jna.version>
-        <winrm4j.version>0.2.0</winrm4j.version>
+        <winrm4j.version>0.3.1</winrm4j.version>
         
         <!-- Transitive dependencies, declared explicitly to avoid version mismatch -->
         <clojure.version>1.4.0</clojure.version>

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcess.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcess.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcess.java
index 770ba0d..b0b1efc 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcess.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcess.java
@@ -32,7 +32,7 @@ public interface EmptyWindowsProcess extends SoftwareProcess {
     // 3389 is RDP; 5985 is WinRM (3389 isn't used by Brooklyn, but useful for the end-user subsequently)
     ConfigKey<Collection<Integer>> REQUIRED_OPEN_LOGIN_PORTS = ConfigKeys.newConfigKeyWithDefault(
             SoftwareProcess.REQUIRED_OPEN_LOGIN_PORTS,
-            ImmutableSet.of(5985, 3389));
+            ImmutableSet.of(5986, 5985, 3389));
     
     ConfigKey<Boolean> USE_WINRM_MONITORING = ConfigKeys.newConfigKey("winrmMonitoring.enabled", "WinRM monitoring enabled", Boolean.TRUE);
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcessWinRmDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcessWinRmDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcessWinRmDriver.java
index 4a9a054..98d40d87 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcessWinRmDriver.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/EmptyWindowsProcessWinRmDriver.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
+import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
 import org.apache.brooklyn.util.net.UserAndHostAndPort;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,7 +41,7 @@ public class EmptyWindowsProcessWinRmDriver extends AbstractSoftwareProcessWinRm
     @Override
     public void start() {
         WinRmMachineLocation machine = (WinRmMachineLocation) location;
-        UserAndHostAndPort winrmAddress = UserAndHostAndPort.fromParts(machine.getUser(), machine.getAddress().getHostName(), machine.config().get(WinRmMachineLocation.WINRM_PORT));
+        UserAndHostAndPort winrmAddress = UserAndHostAndPort.fromParts(machine.getUser(), machine.getAddress().getHostName(), entity.getConfig(WinRmTool.PROP_PORT));
         getEntity().sensors().set(Attributes.WINRM_ADDRESS, winrmAddress);
 
         super.start();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcess.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcess.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcess.java
index b08e990..eb64063 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcess.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcess.java
@@ -26,7 +26,9 @@ import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
 import org.apache.brooklyn.util.time.Duration;
 
 import com.google.common.collect.ImmutableSet;
@@ -37,7 +39,7 @@ public interface VanillaWindowsProcess extends AbstractVanillaProcess {
     // 3389 is RDP; 5985 is WinRM (3389 isn't used by Brooklyn, but useful for the end-user subsequently)
     ConfigKey<Collection<Integer>> REQUIRED_OPEN_LOGIN_PORTS = ConfigKeys.newConfigKeyWithDefault(
             SoftwareProcess.REQUIRED_OPEN_LOGIN_PORTS,
-            ImmutableSet.of(5985, 3389));
+            ImmutableSet.of(5986, 5985, 3389));
     
     @CatalogConfig(label = "Install PowerShell command", priority=5.5)
     ConfigKey<String> INSTALL_POWERSHELL_COMMAND = ConfigKeys.newStringConfigKey("install.powershell.command",
@@ -103,5 +105,5 @@ public interface VanillaWindowsProcess extends AbstractVanillaProcess {
             "duration to wait whilst waiting for a machine to finish rebooting, and thus to become available again", Duration.minutes(30));
     
     AttributeSensor<Integer> RDP_PORT = Sensors.newIntegerSensor("rdpPort");
-    AttributeSensor<Integer> WINRM_PORT = Sensors.newIntegerSensor("winrmPort");
+    AttributeSensor<Integer> WINRM_PORT = Sensors.newIntegerSensor(WinRmTool.PROP_PORT.getName());
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessImpl.java
index fec3100..b6a7d0e 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessImpl.java
@@ -19,6 +19,10 @@
 package org.apache.brooklyn.entity.software.base;
 
 
+import com.google.common.collect.Iterables;
+import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
+
 public class VanillaWindowsProcessImpl extends SoftwareProcessImpl implements VanillaWindowsProcess {
     @Override
     public Class getDriverInterface() {
@@ -29,7 +33,10 @@ public class VanillaWindowsProcessImpl extends SoftwareProcessImpl implements Va
     protected void preStart() {
         super.preStart();
         sensors().set(RDP_PORT, 3389);
-        sensors().set(WINRM_PORT, 5985);
+        WinRmMachineLocation loc = Iterables.getFirst(Iterables.filter(getLocations(), WinRmMachineLocation.class), null);
+        if (loc != null) {
+            sensors().set(WINRM_PORT, loc.getPort());
+        }
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessWinRmDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessWinRmDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessWinRmDriver.java
index 67c57f8..027c0c8 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessWinRmDriver.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/VanillaWindowsProcessWinRmDriver.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.entity.software.base;
 import org.apache.brooklyn.api.entity.EntityLocal;
 import org.apache.brooklyn.core.entity.Attributes;
 import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
+import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
 import org.apache.brooklyn.util.net.UserAndHostAndPort;
 import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
@@ -36,7 +37,7 @@ public class VanillaWindowsProcessWinRmDriver extends AbstractSoftwareProcessWin
     @Override
     public void start() {
         WinRmMachineLocation machine = (WinRmMachineLocation) location;
-        UserAndHostAndPort winrmAddress = UserAndHostAndPort.fromParts(machine.getUser(), machine.getAddress().getHostName(), machine.config().get(WinRmMachineLocation.WINRM_PORT));
+        UserAndHostAndPort winrmAddress = UserAndHostAndPort.fromParts(machine.getUser(), machine.getAddress().getHostName(), entity.getAttribute(VanillaWindowsProcess.WINRM_PORT));
         getEntity().sensors().set(Attributes.WINRM_ADDRESS, winrmAddress);
 
         super.start();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/location/WinRmMachineLocationLiveTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/location/WinRmMachineLocationLiveTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/location/WinRmMachineLocationLiveTest.java
index 2e34ef7..bf22419 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/location/WinRmMachineLocationLiveTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/test/location/WinRmMachineLocationLiveTest.java
@@ -100,7 +100,7 @@ public class WinRmMachineLocationLiveTest {
         loc = newLoc(mgmt);
         machine = loc.obtain(ImmutableMap.of());
         
-        LOG.info("PROVISIONED: "+machine.getAddress()+":"+machine.config().get(WinRmMachineLocation.WINRM_PORT)
+        LOG.info("PROVISIONED: "+machine.getAddress()+":"+machine.getPort()
                 +", "+machine.getUser()+":"+machine.config().get(WinRmMachineLocation.PASSWORD));
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/AdvertiseWinrmLoginPolicy.java
----------------------------------------------------------------------
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/AdvertiseWinrmLoginPolicy.java b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/AdvertiseWinrmLoginPolicy.java
index 5d3a0c8..6ea9763 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/AdvertiseWinrmLoginPolicy.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/AdvertiseWinrmLoginPolicy.java
@@ -27,6 +27,7 @@ import org.apache.brooklyn.api.sensor.SensorEventListener;
 import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.policy.AbstractPolicy;
 import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,7 +69,7 @@ public class AdvertiseWinrmLoginPolicy extends AbstractPolicy implements SensorE
     protected void advertiseUserAsync(final Entity entity, final WinRmMachineLocation machine) {
         String user = machine.getUser();
         String hostname = machine.getHostname();
-        int port = machine.config().get(WinRmMachineLocation.WINRM_PORT);
+        int port = machine.getPort();
         String password = machine.config().get(WinRmMachineLocation.PASSWORD);
         
         String creds = user + " : " + password + " @ " +hostname + ":" + port;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/winrm/src/main/java/org/apache/brooklyn/location/winrm/WinRmMachineLocation.java
----------------------------------------------------------------------
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 d04c366..fefc1ba 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
@@ -29,6 +29,7 @@ import java.util.Set;
 
 import javax.annotation.Nullable;
 
+import com.google.common.annotations.Beta;
 import org.apache.brooklyn.api.location.MachineDetails;
 import org.apache.brooklyn.api.location.MachineLocation;
 import org.apache.brooklyn.api.location.OsDetails;
@@ -46,6 +47,7 @@ import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
 import org.apache.brooklyn.util.core.internal.winrm.WinRmToolResponse;
 import org.apache.brooklyn.util.core.internal.winrm.winrm4j.Winrm4jTool;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.commons.codec.binary.Base64;
@@ -63,6 +65,8 @@ import com.google.common.collect.Iterables;
 import com.google.common.net.HostAndPort;
 import com.google.common.reflect.TypeToken;
 
+import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKeyWithPrefix;
+
 public class WinRmMachineLocation extends AbstractLocation implements MachineLocation {
 
     private static final Logger LOG = LoggerFactory.getLogger(WinRmMachineLocation.class);
@@ -72,8 +76,19 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
             "address",
             "Address of the remote machine");
 
-    public static final ConfigKey<Integer> WINRM_PORT = WinRmTool.PROP_PORT;
-    
+    public static final ConfigKey<Integer> WINRM_CONFIG_PORT = newConfigKeyWithPrefix(BrooklynConfigKeys.BROOKLYN_WINRM_CONFIG_KEY_PREFIX, WinRmTool.PROP_PORT);
+    public static final ConfigKey<Boolean> USE_HTTPS_WINRM = WinRmTool.USE_HTTPS_WINRM;
+
+
+    /**
+     * Flag which tells winrm whether to use Basic Authentication
+     * or Negotiate plus NTLM.
+     * winrm.useNtlm parameter could be a subject to change.
+     * TODO Winrm supports several authentication mechanisms so it would be better to replace it with a prioritised list of authentication mechanisms to try.
+     */
+    @Beta
+    public static final ConfigKey<Boolean> USE_NTLM = WinRmTool.USE_NTLM;
+
     // TODO merge with {link SshTool#PROP_USER} and {@link SshMachineLocation#user}?
     public static final ConfigKey<String> USER = WinRmTool.PROP_USER;
 
@@ -197,7 +212,21 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
     @Nullable
     protected String getHostAndPort() {
         String host = getHostname();
-        return (host == null) ? null : host + ":" + config().get(WINRM_PORT);
+        return (host == null) ? null : host + ":" + getDefaultPort();
+    }
+
+    public int getPort() {
+        Maybe<Object> raw = config().getRaw(WinRmTool.PROP_PORT);
+        if (raw.orNull() == null && config().getRaw(WINRM_CONFIG_PORT).orNull() != null) {
+            return config().get(WINRM_CONFIG_PORT);
+        } else {
+            Integer result = config().get(WinRmTool.PROP_PORT);
+            return (result != null) ? result : getDefaultPort();
+        }
+    }
+
+    private int getDefaultPort() {
+        return getConfig(USE_HTTPS_WINRM) ? 5986 : 5985;
     }
 
     @Override
@@ -309,6 +338,9 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
             
             args.putAll(props);
             args.configure(SshTool.PROP_HOST, getAddress().getHostAddress());
+            args.configure(WinRmTool.USE_NTLM, getConfig(WinRmMachineLocation.USE_NTLM));
+            args.configure(WinRmTool.USE_HTTPS_WINRM, getConfig(WinRmMachineLocation.USE_HTTPS_WINRM));
+            args.configure(WinRmTool.PROP_PORT, getPort());
 
             if (LOG.isTraceEnabled()) LOG.trace("creating WinRM session for "+Sanitizer.sanitize(args));
 
@@ -349,7 +381,7 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
         return response.getStatusCode();
     }
 
-    public static String getDefaultUserMetadataString() {
+    public static String getDefaultUserMetadataString(ConfigurationSupportInternal config) {
         // Using an encoded command obviates the need to escape
         String unencodePowershell = Joiner.on("\r\n").join(ImmutableList.of(
                 // Allow TS connections
@@ -388,20 +420,38 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
                 "}"
         ));
 
+        // FIXME USE_HTTPS_WINRM
+        // Missing generate certificate step.
+        // https://support.microsoft.com/en-us/kb/2019527
+        //
+        // One possible approach is to generate a certificate and append it to this command.
+        // http://stackoverflow.com/questions/1615871/creating-an-x509-certificate-in-java-without-bouncycastle
+        //
+        // @neykov:
+        // The certificate is best generated on the machine, without leaving it ever (for self-signed case). On the other hand it's not possible to get the public part at this step.
+        // I see this setup step dissappearing longer term (or keeping it minimalistic).
+        // Instead do something like the jclouds init sequence where it connects with whatever is provided by the cloud, then configuring it to our liking.
+        boolean useSecureWinrm = config.getBag().get(USE_HTTPS_WINRM);
+
+        boolean basicAuth = !config.getBag().get(USE_NTLM), allowUnencrypted = !useSecureWinrm;
+        int port = useSecureWinrm ? 5986 : 5985;
+
         String encoded = new String(Base64.encodeBase64(unencodePowershell.getBytes(Charsets.UTF_16LE)));
-        return "winrm quickconfig -q & " +
-                "winrm set winrm/config/service/auth @{Basic=\"true\"} & " +
-                "winrm set winrm/config/service/auth @{CredSSP=\"true\"} & " +
-                "winrm set winrm/config/client/auth @{CredSSP=\"true\"} & " +
-                "winrm set winrm/config/client @{AllowUnencrypted=\"true\"} & " +
-                "winrm set winrm/config/service @{AllowUnencrypted=\"true\"} & " +
+        return String.format("winrm quickconfig -q & " +
+                "winrm set winrm/config/service/auth @{Basic=\"%1$s\"} & " +
+                "winrm set winrm/config/service @{AllowUnencrypted=\"%2$s\"} & " +
                 "winrm set winrm/config/winrs @{MaxConcurrentUsers=\"100\"} & " +
                 "winrm set winrm/config/winrs @{MaxMemoryPerShellMB=\"0\"} & " +
                 "winrm set winrm/config/winrs @{MaxProcessesPerShell=\"0\"} & " +
                 "winrm set winrm/config/winrs @{MaxShellsPerUser=\"0\"} & " +
                 "netsh advfirewall firewall add rule name=RDP dir=in protocol=tcp localport=3389 action=allow profile=any & " +
-                "netsh advfirewall firewall add rule name=WinRM dir=in protocol=tcp localport=5985 action=allow profile=any & " +
-                "powershell -EncodedCommand " + encoded;
+                "netsh advfirewall firewall add rule name=WinRM dir=in protocol=tcp localport=%3$d action=allow profile=any & " +
+                "powershell -EncodedCommand ",
+                basicAuth,
+                allowUnencrypted,
+                port
+                )
+                + encoded;
         /* TODO: Find out why scripts with new line characters aren't working on AWS. The following appears as if it *should*
            work but doesn't - the script simply isn't run. By connecting to the machine via RDP, you can get the script
            from 'http://169.254.169.254/latest/user-data', and running it at the command prompt works, but for some

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/WinRmTool.java
----------------------------------------------------------------------
diff --git a/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/WinRmTool.java b/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/WinRmTool.java
index 5515ec5..c93e2ca 100644
--- a/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/WinRmTool.java
+++ b/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/WinRmTool.java
@@ -28,6 +28,7 @@ import java.util.List;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
+import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
 import org.apache.brooklyn.util.time.Duration;
 
 import com.google.common.annotations.Beta;
@@ -43,7 +44,17 @@ public interface WinRmTool {
             "static final initializer classload ordering problem");
     
     ConfigKey<String> PROP_HOST = newStringConfigKey("host", "Host to connect to (required)", null);
-    ConfigKey<Integer> PROP_PORT = newIntegerConfigKey("port", "WinRM port to use when connecting to the remote machine", 5985);
+    ConfigKey<Integer> PROP_PORT = ConfigKeys.newIntegerConfigKey("port", "WinRM port to use when connecting to the remote machine");
+    ConfigKey<Boolean> USE_HTTPS_WINRM = ConfigKeys.newBooleanConfigKey("winrm.useHttps", "The parameter configures tells the machine sensors whether the winrm port is over https. If the parameter is true then 5986 will be used as a winrm port.", false);
+
+    /**
+     * Flag which tells winrm whether to use Basic Authentication
+     * or Negotiate plus NTLM.
+     * winrm.useNtlm parameter could be a subject to change.
+     * TODO Winrm supports several authentication mechanisms so it would be better to replace it with a prioritised list of authentication mechanisms to try.
+     */
+   @Beta
+    ConfigKey<Boolean> USE_NTLM = ConfigKeys.newBooleanConfigKey("winrm.useNtlm", "The parameter configures tells the machine sensors whether the winrm port is over https. If the parameter is true then 5986 will be used as a winrm port.", true);
     ConfigKey<String> PROP_USER = newStringConfigKey("user", "User to connect as", null);
     ConfigKey<String> PROP_PASSWORD = newStringConfigKey("password", "Password to use to connect", null);
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8b9f3ac2/software/winrm/src/main/java/org/apache/brooklyn/util/core/internal/winrm/winrm4j/Winrm4jTool.java
----------------------------------------------------------------------
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 e023cfb..2de8c39 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
@@ -35,6 +35,7 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.http.client.config.AuthSchemes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,6 +68,8 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
     private final int execTries;
     private final Duration execRetryDelay;
     private final boolean logCredentials;
+    private final Boolean useSecureWinrm;
+    private final String authenticationScheme;
     
     public Winrm4jTool(Map<String,?> config) {
         this(ConfigBag.newInstance(config));
@@ -75,7 +78,9 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
     public Winrm4jTool(ConfigBag config) {
         this.bag = checkNotNull(config, "config bag");
         host = getRequiredConfig(config, PROP_HOST);
-        port = getRequiredConfig(config, PROP_PORT);
+        port = config.get(PROP_PORT);
+        useSecureWinrm = config.get(USE_HTTPS_WINRM);
+        authenticationScheme = config.get(USE_NTLM) ? AuthSchemes.NTLM : null;
         user = getRequiredConfig(config, PROP_USER);
         password = getRequiredConfig(config, PROP_PASSWORD);
         execTries = getRequiredConfig(config, PROP_EXEC_TRIES);
@@ -184,7 +189,17 @@ public class Winrm4jTool implements org.apache.brooklyn.util.core.internal.winrm
     }
 
     private io.cloudsoft.winrm4j.winrm.WinRmTool connect() {
-        return io.cloudsoft.winrm4j.winrm.WinRmTool.connect(host+":"+port, user, password);
+        WinRmTool.Builder builder = WinRmTool.Builder.builder(host, user, password);
+        builder.setAuthenticationScheme(authenticationScheme);
+        builder.useHttps(useSecureWinrm);
+        builder.port(port);
+
+        // FIXME USE_HTTPS_WINRM shouldn't disable certificates checks
+        // However to do that Winrm4JTool should also support whitelisting certificates.
+        if (useSecureWinrm) {
+            builder.disableCertificateChecks(true);
+        }
+        return builder.build();
     }
     
     private <T> T getRequiredConfig(ConfigBag bag, ConfigKey<T> key) {


[2/2] brooklyn-server git commit: Closes #1

Posted by sv...@apache.org.
Closes #1

Upgrade winrm4j to version 0.3.1

- added config key for use Https or not
- added config key for using NTLM
- refactor WINRM_PORT usage


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/5b01f8fb
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/5b01f8fb
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/5b01f8fb

Branch: refs/heads/master
Commit: 5b01f8fb2d3aa1d999cd5065994de0737b128876
Parents: f9a59e5 8b9f3ac
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Thu Feb 11 17:04:22 2016 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Feb 11 17:04:22 2016 +0200

----------------------------------------------------------------------
 .../camp/brooklyn/ByonLocationsYamlTest.java    |  2 +-
 .../location/jclouds/JcloudsLocation.java       | 11 +--
 .../jclouds/JcloudsWinRmMachineLocation.java    |  5 --
 .../brooklyn/logback-logger-excludes.xml        |  2 +
 pom.xml                                         |  2 +-
 .../software/base/EmptyWindowsProcess.java      |  2 +-
 .../base/EmptyWindowsProcessWinRmDriver.java    |  3 +-
 .../software/base/VanillaWindowsProcess.java    |  6 +-
 .../base/VanillaWindowsProcessImpl.java         |  9 ++-
 .../base/VanillaWindowsProcessWinRmDriver.java  |  3 +-
 .../location/WinRmMachineLocationLiveTest.java  |  2 +-
 .../winrm/AdvertiseWinrmLoginPolicy.java        |  3 +-
 .../location/winrm/WinRmMachineLocation.java    | 74 ++++++++++++++++----
 .../util/core/internal/winrm/WinRmTool.java     | 13 +++-
 .../internal/winrm/winrm4j/Winrm4jTool.java     | 19 ++++-
 15 files changed, 121 insertions(+), 35 deletions(-)
----------------------------------------------------------------------