diff --git a/CHANGES.txt b/CHANGES.txt index 34ecd707..cf9de125 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -81,6 +81,9 @@ Trunk (unreleased changes) WHIRR-361. Add Guava as an explicit dependency (Adrian Cole via asavu) + WHIRR-361. Emergency upgrade to jclouds 1.1.1 and improved configure phase + logging (Adrian Cole via asavu) + Release 0.5.0 - 2011-05-16 INCOMPATIBLE CHANGES diff --git a/core/src/main/java/org/apache/whirr/actions/ConfigureClusterAction.java b/core/src/main/java/org/apache/whirr/actions/ConfigureClusterAction.java index 09cc0959..ade8d6a7 100644 --- a/core/src/main/java/org/apache/whirr/actions/ConfigureClusterAction.java +++ b/core/src/main/java/org/apache/whirr/actions/ConfigureClusterAction.java @@ -18,8 +18,12 @@ package org.apache.whirr.actions; +import static com.google.common.base.Preconditions.checkNotNull; + import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import java.io.IOException; @@ -40,6 +44,7 @@ import org.jclouds.compute.RunScriptOnNodesException; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.options.RunScriptOptions; +import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.domain.Credentials; import org.jclouds.scriptbuilder.domain.OsFamily; import org.slf4j.Logger; @@ -71,20 +76,39 @@ protected void doAction(Map eventMap) for (Entry entry : eventMap.entrySet()) { ClusterSpec clusterSpec = entry.getValue().getClusterSpec(); Cluster cluster = entry.getValue().getCluster(); + StatementBuilder statementBuilder = entry.getValue().getStatementBuilder(); + ComputeServiceContext computeServiceContext = getCompute().apply(clusterSpec); ComputeService computeService = computeServiceContext.getComputeService(); + Credentials credentials = new Credentials( clusterSpec.getClusterUser(), clusterSpec.getPrivateKey()); + try { - LOG.info("Running configuration script"); + Map nodesInCluster = getNodesForInstanceIdsInCluster(cluster, computeService); + + if (LOG.isDebugEnabled()) { + LOG.debug("Nodes in cluster: {}", nodesInCluster.values()); + } + + Map nodesToApply = Maps.uniqueIndex( + Iterables.filter(nodesInCluster.values(), + toNodeMetadataPredicate(clusterSpec, cluster, entry.getKey().getRoles())), + getNodeId + ); + + LOG.info("Running configuration script on nodes: {}", nodesToApply.keySet()); if (LOG.isDebugEnabled()) - LOG.debug("Running script:\n{}", statementBuilder.render(OsFamily.UNIX)); + LOG.debug("script:\n{}", statementBuilder.render(OsFamily.UNIX)); + computeService.runScriptOnNodesMatching( - toNodeMetadataPredicate(clusterSpec, cluster, entry.getKey().getRoles()), + withIds(nodesToApply.keySet()), statementBuilder, - RunScriptOptions.Builder.overrideCredentialsWith(credentials)); + RunScriptOptions.Builder.overrideCredentialsWith(credentials) + ); + LOG.info("Configuration script run completed"); } catch (RunScriptOnNodesException e) { // TODO: retry @@ -92,6 +116,43 @@ protected void doAction(Map eventMap) } } } + + private Map getNodesForInstanceIdsInCluster(Cluster cluster, + ComputeService computeService) { + Iterable ids = Iterables.transform(cluster.getInstances(), new Function() { + + @Override + public String apply(Instance arg0) { + return arg0.getId(); + } + + }); + + Set nodes = computeService.listNodesDetailsMatching( + NodePredicates.withIds(Iterables.toArray(ids, String.class))); + + return Maps.uniqueIndex(nodes, getNodeId); + } + + public static Predicate withIds(Iterable ids) { + checkNotNull(ids, "ids must be defined"); + final Set search = ImmutableSet.copyOf(ids); + return new Predicate() { + @Override + public boolean apply(NodeMetadata nodeMetadata) { + return search.contains(nodeMetadata.getId()); + } + }; + } + + private static Function getNodeId = new Function() { + + @Override + public String apply(NodeMetadata arg0) { + return arg0.getId(); + } + + }; private Predicate toNodeMetadataPredicate(final ClusterSpec clusterSpec, final Cluster cluster, final Set roles) { final Map nodeIdToInstanceMap = Maps.newHashMap(); @@ -101,10 +162,6 @@ private Predicate toNodeMetadataPredicate(final ClusterSpec cluste return new Predicate() { @Override public boolean apply(NodeMetadata nodeMetadata) { - // Check it's the correct cluster - if (!clusterSpec.getClusterName().equals(nodeMetadata.getGroup())) { - return false; - } Instance instance = nodeIdToInstanceMap.get(nodeMetadata.getId()); if (instance == null) { LOG.debug("No instance for {} found in map", nodeMetadata); diff --git a/pom.xml b/pom.xml index c7c5de0a..f43c4419 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ - 1.1.0 + 1.1.1