You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/05/29 19:22:11 UTC
[18/27] incubator-brooklyn git commit: Adds support for getting
return from WinRmMachineLocation execute commands
Adds support for getting return from WinRmMachineLocation execute commands
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/902f97e4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/902f97e4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/902f97e4
Branch: refs/heads/master
Commit: 902f97e48c02c4c82f6e27fdcd0fc209dd2ead3b
Parents: 96f2f1c
Author: Martin Harris <gi...@nakomis.com>
Authored: Tue May 12 15:56:09 2015 +0100
Committer: Richard Downer <ri...@apache.org>
Committed: Thu May 28 17:27:35 2015 +0100
----------------------------------------------------------------------
.../java/brooklyn/entity/effector/EffectorTasks.java | 10 ++++++++++
.../main/java/brooklyn/location/basic/Machines.java | 6 +++++-
.../brooklyn/location/basic/WinRmMachineLocation.java | 14 +++++++-------
.../main/java/brooklyn/util/flags/TypeCoercions.java | 8 ++++++++
.../brooklyn/util/internal/TypeCoercionsTest.java | 7 +++++++
.../brooklyn/location/jclouds/JcloudsLocation.java | 5 ++---
.../basic/AbstractSoftwareProcessWinRmDriver.java | 13 +++++++------
7 files changed, 46 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/core/src/main/java/brooklyn/entity/effector/EffectorTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/entity/effector/EffectorTasks.java b/core/src/main/java/brooklyn/entity/effector/EffectorTasks.java
index 98e3348..83d27ea 100644
--- a/core/src/main/java/brooklyn/entity/effector/EffectorTasks.java
+++ b/core/src/main/java/brooklyn/entity/effector/EffectorTasks.java
@@ -33,6 +33,7 @@ import brooklyn.entity.basic.BrooklynTaskTags;
import brooklyn.entity.basic.ConfigKeys;
import brooklyn.location.basic.Machines;
import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.location.basic.WinRmMachineLocation;
import brooklyn.management.Task;
import brooklyn.management.TaskAdaptable;
import brooklyn.management.internal.EffectorUtils;
@@ -217,4 +218,13 @@ public class EffectorTasks {
}
}
+ /** Finds a unique {@link WinRmMachineLocation} attached to the supplied entity
+ * @throws IllegalStateException if there is not a unique such {@link WinRmMachineLocation} */
+ public static WinRmMachineLocation getWinRmMachine(Entity entity) {
+ try {
+ return Machines.findUniqueWinRmMachineLocation(entity.getLocations()).get();
+ } catch (Exception e) {
+ throw new IllegalStateException("Entity "+entity+" (in "+Tasks.current()+") requires a single WinRmMachineLocation, but has "+entity.getLocations(), e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/core/src/main/java/brooklyn/location/basic/Machines.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/Machines.java b/core/src/main/java/brooklyn/location/basic/Machines.java
index 1f36a16..103870f 100644
--- a/core/src/main/java/brooklyn/location/basic/Machines.java
+++ b/core/src/main/java/brooklyn/location/basic/Machines.java
@@ -95,6 +95,10 @@ public class Machines {
return findUniqueElement(locations, SshMachineLocation.class);
}
+ public static Maybe<WinRmMachineLocation> findUniqueWinRmMachineLocation(Iterable<? extends Location> locations) {
+ return findUniqueElement(locations, WinRmMachineLocation.class);
+ }
+
public static Maybe<String> findSubnetHostname(Iterable<? extends Location> ll) {
Maybe<MachineLocation> l = findUniqueMachineLocation(ll);
if (!l.isPresent()) {
@@ -169,5 +173,5 @@ public class Machines {
}
return false;
}
-
+
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/core/src/main/java/brooklyn/location/basic/WinRmMachineLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/basic/WinRmMachineLocation.java b/core/src/main/java/brooklyn/location/basic/WinRmMachineLocation.java
index 6ca6869..d535d34 100644
--- a/core/src/main/java/brooklyn/location/basic/WinRmMachineLocation.java
+++ b/core/src/main/java/brooklyn/location/basic/WinRmMachineLocation.java
@@ -101,17 +101,17 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
return null;
}
- public int executeScript(String script) {
+ public WinRmToolResponse executeScript(String script) {
return executeScript(ImmutableList.of(script));
}
- public int executeScript(List<String> script) {
+ public WinRmToolResponse executeScript(List<String> script) {
Collection<Throwable> exceptions = Lists.newArrayList();
for (int i = 0; i < 10; i++) {
try {
WinRmTool winRmTool = WinRmTool.connect(getHostname(), getUsername(), getPassword());
WinRmToolResponse response = winRmTool.executeScript(script);
- return response.getStatusCode();
+ return response;
} catch (Exception e) {
LOG.warn("ignoring winrm exception and retrying:", e);
exceptions.add(e);
@@ -120,17 +120,17 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
throw Exceptions.propagate("failed to execute powershell script", exceptions);
}
- public int executePsScript(String psScript) {
+ public WinRmToolResponse executePsScript(String psScript) {
return executePsScript(ImmutableList.of(psScript));
}
- public int executePsScript(List<String> psScript) {
+ public WinRmToolResponse executePsScript(List<String> psScript) {
Collection<Throwable> exceptions = Lists.newArrayList();
for (int i = 0; i < 10; i++) {
try {
WinRmTool winRmTool = WinRmTool.connect(getHostname(), getUsername(), getPassword());
WinRmToolResponse response = winRmTool.executePs(psScript);
- return response.getStatusCode();
+ return response;
} catch (Exception e) {
LOG.warn("ignoring winrm exception and retrying after 5 seconds:", e);
Time.sleep(Duration.FIVE_SECONDS);
@@ -187,7 +187,7 @@ public class WinRmMachineLocation extends AbstractLocation implements MachineLoc
String unencodePowershell =
"$RDP = Get-WmiObject -Class Win32_TerminalServiceSetting -ComputerName $env:computername -Namespace root\\CIMV2\\TerminalServices -Authentication PacketPrivacy\r\n" +
"$RDP.SetAllowTSConnections(1,1)\r\n" +
- "Set-ExecutionPolicy Unrestricted\r\n" +
+ "Set-ExecutionPolicy Unrestricted -Force\r\n" +
"Set-Item WSMan:\\localhost\\Shell\\MaxConcurrentUsers 100\r\n" +
"Set-Item WSMan:\\localhost\\Shell\\MaxMemoryPerShellMB 0\r\n" +
"Set-Item WSMan:\\localhost\\Shell\\MaxProcessesPerShell 0\r\n" +
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
index 6c6ecac..74ada77 100644
--- a/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
+++ b/core/src/main/java/brooklyn/util/flags/TypeCoercions.java
@@ -31,6 +31,7 @@ import java.math.BigInteger;
import java.net.InetAddress;
import java.net.URI;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -709,6 +710,13 @@ public class TypeCoercions {
return QuorumChecks.of(input);
}
});
+ registerAdapter(ArrayList.class, String[].class, new Function<ArrayList, String[]>() {
+ @Nullable
+ @Override
+ public String[] apply(@Nullable ArrayList arrayList) {
+ return (String[]) arrayList.toArray(new String[]{});
+ }
+ });
registerAdapter(String.class, Map.class, new Function<String,Map>() {
@Override
public Map apply(final String input) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java b/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
index b4d0470..3133b22 100644
--- a/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
+++ b/core/src/test/java/brooklyn/util/internal/TypeCoercionsTest.java
@@ -22,6 +22,7 @@ import static org.testng.Assert.assertEquals;
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -42,6 +43,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
import com.google.common.reflect.TypeToken;
public class TypeCoercionsTest {
@@ -307,6 +309,11 @@ public class TypeCoercionsTest {
assertEquals(TypeCoercions.coerce("1.0", Number.class), (Number) Double.valueOf(1.0));
}
+ @Test
+ public void testArrayListToArray() {
+ assertEquals(TypeCoercions.coerce(Lists.newArrayList("Foo", "Bar", "Baz"), String[].class), new String[] {"Foo", "Bar", "Baz"});
+ }
+
@Test(expectedExceptions = ClassCoercionException.class)
public void testInvalidCoercionThrowsClassCoercionException() {
TypeCoercions.coerce(new Object(), TypeToken.of(Integer.class));
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 3aeaf13..7a2a0da 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -1255,8 +1255,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
LOG.warn("Ignoring request to set template option {} because this is not supported by {}", new Object[] { option.getKey(), clazz.getCanonicalName() });
}
}
- }
- })
+ }})
.build();
/** hook whereby template customizations can be made for various clouds */
@@ -2018,7 +2017,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
try {
// FIXME: Needs to release port forwarding for WinRmMachineLocations
- if (machine.getMachineDetails().getOsDetails() != null && !machine.getMachineDetails().getOsDetails().isWindows()) {
+ if (machine.getMachineDetails() != null && machine.getMachineDetails().getOsDetails() != null && !machine.getMachineDetails().getOsDetails().isWindows()) {
releasePortForwarding((SshMachineLocation)machine);
}
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/902f97e4/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessWinRmDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessWinRmDriver.java b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessWinRmDriver.java
index d865c4d..af6a80c 100644
--- a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessWinRmDriver.java
+++ b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessWinRmDriver.java
@@ -27,6 +27,7 @@ import brooklyn.config.ConfigKey;
import brooklyn.event.AttributeSensor;
import brooklyn.event.basic.Sensors;
import brooklyn.location.basic.WinRmMachineLocation;
+import io.cloudsoft.winrm4j.winrm.WinRmToolResponse;
import com.google.api.client.util.Strings;
import com.google.common.collect.ImmutableList;
@@ -107,12 +108,12 @@ public abstract class AbstractSoftwareProcessWinRmDriver extends AbstractSoftwar
getLocation().executePsScript("New-Item -path \"" + directoryName + "\" -type directory -ErrorAction SilentlyContinue");
}
- protected boolean executeCommand(ConfigKey<String> regularCommandKey, ConfigKey<String> powershellCommandKey, boolean allowNoOp) {
+ 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 (allowNoOp) {
- return true;
+ return new WinRmToolResponse("", "", 0);
} else {
throw new IllegalStateException(String.format("Exactly one of %s or %s must be set", regularCommandKey.getName(), powershellCommandKey.getName()));
}
@@ -121,18 +122,18 @@ public abstract class AbstractSoftwareProcessWinRmDriver extends AbstractSoftwar
}
if (Strings.isNullOrEmpty(regularCommand)) {
- return getLocation().executePsScript(ImmutableList.of(powershellCommand)) == 0;
+ return getLocation().executePsScript(ImmutableList.of(powershellCommand));
} else {
- return getLocation().executeScript(ImmutableList.of(regularCommand)) == 0;
+ return getLocation().executeScript(ImmutableList.of(regularCommand));
}
}
public int execute(List<String> script) {
- return getLocation().executeScript(script);
+ return getLocation().executeScript(script).getStatusCode();
}
public int executePowerShell(List<String> psScript) {
- return getLocation().executePsScript(psScript);
+ return getLocation().executePsScript(psScript).getStatusCode();
}
public int copyTo(File source, File destination) {