You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ev...@apache.org on 2013/11/25 21:16:10 UTC

git commit: The get and delete methods for the Marconi Message API.

Updated Branches:
  refs/heads/master 3e54454a2 -> ed814ce29


The get and delete methods for the Marconi Message API.


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/ed814ce2
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/ed814ce2
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/ed814ce2

Branch: refs/heads/master
Commit: ed814ce29f9ab402e9dde12a31f7d2990f8dc45c
Parents: 3e54454
Author: Everett Toews <ev...@rackspace.com>
Authored: Mon Nov 25 09:46:35 2013 -0600
Committer: Everett Toews <ev...@rackspace.com>
Committed: Mon Nov 25 14:15:51 2013 -0600

----------------------------------------------------------------------
 .../marconi/v1/binders/BindIdsToQueryParam.java |  2 +-
 .../openstack/marconi/v1/domain/Queue.java      |  2 +-
 .../marconi/v1/features/MessageApi.java         | 45 +++++++++++++++--
 .../openstack/marconi/v1/features/QueueApi.java |  2 +-
 .../marconi/v1/functions/ParseMessage.java      | 51 ++++++++++++++++++++
 .../v1/functions/ParseMessagesToList.java       |  2 +-
 .../marconi/v1/features/MessageApiLiveTest.java | 42 +++++++++++++---
 .../marconi/v1/features/MessageApiMockTest.java | 50 +++++++++++++++++++
 .../marconi/v1/features/QueueApiLiveTest.java   | 28 +++++------
 .../v1/internal/BaseMarconiApiLiveTest.java     | 19 ++++++++
 10 files changed, 212 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/binders/BindIdsToQueryParam.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/binders/BindIdsToQueryParam.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/binders/BindIdsToQueryParam.java
index 48c2fae..493420d 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/binders/BindIdsToQueryParam.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/binders/BindIdsToQueryParam.java
@@ -36,7 +36,7 @@ public class BindIdsToQueryParam implements Binder {
    @Override
    public <R extends HttpRequest> R bindToRequest(R request, Object input) {
       checkArgument(input instanceof Iterable<?>, "This binder is only valid for Iterable");
-      Iterable<String> ids = (Iterable<String>) checkNotNull(input, "Iterable of Strings");
+      Iterable<String> ids = (Iterable<String>) input;
       checkArgument(Iterables.size(ids) > 0, "You must specify at least one id");
 
       return (R) request.toBuilder().replaceQueryParam("ids", Joiner.on(',').join(ids)).build();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/domain/Queue.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/domain/Queue.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/domain/Queue.java
index 15ac4f0..f8fbebb 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/domain/Queue.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/domain/Queue.java
@@ -37,7 +37,7 @@ public class Queue {
    private final Map<String, String> metadata;
 
    protected Queue(String name, @Nullable Map<String, String> metadata) {
-      this.name = checkNotNull(name, "id required");
+      this.name = checkNotNull(name, "name required");
       this.metadata = metadata;
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
index 9b9fcb8..5dc0aa9 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
@@ -16,16 +16,16 @@
  */
 package org.jclouds.openstack.marconi.v1.features;
 
-import org.jclouds.Fallbacks;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.marconi.v1.binders.BindIdsToQueryParam;
 import org.jclouds.openstack.marconi.v1.domain.CreateMessage;
 import org.jclouds.openstack.marconi.v1.domain.Message;
 import org.jclouds.openstack.marconi.v1.domain.MessageStream;
 import org.jclouds.openstack.marconi.v1.domain.MessagesCreated;
-import org.jclouds.openstack.marconi.v1.functions.ParseMessagesToStream;
+import org.jclouds.openstack.marconi.v1.functions.ParseMessage;
 import org.jclouds.openstack.marconi.v1.functions.ParseMessagesCreated;
 import org.jclouds.openstack.marconi.v1.functions.ParseMessagesToList;
+import org.jclouds.openstack.marconi.v1.functions.ParseMessagesToStream;
 import org.jclouds.openstack.marconi.v1.options.StreamMessagesOptions;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
@@ -36,16 +36,19 @@ import org.jclouds.rest.binders.BindToJsonPayload;
 
 import javax.inject.Named;
 import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.HeaderParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
-import javax.ws.rs.QueryParam;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.core.MediaType;
 import java.util.List;
 import java.util.UUID;
 
 import static org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 
 /**
@@ -71,7 +74,7 @@ public interface MessageApi {
    @POST
    @Path("/messages")
    @ResponseParser(ParseMessagesCreated.class)
-   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   @Fallback(NullOnNotFoundOr404.class)
    MessagesCreated create(@HeaderParam("Client-ID") UUID clientId,
                           @BinderParam(BindToJsonPayload.class) List<CreateMessage> messages);
 
@@ -92,7 +95,7 @@ public interface MessageApi {
                         StreamMessagesOptions... options);
 
    /**
-    * List specific messages. Unlike the stream method, a client's own messages are always returned in this operation.
+    * Lists specific messages. Unlike the stream method, a client's own messages are always returned in this operation.
     *
     * @param clientId A UUID for each client instance.
     * @param ids Specifies the IDs of the messages to get.
@@ -107,4 +110,36 @@ public interface MessageApi {
                       @BinderParam(BindIdsToQueryParam.class) Iterable<String> ids);
 
    // TODO: list by claim id when claim API done
+
+   /**
+    * Gets a specific message. Unlike the stream method, a client's own messages are always returned in this operation.
+    *
+    * @param clientId A UUID for each client instance.
+    * @param id Specific ID of the message to get.
+    */
+   @Named("message:get")
+   @GET
+   @ResponseParser(ParseMessage.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/messages/{message_id}")
+   @Fallback(NullOnNotFoundOr404.class)
+   Message get(@HeaderParam("Client-ID") UUID clientId,
+               @PathParam("message_id") String id);
+
+   /**
+    * Deletes specific messages. If any of the message IDs are malformed or non-existent, they are ignored. The
+    * remaining valid messages IDs are deleted.
+    *
+    * @param clientId A UUID for each client instance.
+    * @param ids Specifies the IDs of the messages to delete.
+    */
+   @Named("message:delete")
+   @DELETE
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/messages")
+   @Fallback(FalseOnNotFoundOr404.class)
+   boolean delete(@HeaderParam("Client-ID") UUID clientId,
+                  @BinderParam(BindIdsToQueryParam.class) Iterable<String> ids);
+
+   // TODO: delete by claim id when claim API done
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
index c12bbf3..7df6093 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
@@ -94,7 +94,7 @@ public interface QueueApi {
    boolean exists(@PathParam("name") String name);
 
    /**
-    * List the queues.
+    * Lists the queues.
     *
     * @param detailed Determines whether queue metadata is included in the list.
     */

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessage.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessage.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessage.java
new file mode 100644
index 0000000..436f650
--- /dev/null
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessage.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.openstack.marconi.v1.functions;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.openstack.marconi.v1.domain.Message;
+
+import javax.inject.Inject;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.transform;
+import static org.jclouds.openstack.marconi.v1.functions.ParseMessagesToStream.MessageWithHref;
+import static org.jclouds.openstack.marconi.v1.functions.ParseMessagesToStream.TO_MESSAGE;
+
+/**
+ * @author Everett Toews
+ */
+public class ParseMessage implements Function<HttpResponse, Message> {
+
+   private final ParseJson<MessageWithHref> json;
+
+   @Inject
+   ParseMessage(ParseJson<MessageWithHref> json) {
+      this.json = checkNotNull(json, "json");
+   }
+
+   @Override
+   public Message apply(HttpResponse response) {
+      MessageWithHref messagesWithHref = json.apply(response);
+
+      return TO_MESSAGE.apply(messagesWithHref);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessagesToList.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessagesToList.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessagesToList.java
index d7d0b77..559d9c3 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessagesToList.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/ParseMessagesToList.java
@@ -52,6 +52,6 @@ public class ParseMessagesToList implements Function<HttpResponse, List<Message>
       }
 
       List<MessageWithHref> messagesWithHref = json.apply(response);
-      return Lists.newArrayList(transform(messagesWithHref, TO_MESSAGE));
+      return ImmutableList.copyOf(transform(messagesWithHref, TO_MESSAGE));
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiLiveTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiLiveTest.java
index 279ba20..47cd6e0 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiLiveTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiLiveTest.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import static com.google.common.collect.Iterables.getLast;
 import static org.jclouds.openstack.marconi.v1.options.StreamMessagesOptions.Builder.echo;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -43,7 +44,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
    private final Map<String, List<String>> messageIds = Maps.newHashMap();
 
    public void createQueues() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          boolean success = queueApi.create("jclouds-test");
 
@@ -53,7 +54,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "createQueues" })
    public void streamZeroPagesOfMessages() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
 
@@ -66,7 +67,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "streamZeroPagesOfMessages" })
    public void createMessage() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
 
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
@@ -83,7 +84,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "createMessage" })
    public void streamOnePageOfMessages() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
 
@@ -101,7 +102,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "streamOnePageOfMessages" })
    public void createMessages() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
 
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
@@ -122,7 +123,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "createMessages" })
    public void streamManyPagesOfMessages() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
          messageIds.put(zoneId, new ArrayList<String>());
@@ -145,7 +146,7 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "streamManyPagesOfMessages" })
    public void listMessagesByIds() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
 
@@ -161,8 +162,33 @@ public class MessageApiLiveTest extends BaseMarconiApiLiveTest {
    }
 
    @Test(dependsOnMethods = { "listMessagesByIds" })
+   public void getMessage() throws Exception {
+      for (String zoneId : zones) {
+         MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
+         UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
+
+         Message message = messageApi.get(clientId, getLast(messageIds.get(zoneId)));
+
+         assertNotNull(message.getId());
+         assertNotNull(message.getBody());
+      }
+   }
+
+   @Test(dependsOnMethods = { "getMessage" })
+   public void deleteMessages() throws Exception {
+      for (String zoneId : zones) {
+         MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test");
+         UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
+
+         boolean success = messageApi.delete(clientId, messageIds.get(zoneId));
+
+         assertTrue(success);
+      }
+   }
+
+   @Test(dependsOnMethods = { "deleteMessages" })
    public void delete() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          boolean success = queueApi.delete("jclouds-test");
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiMockTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiMockTest.java
index 8adb244..dbf9799 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiMockTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/MessageApiMockTest.java
@@ -227,4 +227,54 @@ public class MessageApiMockTest extends BaseOpenStackMockTest<MarconiApi> {
          server.shutdown();
       }
    }
+
+   public void getMessage() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(new MockResponse().setBody(accessRackspace));
+      server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"body\": \"{\\\"event\\\":{\\\"name\\\":\\\"Edmonton Java User Group\\\",\\\"attendees\\\":[\\\"bob\\\",\\\"jim\\\",\\\"sally\\\"]}}\", \"age\": 266, \"href\": \"/v1/queues/jclouds-test/messages/5292b30cef913e6d026f4dec\", \"ttl\": 86400}"));
+
+      try {
+         MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
+         MessageApi messageApi = api.getMessageApiForZoneAndQueue("DFW", "jclouds-test");
+         UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
+
+         Message message = messageApi.get(clientId, "5292b30cef913e6d026f4dec");
+
+         assertEquals(message.getId(), "5292b30cef913e6d026f4dec");
+         assertEquals(message.getBody(), "{\"event\":{\"name\":\"Edmonton Java User Group\",\"attendees\":[\"bob\",\"jim\",\"sally\"]}}");
+         assertEquals(message.getAge(), 266);
+         assertEquals(message.getTTL(), 86400);
+
+         assertEquals(server.getRequestCount(), 2);
+         assertEquals(server.takeRequest().getRequestLine(), "POST /tokens HTTP/1.1");
+         assertEquals(server.takeRequest().getRequestLine(), "GET /v1/123123/queues/jclouds-test/messages/5292b30cef913e6d026f4dec HTTP/1.1");
+      }
+      finally {
+         server.shutdown();
+      }
+   }
+
+   public void deleteMessages() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(new MockResponse().setBody(accessRackspace));
+      server.enqueue(new MockResponse().setResponseCode(204));
+
+      try {
+         MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
+         MessageApi messageApi = api.getMessageApiForZoneAndQueue("DFW", "jclouds-test");
+         UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
+         List<String> ids = ImmutableList.of("52936b8a3ac24e6ef4c067dd", "5292b30cef913e6d026f4dec");
+
+         boolean success = messageApi.delete(clientId, ids);
+
+         assertTrue(success);
+
+         assertEquals(server.getRequestCount(), 2);
+         assertEquals(server.takeRequest().getRequestLine(), "POST /tokens HTTP/1.1");
+         assertEquals(server.takeRequest().getRequestLine(), "DELETE /v1/123123/queues/jclouds-test/messages?ids=52936b8a3ac24e6ef4c067dd,5292b30cef913e6d026f4dec HTTP/1.1");
+      }
+      finally {
+         server.shutdown();
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiLiveTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiLiveTest.java
index ae00c64..51f7813 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiLiveTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/QueueApiLiveTest.java
@@ -39,7 +39,7 @@ import static org.testng.Assert.assertTrue;
 public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    public void listZeroPagesOfQueues() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          List<Queue> queues = queueApi.list(false).concat().toList();
 
@@ -49,7 +49,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "listZeroPagesOfQueues" })
    public void create() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
 
          for (int i=0; i < 6; i++) {
@@ -62,7 +62,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "create" })
    public void listOnePageOfQueues() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          List<Queue> queues = queueApi.list(false).concat().toList();
 
@@ -77,7 +77,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "listOnePageOfQueues" })
    public void createMore() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
 
          for (int i=6; i < 12; i++) {
@@ -90,7 +90,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "createMore" })
    public void listManyPagesOfQueues() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          List<Queue> queues = queueApi.list(false).concat().toList();
 
@@ -105,7 +105,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "listManyPagesOfQueues" })
    public void listManyPagesOfQueuesManually() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
 
          Queues queues = queueApi.list(limit(6));
@@ -125,7 +125,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "listManyPagesOfQueuesManually" })
    public void exists() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          boolean success = queueApi.exists("jclouds-test-1");
 
@@ -135,7 +135,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "exists" })
    public void setMetadata() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          Map<String, String> metadata = ImmutableMap.of("key1", "value1");
          boolean success = queueApi.setMetadata("jclouds-test-1", metadata);
@@ -146,7 +146,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "setMetadata" })
    public void listManyPagesOfQueuesWithDetails() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          List<Queue> queues = queueApi.list(true).concat().toList();
 
@@ -168,7 +168,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "listManyPagesOfQueuesWithDetails" })
    public void getMetadata() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          Map<String, String> metadata = queueApi.getMetadata("jclouds-test-1");
 
@@ -178,7 +178,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "getMetadata" })
    public void getStatsWithoutTotal() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          QueueStats stats = queueApi.getStats("jclouds-test-1");
 
@@ -192,7 +192,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "getStatsWithoutTotal" })
    public void getStatsWithTotal() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          MessageApi messageApi = api.getMessageApiForZoneAndQueue(zoneId, "jclouds-test-1");
 
          UUID clientId = UUID.fromString("3381af92-2b9e-11e3-b191-71861300734c");
@@ -217,7 +217,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "getStatsWithTotal" })
    public void delete() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
 
          for (int i=0; i < 12; i++) {
@@ -230,7 +230,7 @@ public class QueueApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "delete" })
    public void doesNotExist() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
+      for (String zoneId : zones) {
          QueueApi queueApi = api.getQueueApiForZone(zoneId);
          boolean success = queueApi.exists("jclouds-test-1");
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/ed814ce2/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/internal/BaseMarconiApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/internal/BaseMarconiApiLiveTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/internal/BaseMarconiApiLiveTest.java
index e34ab23..c0ec09e 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/internal/BaseMarconiApiLiveTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/internal/BaseMarconiApiLiveTest.java
@@ -16,18 +16,37 @@
  */
 package org.jclouds.openstack.marconi.v1.internal;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
 import org.jclouds.openstack.marconi.v1.MarconiApi;
+import org.testng.annotations.BeforeClass;
 
+import java.util.List;
 import java.util.Properties;
+import java.util.Set;
 
 public class BaseMarconiApiLiveTest extends BaseApiLiveTest<MarconiApi> {
 
+   protected Set<String> zones = Sets.newHashSet();
+
    public BaseMarconiApiLiveTest() {
       provider = "openstack-marconi";
    }
 
+   @BeforeClass
+   public void setupZones() {
+      String key = "test." + provider + ".zone";
+
+      if (System.getProperties().containsKey(key)) {
+         zones.add(System.getProperty(key));
+      }
+      else {
+         zones = api.getConfiguredZones();
+      }
+   }
+
    @Override
    protected Properties setupProperties() {
       Properties props = super.setupProperties();