From e07c3a925b14ef9812a505f44262bd907b76723a Mon Sep 17 00:00:00 2001 From: Christopher Dancy Date: Sun, 22 Jun 2014 11:18:42 -0400 Subject: [PATCH] JCLOUDS-610: Return the affected nodes from resumeNodesMatching, suspendNodesMatching and rebootNodesMatching Methods have been refactored to match the functionality provided by destroyNodesMatching. --- .../java/org/jclouds/compute/ComputeService.java | 12 ++- .../compute/internal/BaseComputeService.java | 96 ++++++++++++++-------- .../internal/BaseComputeServiceLiveTest.java | 26 +++++- 3 files changed, 94 insertions(+), 40 deletions(-) diff --git a/compute/src/main/java/org/jclouds/compute/ComputeService.java b/compute/src/main/java/org/jclouds/compute/ComputeService.java index cb9e37a..7aa6133 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeService.java @@ -190,12 +190,14 @@ * * affected nodes may not resume with the same IP address(es) * + * @return list of nodes resumed + * * @throws UnsupportedOperationException * if the underlying provider doesn't support suspend/resume * @throws NoSuchElementException * if no nodes matched the predicate specified */ - void resumeNodesMatching(Predicate filter); + Set resumeNodesMatching(Predicate filter); /** * suspend the node, given its id. This will result in @@ -218,12 +220,14 @@ * * affected nodes may not resume with the same IP address(es) * + * @return list of nodes suspended + * * @throws UnsupportedOperationException * if the underlying provider doesn't support suspend/resume * @throws NoSuchElementException * if no nodes matched the predicate specified */ - void suspendNodesMatching(Predicate filter); + Set suspendNodesMatching(Predicate filter); /** * destroy the node, given its id. If it is the only node in a tag set, the dependent resources @@ -249,10 +253,12 @@ * nodes matching the filter are treated as a logical set. Using this command, you can save time * by rebooting the nodes in parallel. * + * @return list of nodes rebooted + * * @throws NoSuchElementException * if no nodes matched the predicate specified */ - void rebootNodesMatching(Predicate filter); + Set rebootNodesMatching(Predicate filter); /** * Find a node by its id. diff --git a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java index 1efb6bd..4fb8df1 100644 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java @@ -23,7 +23,6 @@ import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Sets.newLinkedHashSet; -import static com.google.common.util.concurrent.Futures.immediateFuture; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; @@ -252,7 +251,7 @@ public void destroyNode(String id) { @Override public Set destroyNodesMatching(Predicate filter) { logger.debug(">> destroying nodes matching(%s)", filter); - Set set = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), + Set destroyNodes = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), new Function>() { // TODO make an async interface instead of re-wrapping @@ -270,10 +269,10 @@ public String toString() { } }, userExecutor, null, logger, "destroyNodesMatching(" + filter + ")")); - logger.debug("<< destroyed(%d)", set.size()); + logger.debug("<< destroyed(%d)", destroyNodes.size()); - cleanUpIncidentalResourcesOfDeadNodes(set); - return set; + cleanUpIncidentalResourcesOfDeadNodes(destroyNodes); + return destroyNodes; } /** @@ -423,24 +422,34 @@ public void rebootNode(String id) { boolean successful = nodeRunning.apply(node); logger.debug("<< rebooted node(%s) success(%s)", id, successful); } - + /** * {@inheritDoc} */ @Override - public void rebootNodesMatching(Predicate filter) { + public Set rebootNodesMatching(Predicate filter) { logger.debug(">> rebooting nodes matching(%s)", filter); - transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), - new Function>() { - // TODO use native async + Set rebootNodes = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), + new Function>() { + + // TODO make an async interface instead of re-wrapping @Override - public ListenableFuture apply(NodeMetadata from) { - rebootNode(from.getId()); - return immediateFuture(null); + public ListenableFuture apply(final NodeMetadata from) { + return userExecutor.submit(new Callable() { + public NodeMetadata call() throws Exception { + rebootNode(from.getId()); + return from; + } + public String toString() { + return "rebootNode(" + from.getId() + ")"; + } + }); } - }, userExecutor, null, logger, "rebootNodesMatching(" + filter + ")"); - logger.debug("<< rebooted"); + }, userExecutor, null, logger, "rebootNodesMatching(" + filter + ")")); + logger.debug("<< rebooted(%d)", rebootNodes.size()); + + return rebootNodes; } /** @@ -459,19 +469,29 @@ public void resumeNode(String id) { * {@inheritDoc} */ @Override - public void resumeNodesMatching(Predicate filter) { + public Set resumeNodesMatching(Predicate filter) { logger.debug(">> resuming nodes matching(%s)", filter); - transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), - new Function>() { - // TODO use native async + Set resumeNodes = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), + new Function>() { + + // TODO make an async interface instead of re-wrapping @Override - public ListenableFuture apply(NodeMetadata from) { - resumeNode(from.getId()); - return immediateFuture(null); + public ListenableFuture apply(final NodeMetadata from) { + return userExecutor.submit(new Callable() { + public NodeMetadata call() throws Exception { + resumeNode(from.getId()); + return from; + } + public String toString() { + return "resumeNode(" + from.getId() + ")"; + } + }); } - }, userExecutor, null, logger, "resumeNodesMatching(" + filter + ")"); - logger.debug("<< resumed"); + }, userExecutor, null, logger, "resumeNodesMatching(" + filter + ")")); + logger.debug("<< resumed(%d)", resumeNodes.size()); + + return resumeNodes; } /** @@ -490,19 +510,29 @@ public void suspendNode(String id) { * {@inheritDoc} */ @Override - public void suspendNodesMatching(Predicate filter) { + public Set suspendNodesMatching(Predicate filter) { logger.debug(">> suspending nodes matching(%s)", filter); - transformParallel(nodesMatchingFilterAndNotTerminatedExceptionIfNotFound(filter), - new Function>() { - // TODO use native async + Set suspendNodes = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), + new Function>() { + + // TODO make an async interface instead of re-wrapping @Override - public ListenableFuture apply(NodeMetadata from) { - suspendNode(from.getId()); - return immediateFuture(null); + public ListenableFuture apply(final NodeMetadata from) { + return userExecutor.submit(new Callable() { + public NodeMetadata call() throws Exception { + suspendNode(from.getId()); + return from; + } + public String toString() { + return "suspendNode(" + from.getId() + ")"; + } + }); } - }, userExecutor, null, logger, "suspendNodesMatching(" + filter + ")"); - logger.debug("<< suspended"); + }, userExecutor, null, logger, "suspendNodesMatching(" + filter + ")")); + logger.debug("<< suspended(%d)", suspendNodes.size()); + + return suspendNodes; } /** diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java index 856fde0..7fb19f5 100644 --- a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java @@ -548,16 +548,28 @@ protected void assertNodeZero(Collection metadataSet) { } @Test(enabled = true, dependsOnMethods = "testGet") - public void testReboot() throws Exception { - client.rebootNodesMatching(inGroup(group));// TODO test + public void testReboot() throws Exception { + Set rebootNodes = client.rebootNodesMatching(inGroup(group)); + for (ComputeMetadata node : rebootNodes) { + assertNotNull(node); + assert node.getProviderId() != null : node; + assert node.getLocation() != null : node; + } + // validation testGet(); } @Test(enabled = true, dependsOnMethods = "testReboot") public void testSuspendResume() throws Exception { - client.suspendNodesMatching(inGroup(group)); + Set suspendedNodes = client.suspendNodesMatching(inGroup(group)); + for (ComputeMetadata node : suspendedNodes) { + assertNotNull(node); + assert node.getProviderId() != null : node; + assert node.getLocation() != null : node; + } + Set stoppedNodes = refreshNodes(); assert Iterables.all(stoppedNodes, new Predicate() { @@ -572,7 +584,13 @@ public boolean apply(NodeMetadata input) { }) : stoppedNodes; - client.resumeNodesMatching(inGroup(group)); + Set resumedNodes = client.resumeNodesMatching(inGroup(group)); + for (ComputeMetadata node : resumedNodes) { + assertNotNull(node); + assert node.getProviderId() != null : node; + assert node.getLocation() != null : node; + } + testGet(); } -- 1.9.3