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/09/26 16:37:21 UTC

[4/5] brooklyn-server git commit: JcloudsLocation: pass relevant config to child machine loc

JcloudsLocation: pass relevant config to child machine loc

Previously it only passed a small selection of the config to the child
location. But if you passed additional ssh config values in the
`provisioning.properties` then they wouldn\u2019t get passed through.

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

Branch: refs/heads/master
Commit: aba3f0980d7adfa1d7e9bf601c2ecbf1329a5a9e
Parents: 9c9dd47
Author: Aled Sage <al...@gmail.com>
Authored: Fri Sep 23 21:40:06 2016 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Sep 23 21:40:06 2016 +0100

----------------------------------------------------------------------
 ...bstractCloudMachineProvisioningLocation.java | 35 ++++++++++++----
 .../location/jclouds/JcloudsLocation.java       | 42 +++++++++++++++-----
 ...cloudsSshMachineLocationStubbedLiveTest.java | 27 +++++++++++++
 3 files changed, 86 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/aba3f098/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java b/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
index 90d9f8b..9998834 100644
--- a/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
+++ b/core/src/main/java/org/apache/brooklyn/core/location/cloud/AbstractCloudMachineProvisioningLocation.java
@@ -24,17 +24,26 @@ import java.util.Map;
 import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.location.MachineLocation;
 import org.apache.brooklyn.api.location.MachineProvisioningLocation;
+import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
 import org.apache.brooklyn.core.location.AbstractLocation;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.internal.ssh.SshTool;
+import org.apache.brooklyn.util.text.StringPredicates;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Maps;
 
 public abstract class AbstractCloudMachineProvisioningLocation extends AbstractLocation
-implements MachineProvisioningLocation<MachineLocation>, CloudLocationConfig
-{
-   public AbstractCloudMachineProvisioningLocation() {
-      super();
-   }
+        implements MachineProvisioningLocation<MachineLocation>, CloudLocationConfig {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractCloudMachineProvisioningLocation.class);
+
+    public AbstractCloudMachineProvisioningLocation() {
+        super();
+    }
 
     /** typically wants at least ACCESS_IDENTITY and ACCESS_CREDENTIAL */
     public AbstractCloudMachineProvisioningLocation(Map<?,?> conf) {
@@ -70,6 +79,19 @@ implements MachineProvisioningLocation<MachineLocation>, CloudLocationConfig
     protected ConfigBag extractSshConfig(ConfigBag setup, ConfigBag alt) {
         ConfigBag sshConfig = new ConfigBag();
         
+        for (HasConfigKey<?> key : SshMachineLocation.ALL_SSH_CONFIG_KEYS) {
+            String keyName = key.getConfigKey().getName();
+            if (setup.containsKey(keyName)) {
+                sshConfig.putStringKey(keyName, setup.getStringKey(keyName));
+            } else if (alt.containsKey(keyName)) {
+                sshConfig.putStringKey(keyName, setup.getStringKey(keyName));
+            }
+        }
+        
+        Map<String, Object> sshToolClassProperties = Maps.filterKeys(setup.getAllConfig(), StringPredicates.startsWith(SshMachineLocation.SSH_TOOL_CLASS_PROPERTIES_PREFIX));
+        sshConfig.putAll(sshToolClassProperties);
+
+        // Special cases (preserving old code!)
         if (setup.containsKey(PASSWORD)) {
             sshConfig.copyKeyAs(setup, PASSWORD, SshTool.PROP_PASSWORD);
         } else if (alt.containsKey(PASSWORD)) {
@@ -89,9 +111,6 @@ implements MachineProvisioningLocation<MachineLocation>, CloudLocationConfig
             sshConfig.copyKeyAs(setup, PRIVATE_KEY_PASSPHRASE, SshTool.PROP_PRIVATE_KEY_PASSPHRASE);
         }
 
-        // TODO extract other SshTool properties ?
-        
         return sshConfig;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/aba3f098/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 bc57874..4681ba7 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
@@ -28,7 +28,6 @@ import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.KeyPair;
@@ -129,6 +128,7 @@ import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.ByteSizeStrings;
 import org.apache.brooklyn.util.text.Identifiers;
 import org.apache.brooklyn.util.text.KeyValueParser;
+import org.apache.brooklyn.util.text.StringPredicates;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
@@ -2481,13 +2481,10 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
 
         if (isManaged()) {
             return getManagementContext().getLocationManager().createLocation(LocationSpec.create(JcloudsSshMachineLocation.class)
+                    .configure(sshConfig)
                     .configure("displayName", vmHostname)
                     .configure("address", address)
                     .configure(JcloudsSshMachineLocation.SSH_PORT, sshHostAndPort.isPresent() ? sshHostAndPort.get().getPort() : node.getLoginPort())
-                    // don't think "config" does anything
-                    .configure(sshConfig)
-                    // FIXME remove "config" -- inserted directly, above
-                    .configure("config", sshConfig)
                     .configure("user", userCredentials.getUser())
                     .configure(SshMachineLocation.PASSWORD.getName(), sshConfig.get(SshMachineLocation.PASSWORD.getName()) != null ?
                             sshConfig.get(SshMachineLocation.PASSWORD.getName()) :
@@ -2509,13 +2506,10 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         } else {
             LOG.warn("Using deprecated JcloudsSshMachineLocation constructor because "+this+" is not managed");
             return new JcloudsSshMachineLocation(MutableMap.builder()
+                    .putAll(sshConfig)
                     .put("displayName", vmHostname)
                     .put("address", address)
                     .put("port", sshHostAndPort.isPresent() ? sshHostAndPort.get().getPort() : node.getLoginPort())
-                    // don't think "config" does anything
-                    .putAll(sshConfig)
-                    // FIXME remove "config" -- inserted directly, above
-                    .put("config", sshConfig)
                     .put("user", userCredentials.getUser())
                     .putIfNotNull(SshMachineLocation.PASSWORD.getName(), sshConfig.get(SshMachineLocation.PASSWORD.getName()) != null ?
                             SshMachineLocation.PASSWORD.getName() :
@@ -2547,6 +2541,7 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
     }
 
     protected JcloudsWinRmMachineLocation createWinRmMachineLocation(ComputeService computeService, NodeMetadata node, String vmHostname, Optional<HostAndPort> sshHostAndPort, ConfigBag setup) {
+        Map<?,?> winrmConfig = extractWinrmConfig(setup, node);
         String nodeAvailabilityZone = extractAvailabilityZone(setup, node);
         String nodeRegion = extractRegion(setup, node);
         if (nodeRegion == null) {
@@ -2558,13 +2553,13 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
 
         if (isManaged()) {
             return getManagementContext().getLocationManager().createLocation(LocationSpec.create(JcloudsWinRmMachineLocation.class)
+                    .configure(winrmConfig)
                     .configure("jcloudsParent", this)
                     .configure("displayName", vmHostname)
                     .configure("address", address)
                     .configure(WinRmMachineLocation.WINRM_CONFIG_PORT, sshHostAndPort.isPresent() ? sshHostAndPort.get().getPort() : node.getLoginPort())
                     .configure("user", getUser(setup))
                     .configure(WinRmMachineLocation.USER, setup.get(USER))
-                    .configure(ConfigBag.newInstance().copyKeyAs(setup, PASSWORD, WinRmMachineLocation.PASSWORD).getAllConfigRaw())
                     .configure("node", node)
                     .configureIfNotNull(CLOUD_AVAILABILITY_ZONE_ID, nodeAvailabilityZone)
                     .configureIfNotNull(CLOUD_REGION_ID, nodeRegion)
@@ -2590,6 +2585,33 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im
         return extractSshConfig(setup, nodeConfig).getAllConfig();
     }
 
+    protected Map<String,Object> extractWinrmConfig(ConfigBag setup, NodeMetadata node) {
+        ConfigBag nodeConfig = new ConfigBag();
+        if (node!=null && node.getCredentials() != null) {
+            nodeConfig.putIfNotNull(PASSWORD, node.getCredentials().getOptionalPassword().orNull());
+            nodeConfig.putIfNotNull(PRIVATE_KEY_DATA, node.getCredentials().getOptionalPrivateKey().orNull());
+        }
+        return extractWinrmConfig(setup, nodeConfig).getAllConfig();
+    }
+
+    protected ConfigBag extractWinrmConfig(ConfigBag setup, ConfigBag alt) {
+        ConfigBag winrmConfig = new ConfigBag();
+        
+        for (HasConfigKey<?> key : WinRmMachineLocation.ALL_WINRM_CONFIG_KEYS) {
+            String keyName = key.getConfigKey().getName();
+            if (setup.containsKey(keyName)) {
+                winrmConfig.putStringKey(keyName, setup.getStringKey(keyName));
+            } else if (alt.containsKey(keyName)) {
+                winrmConfig.putStringKey(keyName, setup.getStringKey(keyName));
+            }
+        }
+        
+        Map<String, Object> winrmToolClassProperties = Maps.filterKeys(setup.getAllConfig(), StringPredicates.startsWith(WinRmMachineLocation.WINRM_TOOL_CLASS_PROPERTIES_PREFIX));
+        winrmConfig.putAll(winrmToolClassProperties);
+        
+        return winrmConfig;
+    }
+
     protected String extractAvailabilityZone(ConfigBag setup, NodeMetadata node) {
         return extractNodeLocationId(setup, node, LocationScope.ZONE);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/aba3f098/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsSshMachineLocationStubbedLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsSshMachineLocationStubbedLiveTest.java b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsSshMachineLocationStubbedLiveTest.java
index ca89d12..be29cdc 100644
--- a/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsSshMachineLocationStubbedLiveTest.java
+++ b/locations/jclouds/src/test/java/org/apache/brooklyn/location/jclouds/JcloudsSshMachineLocationStubbedLiveTest.java
@@ -25,9 +25,14 @@ import java.util.Map;
 
 import org.apache.brooklyn.location.jclouds.StubbedComputeServiceRegistry.AbstractNodeCreator;
 import org.apache.brooklyn.location.jclouds.StubbedComputeServiceRegistry.NodeCreator;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
+import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
+import org.apache.brooklyn.util.core.internal.ssh.SshTool;
+import org.apache.brooklyn.util.core.internal.winrm.WinRmTool;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.NodeMetadata.Status;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.domain.LoginCredentials;
 import org.slf4j.Logger;
@@ -97,4 +102,26 @@ public class JcloudsSshMachineLocationStubbedLiveTest extends AbstractJcloudsStu
         assertEquals(machine.getSubnetIp(), privateAddresses.get(0));
         assertEquals(machine.getSubnetHostname(), privateAddresses.get(0));
     }
+    
+    @Test(groups={"Live", "Live-sanity"})
+    public void testSshConfigPassedToMachine() throws Exception {
+        JcloudsSshMachineLocation machine = obtainMachine(ImmutableMap.of(
+                SshMachineLocation.LOCAL_TEMP_DIR.getName(), "/my/local/temp/dir",
+                SshMachineLocation.LOG_PREFIX.getName(), "myLogPrefix",
+                SshTool.PROP_SSH_TRIES, 123));
+        assertEquals(machine.config().get(SshMachineLocation.LOCAL_TEMP_DIR), "/my/local/temp/dir");
+        assertEquals(machine.config().get(SshMachineLocation.LOG_PREFIX), "myLogPrefix");
+        assertEquals(machine.config().get(SshTool.PROP_SSH_TRIES), Integer.valueOf(123));
+    }
+    
+    @Test(groups={"Live", "Live-sanity"})
+    public void testWinrmConfigPassedToMachine() throws Exception {
+        JcloudsWinRmMachineLocation machine = obtainWinrmMachine(ImmutableMap.of(
+                JcloudsLocation.OS_FAMILY_OVERRIDE.getName(), OsFamily.WINDOWS,
+                JcloudsLocation.WAIT_FOR_WINRM_AVAILABLE.getName(), "false",
+                WinRmMachineLocation.COPY_FILE_CHUNK_SIZE_BYTES.getName(), 123,
+                WinRmTool.PROP_EXEC_TRIES.getName(), 456));
+        assertEquals(machine.config().get(WinRmMachineLocation.COPY_FILE_CHUNK_SIZE_BYTES), Integer.valueOf(123));
+        assertEquals(machine.config().get(WinRmTool.PROP_EXEC_TRIES), Integer.valueOf(456));
+    }
 }