JCLOUDS-256: Add missing API to list environment nodes
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/commit/eecfbf01 Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/tree/eecfbf01 Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/diff/eecfbf01 Branch: refs/heads/master Commit: eecfbf016d9da9dc84b20ec51a610ef148e4dafb Parents: 83f4081 Author: Noorul Islam K M <[email protected]> Authored: Wed Sep 4 12:45:50 2013 +0530 Committer: Ignasi Barrera <[email protected]> Committed: Wed Sep 4 10:39:35 2013 +0200 ---------------------------------------------------------------------- .../src/main/java/org/jclouds/chef/ChefApi.java | 16 +++++++++++ .../org/jclouds/chef/test/TransientChefApi.java | 5 ++++ .../org/jclouds/chef/ChefApiExpectTest.java | 28 ++++++++++++++++++++ .../chef/internal/BaseChefApiLiveTest.java | 12 +++++++++ core/src/test/resources/environment_nodes.json | 5 ++++ 5 files changed, 66 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/blob/eecfbf01/core/src/main/java/org/jclouds/chef/ChefApi.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/ChefApi.java b/core/src/main/java/org/jclouds/chef/ChefApi.java index 9dd1df4..e319ea7 100644 --- a/core/src/main/java/org/jclouds/chef/ChefApi.java +++ b/core/src/main/java/org/jclouds/chef/ChefApi.java @@ -938,4 +938,20 @@ public interface ChefApi extends Closeable { @Path("/environments/{environmentname}/recipes") @Fallback(EmptySetOnNotFoundOr404.class) Set<String> listEnvironmentRecipes(@PathParam("environmentname") String environmentname); + + /** + * @return List of environment nodes. + * @throws AuthorizationException + * <p/> + * "401 Unauthorized" if you are not a recognized user. + * <p/> + * "403 Forbidden" if you do not have rights to list environment nodes. + */ + @SinceApiVersion("0.10.0") + @Named("environment:nodelist") + @GET + @Path("/environments/{environmentname}/nodes") + @ResponseParser(ParseKeySetFromJson.class) + @Fallback(EmptySetOnNotFoundOr404.class) + Set<String> listEnvironmentNodes(@PathParam("environmentname") String environmentname); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/blob/eecfbf01/core/src/main/java/org/jclouds/chef/test/TransientChefApi.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/test/TransientChefApi.java b/core/src/main/java/org/jclouds/chef/test/TransientChefApi.java index 90919b7..ad09275 100644 --- a/core/src/main/java/org/jclouds/chef/test/TransientChefApi.java +++ b/core/src/main/java/org/jclouds/chef/test/TransientChefApi.java @@ -378,6 +378,11 @@ public class TransientChefApi implements ChefApi { } @Override + public Set<String> listEnvironmentNodes(String environmentname) { + throw new UnsupportedOperationException(); + } + + @Override public void close() throws IOException { closer.close(); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/blob/eecfbf01/core/src/test/java/org/jclouds/chef/ChefApiExpectTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/chef/ChefApiExpectTest.java b/core/src/test/java/org/jclouds/chef/ChefApiExpectTest.java index fd34e2c..39e6e5e 100644 --- a/core/src/test/java/org/jclouds/chef/ChefApiExpectTest.java +++ b/core/src/test/java/org/jclouds/chef/ChefApiExpectTest.java @@ -74,6 +74,34 @@ public class ChefApiExpectTest extends BaseChefApiExpectTest<ChefApi> { assertTrue(api.listEnvironmentRecipes("dev").isEmpty()); } + public void testListEnvironmentNodesReturns2xx() { + ChefApi api = requestSendsResponse( + signed(HttpRequest.builder() // + .method("GET") // + .endpoint("http://localhost:4000/environments/dev/nodes") // + .addHeader("X-Chef-Version", ChefApi.VERSION) // + .addHeader("Accept", MediaType.APPLICATION_JSON).build()), // + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType("/environment_nodes.json", MediaType.APPLICATION_JSON)) // + .build()); + Set<String> nodes = api.listEnvironmentNodes("dev"); + assertEquals(nodes.size(), 3); + assertTrue(nodes.contains("blah")); + } + + public void testListEnvironmentNodesReturns404() { + ChefApi api = requestSendsResponse( + signed(HttpRequest.builder() // + .method("GET") // + .endpoint("http://localhost:4000/environments/dev/nodes") // + .addHeader("X-Chef-Version", ChefApi.VERSION) // + .addHeader("Accept", MediaType.APPLICATION_JSON).build()), // + HttpResponse.builder().statusCode(404) + .build()); + + assertTrue(api.listEnvironmentNodes("dev").isEmpty()); + } + @Override protected Module createModule() { return new TestChefRestClientModule(); http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/blob/eecfbf01/core/src/test/java/org/jclouds/chef/internal/BaseChefApiLiveTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/chef/internal/BaseChefApiLiveTest.java b/core/src/test/java/org/jclouds/chef/internal/BaseChefApiLiveTest.java index 7256323..0130821 100644 --- a/core/src/test/java/org/jclouds/chef/internal/BaseChefApiLiveTest.java +++ b/core/src/test/java/org/jclouds/chef/internal/BaseChefApiLiveTest.java @@ -72,6 +72,7 @@ import com.google.common.primitives.Bytes; public abstract class BaseChefApiLiveTest<A extends ChefApi> extends BaseChefLiveTest<A> { public static final String PREFIX = "jcloudstest-" + System.getProperty("user.name"); public static final String ADMIN_PREFIX = "jcloudstest-adm-" + System.getProperty("user.name"); + public static final String ENV_NODE = PREFIX + "-env-node"; // It may take a bit until the search index is populated protected int maxWaitForIndexInMs = 60000; @@ -470,12 +471,23 @@ public abstract class BaseChefApiLiveTest<A extends ChefApi> extends BaseChefLiv assertTrue(!recipeList.isEmpty()); } + @Test(dependsOnMethods = "testCreateEnvironment") + public void testListEnvironmentNodes() { + api.deleteNode(ENV_NODE); + api.createNode(Node.builder().name(ENV_NODE).runListElement("role[" + PREFIX + "]").environment(PREFIX).build()); + node = api.getNode(ENV_NODE); + assertNotNull(node, "Created node should not be null"); + Set<String> nodeList = api.listEnvironmentNodes(PREFIX); + assertTrue(!nodeList.isEmpty()); + } + @AfterClass(groups = { "live", "integration" }) @Override public void tearDown() { api.deleteClient(PREFIX); api.deleteClient(ADMIN_PREFIX); api.deleteNode(PREFIX); + api.deleteNode(ENV_NODE); api.deleteRole(PREFIX); api.deleteDatabag(PREFIX); api.deleteEnvironment(PREFIX); http://git-wip-us.apache.org/repos/asf/incubator-jclouds-chef/blob/eecfbf01/core/src/test/resources/environment_nodes.json ---------------------------------------------------------------------- diff --git a/core/src/test/resources/environment_nodes.json b/core/src/test/resources/environment_nodes.json new file mode 100644 index 0000000..92ef95a --- /dev/null +++ b/core/src/test/resources/environment_nodes.json @@ -0,0 +1,5 @@ +{ + "blah": "https://api.opscode.com/org/directory/nodes/blah", + "boxer": "https://api.opscode.com/org/directory/nodes/boxer", + "blarrrrgh": "https://api.opscode.com/org/directory/nodes/blarrrrgh" +}
