From 3cd242502dd23067f029c230c09ec8f2c062e22f Mon Sep 17 00:00:00 2001 From: Aled Sage Date: Fri, 30 Sep 2011 17:31:03 +0100 Subject: [PATCH 1/3] issue 702: NodeRunning predicate throws IllegalStateException when state is terminated --- .../NodePresentAndInIntendedState.java | 13 ++- .../compute/predicates/NodeRunning.java | 3 +- .../predicates/NodePredicatesTest.java | 82 +++++++++++++++++++ 3 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java diff --git a/compute/src/main/java/org/jclouds/compute/predicates/NodePresentAndInIntendedState.java b/compute/src/main/java/org/jclouds/compute/predicates/NodePresentAndInIntendedState.java index 53c4f77c55..dd79eaa8b6 100644 --- a/compute/src/main/java/org/jclouds/compute/predicates/NodePresentAndInIntendedState.java +++ b/compute/src/main/java/org/jclouds/compute/predicates/NodePresentAndInIntendedState.java @@ -20,6 +20,8 @@ package org.jclouds.compute.predicates; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Set; + import javax.annotation.Resource; import javax.inject.Singleton; @@ -29,6 +31,7 @@ import org.jclouds.compute.domain.NodeState; import org.jclouds.logging.Logger; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; /** @@ -42,13 +45,19 @@ public class NodePresentAndInIntendedState implements Predicate { private final ComputeService client; private final NodeState intended; + private final Set invalids; @Resource protected Logger logger = Logger.NULL; @Inject public NodePresentAndInIntendedState(NodeState intended, ComputeService client) { + this(intended, ImmutableSet.of(NodeState.ERROR), client); + } + + public NodePresentAndInIntendedState(NodeState intended, Set invalids, ComputeService client) { this.intended = intended; this.client = client; + this.invalids = invalids; } public boolean apply(NodeMetadata node) { @@ -57,9 +66,9 @@ public class NodePresentAndInIntendedState implements Predicate { if (node == null) return false; logger.trace("%s: looking for node state %s: currently: %s", node.getId(), intended, node.getState()); - if (node.getState() == NodeState.ERROR) + if (invalids.contains(node.getState())) throw new IllegalStateException("node " + node.getId() + " in location " + node.getLocation() - + " is in error state"); + + " is in invalid state "+node.getState()); return node.getState() == intended; } diff --git a/compute/src/main/java/org/jclouds/compute/predicates/NodeRunning.java b/compute/src/main/java/org/jclouds/compute/predicates/NodeRunning.java index bb38120f1d..0c03ce697d 100644 --- a/compute/src/main/java/org/jclouds/compute/predicates/NodeRunning.java +++ b/compute/src/main/java/org/jclouds/compute/predicates/NodeRunning.java @@ -23,6 +23,7 @@ import javax.inject.Singleton; import org.jclouds.compute.ComputeService; import org.jclouds.compute.domain.NodeState; +import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; /** @@ -36,6 +37,6 @@ public class NodeRunning extends NodePresentAndInIntendedState { @Inject public NodeRunning(ComputeService client) { - super(NodeState.RUNNING, client); + super(NodeState.RUNNING, ImmutableSet.of(NodeState.ERROR, NodeState.TERMINATED), client); } } diff --git a/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java b/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java new file mode 100644 index 0000000000..987745f05b --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java @@ -0,0 +1,82 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.compute.predicates; + +import static org.easymock.EasyMock.expect; +import static org.easymock.classextension.EasyMock.createMock; +import static org.easymock.classextension.EasyMock.replay; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +/** + * Tests possible uses of OperatingSystemPredicates + * + * @author Aled Sage + */ +@Test +public class NodePredicatesTest { + + private NodeMetadata node; + private ComputeService computeService; + + @BeforeMethod + public void setUp() throws Exception { + node = createMock(NodeMetadata.class); + computeService = createMock(ComputeService.class); + + expect(node.getId()).andReturn("myid").anyTimes(); + expect(computeService.getNodeMetadata("myid")).andReturn(node).anyTimes(); + expect(node.getLocation()).andReturn(null).anyTimes(); + } + + @Test + public void testNodeRunningReturnsTrueWhenRunning() { + expect(node.getState()).andReturn(NodeState.RUNNING).atLeastOnce(); + replay(node); + replay(computeService); + + NodeRunning nodeRunning = new NodeRunning(computeService); + Assert.assertTrue(nodeRunning.apply(node)); + } + + @Test(expectedExceptions=IllegalStateException.class) + public void testNodeRunningFailsOnTerminated() { + expect(node.getState()).andReturn(NodeState.TERMINATED).atLeastOnce(); + replay(node); + replay(computeService); + + NodeRunning nodeRunning = new NodeRunning(computeService); + nodeRunning.apply(node); + } + + @Test(expectedExceptions=IllegalStateException.class) + public void testNodeRunningFailsOnError() { + expect(node.getState()).andReturn(NodeState.ERROR).atLeastOnce(); + replay(node); + replay(computeService); + + NodeRunning nodeRunning = new NodeRunning(computeService); + nodeRunning.apply(node); + } +} From 557445db574bf4348bd69794536266090b8c2c3a Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 30 Sep 2011 10:49:25 -0700 Subject: [PATCH 2/3] fixed unit test to be single-threaded as mocks aren't threadsafe --- .../java/org/jclouds/compute/predicates/NodePredicatesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java b/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java index 987745f05b..365259791c 100644 --- a/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java +++ b/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java @@ -34,7 +34,7 @@ import org.testng.annotations.Test; * * @author Aled Sage */ -@Test +@Test(singleThreaded = true, testName = "NodePredicatesTest") public class NodePredicatesTest { private NodeMetadata node; From 90037fb65691cbbcc4141570adf566303fdf65f1 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 30 Sep 2011 10:49:58 -0700 Subject: [PATCH 3/3] formatting --- .../predicates/NodePredicatesTest.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java b/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java index 365259791c..0abfcd9cb9 100644 --- a/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java +++ b/compute/src/test/java/org/jclouds/compute/predicates/NodePredicatesTest.java @@ -44,39 +44,39 @@ public class NodePredicatesTest { public void setUp() throws Exception { node = createMock(NodeMetadata.class); computeService = createMock(ComputeService.class); - + expect(node.getId()).andReturn("myid").anyTimes(); expect(computeService.getNodeMetadata("myid")).andReturn(node).anyTimes(); expect(node.getLocation()).andReturn(null).anyTimes(); } - + @Test public void testNodeRunningReturnsTrueWhenRunning() { - expect(node.getState()).andReturn(NodeState.RUNNING).atLeastOnce(); - replay(node); - replay(computeService); - - NodeRunning nodeRunning = new NodeRunning(computeService); - Assert.assertTrue(nodeRunning.apply(node)); + expect(node.getState()).andReturn(NodeState.RUNNING).atLeastOnce(); + replay(node); + replay(computeService); + + NodeRunning nodeRunning = new NodeRunning(computeService); + Assert.assertTrue(nodeRunning.apply(node)); } - @Test(expectedExceptions=IllegalStateException.class) + @Test(expectedExceptions = IllegalStateException.class) public void testNodeRunningFailsOnTerminated() { - expect(node.getState()).andReturn(NodeState.TERMINATED).atLeastOnce(); - replay(node); - replay(computeService); - - NodeRunning nodeRunning = new NodeRunning(computeService); - nodeRunning.apply(node); - } - - @Test(expectedExceptions=IllegalStateException.class) - public void testNodeRunningFailsOnError() { - expect(node.getState()).andReturn(NodeState.ERROR).atLeastOnce(); - replay(node); - replay(computeService); + expect(node.getState()).andReturn(NodeState.TERMINATED).atLeastOnce(); + replay(node); + replay(computeService); - NodeRunning nodeRunning = new NodeRunning(computeService); - nodeRunning.apply(node); + NodeRunning nodeRunning = new NodeRunning(computeService); + nodeRunning.apply(node); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testNodeRunningFailsOnError() { + expect(node.getState()).andReturn(NodeState.ERROR).atLeastOnce(); + replay(node); + replay(computeService); + + NodeRunning nodeRunning = new NodeRunning(computeService); + nodeRunning.apply(node); } }