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/06/26 00:13:44 UTC

[2/7] Rename reddwarf to trove https://issues.apache.org/jira/browse/JCLOUDS-129

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiLiveTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiLiveTest.java
new file mode 100644
index 0000000..a4ccd3a
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/features/UserApiLiveTest.java
@@ -0,0 +1,209 @@
+/*
+ * 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.trove.v1.features;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.trove.v1.domain.User;
+import org.jclouds.openstack.trove.v1.internal.BaseTroveApiLiveTest;
+import org.jclouds.openstack.trove.v1.predicates.InstancePredicates;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+/**
+ * @author Zack Shoylev
+ */
+@Test(groups = "live", testName = "UserApiLiveTest", singleThreaded = true)
+public class UserApiLiveTest extends BaseTroveApiLiveTest {
+
+   // zone to instance
+   private static Map<String,List<Instance>> instancesToDelete = Maps.newHashMap();
+   // not deleting users. they will be deleted when instances are deleted
+
+   @Override
+   @BeforeClass(groups = { "integration", "live" })
+   public void setup() {
+      super.setup();
+      for (String zone : api.getConfiguredZones()) {
+         // create instances
+         List<Instance> instanceList = Lists.newArrayList();
+         InstanceApi instanceApi = api.getInstanceApiForZone(zone);
+         Instance first = instanceApi.create("1", 1, "first_user_trove_live_testing_" + zone);
+         Instance second = instanceApi.create("1", 1, "second_user_trove_live_testing_" + zone);
+         instanceList.add(first);
+         instanceList.add(second);
+         InstancePredicates.awaitAvailable(instanceApi).apply(first);
+         InstancePredicates.awaitAvailable(instanceApi).apply(second);        
+         instancesToDelete.put(zone, instanceList);
+         // create users
+         User user1 = User.builder()
+               .name("user1")
+               .password(UUID.randomUUID().toString())
+               .databases(ImmutableSet.of(
+                     "u1db1", 
+                     "u1db2")).build();
+         User user2 = User.builder()
+               .name("user2")
+               .password(UUID.randomUUID().toString())
+               .databases(ImmutableSet.of(
+                     "u2db1", 
+                     "u2db2")).build();
+         User user3 = User.builder()
+               .name("user3")
+               .password(UUID.randomUUID().toString())
+               .host("173.203.44.122")
+               .databases(ImmutableSet.of(
+                     "u3db1", 
+                     "u3db2")).build();
+         UserApi userApiFirst = api.getUserApiForInstanceInZone(first.getId(), zone);
+         UserApi userApiSecond = api.getUserApiForInstanceInZone(second.getId(), zone);
+         userApiFirst.create(ImmutableSet.of(user1, user2));
+         userApiSecond.create(ImmutableSet.of(user3));
+      }
+   }
+
+   @Override
+   @AfterClass(groups = { "integration", "live" })
+   public void tearDown(){
+      for (String zone : api.getConfiguredZones()) {
+         InstanceApi instanceApi = api.getInstanceApiForZone(zone);
+         for(Instance instance : instancesToDelete.get(zone)){
+            if( !instanceApi.delete(instance.getId() ) )
+               throw new RuntimeException("Could not delete a database instance after tests!");
+         }
+      }
+      super.tearDown();
+   }
+
+   private void checkUser(User user) {
+      assertNotNull(user.getName(), "Name cannot be null for " + user);
+      assertNotNull(user.getHost(), "Host cannot be null (should be '%' if default) for " + user);
+      checkArgument(!user.getDatabases().isEmpty(), "Number of databases must not be 0");
+   }
+
+   @Test
+   public void testListUsers() {
+      for (String zone : api.getConfiguredZones()) {
+         InstanceApi instanceApi = api.getInstanceApiForZone(zone);
+         assertTrue(instanceApi.list().size() >= 2);
+         for(Instance instance : instanceApi.list() ) {
+            UserApi userApi = api.getUserApiForInstanceInZone(instance.getId(), zone);
+            if(!instance.getName().contains("user_trove_live_testing"))continue;
+            assertTrue(userApi.list().size() >=1);
+            for(User user : userApi.list()){
+               checkUser(user);      
+            }
+         }  
+      }   
+   }    
+
+   @Test
+   public void testGetUser() {
+      for (String zone : api.getConfiguredZones()) {
+         InstanceApi instanceApi = api.getInstanceApiForZone(zone);
+         assertTrue(instanceApi.list().size() >= 2);
+         for(Instance instance : instanceApi.list() ) {
+            UserApi userApi = api.getUserApiForInstanceInZone(instance.getId(), zone);
+            if(!instance.getName().contains("user_trove_live_testing"))continue;
+            assertTrue(userApi.list().size() >=1);
+            for(User user : userApi.list()){
+               User userFromGet = userApi.get(user.getIdentifier());
+               assertEquals(userFromGet.getName(), user.getName());
+               assertEquals(userFromGet.getHost(), user.getHost());
+               assertEquals(userFromGet.getIdentifier(), user.getIdentifier());
+               assertEquals(userFromGet.getDatabases(), user.getDatabases());
+               assertEquals(userFromGet, user);
+            }
+         }  
+      } 
+   }
+
+   @Test
+   public void testGetDatabaseListForUser() {
+      for (String zone : api.getConfiguredZones()) {
+         InstanceApi instanceApi = api.getInstanceApiForZone(zone);
+         assertTrue(instanceApi.list().size() >= 2 );
+         for(Instance instance : instanceApi.list() ) {
+            UserApi userApi = api.getUserApiForInstanceInZone(instance.getId(), zone);
+            if(!instance.getName().contains("user_trove_live_testing"))continue;
+            assertTrue(userApi.list().size() >=1);
+            for(User user : userApi.list()){
+               assertFalse(userApi.getDatabaseList(user.getIdentifier()).isEmpty());
+            }
+         }  
+      } 
+   }
+
+   @Test
+   public void testGrantAndRevokeAcccessForUser() {
+      for (String zone : api.getConfiguredZones()) {
+         InstanceApi instanceApi = api.getInstanceApiForZone(zone);
+         assertTrue(instanceApi.list().size() >= 2);
+         for(Instance instance : instanceApi.list() ) {
+            UserApi userApi = api.getUserApiForInstanceInZone(instance.getId(), zone);
+            if(!instance.getName().contains("user_trove_live_testing"))continue;
+            assertTrue(userApi.list().size() >=1);
+            for(User user : userApi.list()){
+               userApi.grant(user.getIdentifier(), "dbA");
+               userApi.grant(user.getIdentifier(), ImmutableList.of(
+                     "dbB", 
+                     "dbC"));
+
+               Set<String> databases = userApi.getDatabaseList(user.getIdentifier()).toSet();
+               assertTrue(databases.contains("dbA"));
+               assertTrue(databases.contains("dbB"));
+               assertTrue(databases.contains("dbC"));
+
+               userApi.revoke(user.getIdentifier(), "dbA");
+               userApi.revoke(user.getIdentifier(), "dbB");
+               userApi.revoke(user.getIdentifier(), "dbC");
+
+               databases = userApi.getDatabaseList(user.getIdentifier()).toSet();
+               assertFalse(databases.contains("dbA"));
+               assertFalse(databases.contains("dbB"));
+               assertFalse(databases.contains("dbC"));
+            }
+         }  
+      } 
+   }
+
+   @Test
+   public void testGetUserWhenNotFound() {
+      for (String zone : api.getConfiguredZones()) {
+         String instanceId = api.getInstanceApiForZone(zone).list().iterator().next().getId(); 
+         UserApi userApi = api.getUserApiForInstanceInZone(instanceId, zone);
+         assertNull(userApi.get("9999"));
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiExpectTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiExpectTest.java
new file mode 100644
index 0000000..3c9aaa7
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiExpectTest.java
@@ -0,0 +1,27 @@
+/*
+ * 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.trove.v1.internal;
+
+import org.jclouds.openstack.trove.v1.TroveApi;
+
+/**
+ * Base class for writing Flavor Rest Api Expect tests
+ * 
+ * @author Everett Toews
+ */
+public class BaseTroveApiExpectTest extends BaseTroveExpectTest<TroveApi> {
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiLiveTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiLiveTest.java
new file mode 100644
index 0000000..978f4ce
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveApiLiveTest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.trove.v1.internal;
+
+import java.util.Properties;
+
+import org.jclouds.apis.BaseApiLiveTest;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
+import org.jclouds.openstack.trove.v1.TroveApi;
+
+/**
+ * Tests behavior of TroveApi
+ * 
+ * @author Zack Shoylev
+ */
+public class BaseTroveApiLiveTest extends BaseApiLiveTest<TroveApi> {
+
+   public BaseTroveApiLiveTest() {
+      provider = "openstack-trove";
+   }
+
+   @Override
+   protected Properties setupProperties() {
+      Properties props = super.setupProperties();
+      setIfTestSystemPropertyPresent(props, KeystoneProperties.CREDENTIAL_TYPE);
+      setIfTestSystemPropertyPresent(props, KeystoneProperties.SERVICE_TYPE);
+      return props;
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveExpectTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveExpectTest.java
new file mode 100644
index 0000000..b43db05
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/internal/BaseTroveExpectTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.trove.v1.internal;
+
+import javax.ws.rs.core.MediaType;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.keystone.v2_0.internal.KeystoneFixture;
+import org.jclouds.rest.internal.BaseRestApiExpectTest;
+
+/**
+ * Base class for writing Nova Expect tests
+ * 
+ * @author Adrian Cole
+ */
+public class BaseTroveExpectTest<T> extends BaseRestApiExpectTest<T> {
+   protected HttpRequest keystoneAuthWithUsernameAndPassword;
+   protected HttpRequest keystoneAuthWithUsernameAndPasswordAndTenantName;
+   protected HttpRequest keystoneAuthWithAccessKeyAndSecretKeyAndTenantName;
+   protected String authToken;
+   protected HttpResponse responseWithKeystoneAccess;
+   protected HttpRequest extensionsOfNovaRequest;
+   protected HttpResponse extensionsOfNovaResponse;
+   protected HttpResponse unmatchedExtensionsOfNovaResponse;
+   protected HttpRequest keystoneAuthWithAccessKeyAndSecretKeyAndTenantId;
+   protected String identityWithTenantId;
+
+   public BaseTroveExpectTest() {
+      provider = "openstack-trove";
+      keystoneAuthWithUsernameAndPassword = KeystoneFixture.INSTANCE.initialAuthWithUsernameAndPassword(identity,
+            credential);
+      keystoneAuthWithUsernameAndPasswordAndTenantName = KeystoneFixture.INSTANCE.initialAuthWithUsernameAndPasswordAndTenantName(identity,
+            credential);
+      keystoneAuthWithAccessKeyAndSecretKeyAndTenantName = KeystoneFixture.INSTANCE.initialAuthWithAccessKeyAndSecretKeyAndTenantName(identity,
+            credential);
+      keystoneAuthWithAccessKeyAndSecretKeyAndTenantId = KeystoneFixture.INSTANCE.initialAuthWithAccessKeyAndSecretKeyAndTenantId(identity,
+              credential);
+      
+      authToken = KeystoneFixture.INSTANCE.getAuthToken();
+      responseWithKeystoneAccess = KeystoneFixture.INSTANCE.responseWithAccess();
+      // now, createContext arg will need tenant prefix
+      identityWithTenantId = KeystoneFixture.INSTANCE.getTenantId() + ":" + identity;
+      identity = KeystoneFixture.INSTANCE.getTenantName() + ":" + identity;
+   }
+
+   @Override
+   protected HttpRequestComparisonType compareHttpRequestAsType(HttpRequest input) {
+      return HttpRequestComparisonType.JSON;
+   }
+   
+   protected HttpRequest.Builder<?> authenticatedGET() {
+      return HttpRequest.builder()
+                        .method("GET")
+                        .addHeader("Accept", MediaType.APPLICATION_JSON)
+                        .addHeader("X-Auth-Token", authToken);
+   }
+   
+   protected HttpRequest.Builder<?> authenticatedPOST() {
+      return HttpRequest.builder()
+                        .method("POST")
+                        .addHeader("Accept", MediaType.APPLICATION_JSON)
+                        .addHeader("X-Auth-Token", authToken);
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseFlavorListTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseFlavorListTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseFlavorListTest.java
new file mode 100644
index 0000000..39361cf
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseFlavorListTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.trove.v1.parse;
+
+import java.util.Set;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.Uris;
+import org.jclouds.json.BaseSetParserTest;
+import org.jclouds.openstack.trove.v1.domain.Flavor;
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.Link.Relation;
+import org.jclouds.rest.annotations.SelectJson;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * 
+ * @author Zack Shoylev
+ */
+
+@Test(groups = "unit", testName = "ParseFlavorTest")
+public class ParseFlavorListTest extends BaseSetParserTest<Flavor> {
+
+   @Override
+   public String resource() {
+      return "/flavor_list.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   @SelectJson("flavors")
+   public Set<Flavor> expected() {
+      return ImmutableSet
+            .of(Flavor.builder()
+                  .id(1)
+                  .name("512MB Instance")
+                  .ram(512)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://localhost:8778/v1.0/811050/flavors/1").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://localhost:8778/flavors/1").build() )
+                          ))
+                  .build(),
+                  Flavor.builder()
+                  .id(2)
+                  .name("1GB Instance")
+                  .ram(1024)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://localhost:8778/v1.0/811050/flavors/2").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://localhost:8778/flavors/2").build() )
+                          ))
+                  .build(),
+                  Flavor.builder()
+                  .id(3)
+                  .name("2GB Instance")
+                  .ram(2048)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://localhost:8778/v1.0/811050/flavors/3").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://localhost:8778/flavors/3").build() )
+                          ))
+                  .build(),
+                  Flavor.builder()
+                  .id(4)
+                  .name("4GB Instance")
+                  .ram(4096)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://localhost:8778/v1.0/811050/flavors/4").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://localhost:8778/flavors/4").build() )
+                          ))
+                  .build(),
+                  Flavor.builder()
+                  .id(5)
+                  .name("8GB Instance")
+                  .ram(8192)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://localhost:8778/v1.0/811050/flavors/5").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://localhost:8778/flavors/5").build() )
+                          ))
+                  .build(),
+                  Flavor.builder()
+                  .id(6)
+                  .name("16GB Instance")
+                  .ram(16384)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://localhost:8778/v1.0/811050/flavors/6").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://localhost:8778/flavors/6").build() )
+                          ))
+                  .build());
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseInstanceListTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseInstanceListTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseInstanceListTest.java
new file mode 100644
index 0000000..995404e
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseInstanceListTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.trove.v1.parse;
+
+import java.util.Set;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.Uris;
+import org.jclouds.json.BaseSetParserTest;
+import org.jclouds.openstack.trove.v1.domain.Flavor;
+import org.jclouds.openstack.trove.v1.domain.Instance;
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.Link.Relation;
+import org.jclouds.rest.annotations.SelectJson;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * 
+ * @author Zack Shoylev
+ */
+
+@Test(groups = "unit", testName = "ParseInstanceTest")
+public class ParseInstanceListTest extends BaseSetParserTest<Instance> {
+
+   @Override
+   public String resource() {
+      return "/instance_list.json";
+   }
+
+   /*
+    * The instance needs to be comparable for this test to work 
+    * */
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   @SelectJson("instances")
+   public Set<Instance> expected() {
+      return ImmutableSet
+            .of(Instance.builder()
+                  .id("098653ba-218b-47ce-936a-e0b749101f81")
+                  .name("xml_rack_instance")
+                  .size(2)
+                  .flavor(
+                          Flavor.builder()
+                              .id(1)
+                              .links(ImmutableList.of(
+                                              Link.create(Relation.SELF, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1").build() ),
+                                              Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/flavors/1").build())))
+                              .build()
+                         )
+                  .status(Instance.Status.ACTIVE)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/098653ba-218b-47ce-936a-e0b749101f81").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/instances/098653ba-218b-47ce-936a-e0b749101f81").build() )
+                          ))
+                  .build(),
+                  Instance.builder()
+                  .id("44b277eb-39be-4921-be31-3d61b43651d7")
+                  .name("json_rack_instance")
+                  .size(2)
+                  .flavor(
+                          Flavor.builder()
+                              .id(1)
+                              .links(ImmutableList.of(
+                                              Link.create(Relation.SELF, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1").build() ),
+                                              Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/flavors/1").build())))
+                              .build()
+                         )
+                  .status(Instance.Status.ACTIVE)
+                  .links(ImmutableList.of(
+                          Link.create(Relation.SELF, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/44b277eb-39be-4921-be31-3d61b43651d7").build() ),
+                          Link.create(Relation.BOOKMARK, Uris.uriBuilder("https://ord.databases.api.rackspacecloud.com/instances/44b277eb-39be-4921-be31-3d61b43651d7").build() )
+                          ))
+                  .build() 
+                  );
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseUserListTest.java
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseUserListTest.java b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseUserListTest.java
new file mode 100644
index 0000000..e62fbf4
--- /dev/null
+++ b/openstack-trove/src/test/java/org/jclouds/openstack/trove/v1/parse/ParseUserListTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.trove.v1.parse;
+
+import java.util.Set;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.json.BaseSetParserTest;
+import org.jclouds.openstack.trove.v1.domain.User;
+import org.jclouds.rest.annotations.SelectJson;
+import org.testng.annotations.Test;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * 
+ * @author Zack Shoylev
+ */
+
+@Test(groups = "unit", testName = "ParseUserTest")
+public class ParseUserListTest extends BaseSetParserTest<User> {
+
+   @Override
+   public String resource() {
+      return "/trove_user_list.json";
+   }
+
+   /*
+    * The user needs to be comparable for this test to work 
+    * */
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   @SelectJson("users")
+   public Set<User> expected() {
+      return ImmutableSet
+            .of(User.builder()
+                  .name("dbuser1")
+                  .host("%")
+                  .build(),
+                  User.builder()
+                  .name("dbuser2")
+                  .host("%")
+                  .databases( ImmutableSet.of( 
+                          "databaseB",
+                          "databaseC") )
+                  .build(),
+                  User.builder().name("dbuser3").host("%").build(),
+                  User.builder().name("demouser").host("%").databases(
+                          ImmutableSet.of("sampledb"))
+                          .build()
+                  );
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/access_rax_us.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/access_rax_us.json b/openstack-trove/src/test/resources/access_rax_us.json
new file mode 100644
index 0000000..b90bebc
--- /dev/null
+++ b/openstack-trove/src/test/resources/access_rax_us.json
@@ -0,0 +1,168 @@
+{
+    "access": {
+        "token": {
+            "id": "myToken",
+            "expires": "2012-09-30T17:15:32.000-05:00",
+            "tenant": {
+                "id": "717071",
+                "name": "717071"
+            }
+        },
+        "serviceCatalog": [
+            {
+                "endpoints": [
+                    {
+                        "tenantId": "717071",
+                        "publicURL": "https://dns.api.rackspacecloud.com/v1.0/717071"
+                    }
+                ],
+                "name": "cloudDNS",
+                "type": "rax:dns"
+            },
+            {
+                "endpoints": [
+                    {
+                        "tenantId": "717071",
+                        "publicURL": "https://monitoring.api.rackspacecloud.com/v1.0/717071"
+                    }
+                ],
+                "name": "cloudMonitoring",
+                "type": "rax:monitor"
+            },
+            {
+                "endpoints": [
+                    {
+                        "region": "DFW",
+                        "tenantId": "717071",
+                        "publicURL": "https://dfw.servers.api.rackspacecloud.com/v2/717071",
+                        "versionInfo": "https://dfw.servers.api.rackspacecloud.com/v2",
+                        "versionList": "https://dfw.servers.api.rackspacecloud.com/",
+                        "versionId": "2"
+                    },
+                    {
+                        "region": "ORD",
+                        "tenantId": "717071",
+                        "publicURL": "https://ord.servers.api.rackspacecloud.com/v2/717071",
+                        "versionInfo": "https://ord.servers.api.rackspacecloud.com/v2",
+                        "versionList": "https://ord.servers.api.rackspacecloud.com/",
+                        "versionId": "2"
+                    }
+                ],
+                "name": "cloudServersOpenStack",
+                "type": "compute"
+            },
+            {
+                "endpoints": [
+                    {
+                        "region": "ORD",
+                        "tenantId": "717071",
+                        "publicURL": "https://ord.loadbalancers.api.rackspacecloud.com/v1.0/717071"
+                    },
+                    {
+                        "region": "DFW",
+                        "tenantId": "717071",
+                        "publicURL": "https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/717071"
+                    }
+                ],
+                "name": "cloudLoadBalancers",
+                "type": "rax:load-balancer"
+            },
+            {
+                "endpoints": [
+                    {
+                        "region": "DFW",
+                        "tenantId": "717071",
+                        "publicURL": "https://dfw.databases.api.rackspacecloud.com/v1.0/717071"
+                    },
+                    {
+                        "region": "ORD",
+                        "tenantId": "717071",
+                        "publicURL": "https://ord.databases.api.rackspacecloud.com/v1.0/717071"
+                    },
+                    {
+                        "region": "SYD",
+                        "tenantId": "717071",
+                        "publicURL": "https://syd.databases.api.rackspacecloud.com/v1.0/717071"
+                    }
+                ],
+                "name": "cloudDatabases",
+                "type": "rax:database"
+            },
+            {
+                "endpoints": [
+                    {
+                        "region": "DFW",
+                        "tenantId": "MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9",
+                        "publicURL": "https://storage101.dfw1.clouddrive.com/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9",
+                        "internalURL": "https://snet-storage101.dfw1.clouddrive.com/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"
+                    },
+                    {
+                        "region": "ORD",
+                        "tenantId": "MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9",
+                        "publicURL": "https://storage101.ord1.clouddrive.com/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9",
+                        "internalURL": "https://snet-storage101.ord1.clouddrive.com/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"
+                    }
+                ],
+                "name": "cloudFiles",
+                "type": "object-store"
+            },
+            {
+                "endpoints": [
+                    {
+                        "region": "DFW",
+                        "tenantId": "MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9",
+                        "publicURL": "https://cdn1.clouddrive.com/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"
+                    },
+                    {
+                        "region": "ORD",
+                        "tenantId": "MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9",
+                        "publicURL": "https://cdn2.clouddrive.com/v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"
+                    }
+                ],
+                "name": "cloudFilesCDN",
+                "type": "rax:object-cdn"
+            },
+            {
+                "endpoints": [
+                    {
+                        "tenantId": "717071",
+                        "publicURL": "https://servers.api.rackspacecloud.com/v1.0/717071",
+                        "versionInfo": "https://servers.api.rackspacecloud.com/v1.0",
+                        "versionList": "https://servers.api.rackspacecloud.com/",
+                        "versionId": "1.0"
+                    }
+                ],
+                "name": "cloudServers",
+                "type": "compute"
+            },
+            {
+                "endpoints": [
+                    {
+                         "publicURL": "https://ord.blockstorage.api.rackspacecloud.com/v1/717071",
+                         "tenantId": "717071",
+                         "region": "ORD"
+                    },
+                    {
+                        "region": "DFW",
+                        "tenantId": "717071",
+                        "publicURL": "https://dfw.blockstorage.api.rackspacecloud.com/v1/717071"
+                    }
+                ],
+                "name": "cloudBlockStorage",
+                "type": "volume"
+            }
+        ],
+        "user": {
+            "id": "224085",
+            "roles": [
+                {
+                    "id": "3",
+                    "description": "User Admin Role.",
+                    "name": "identity:user-admin"
+                }
+            ],
+            "name": "myUsername",
+            "RAX-AUTH:defaultRegion": "DFW"
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/database_create_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/database_create_request.json b/openstack-trove/src/test/resources/database_create_request.json
new file mode 100644
index 0000000..7766ac9
--- /dev/null
+++ b/openstack-trove/src/test/resources/database_create_request.json
@@ -0,0 +1,9 @@
+{
+    "databases": [
+        {    
+            "character_set": "utf8", 
+            "collate": "utf8_general_ci", 
+            "name": "testingdb"
+        } 
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/database_create_simple_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/database_create_simple_request.json b/openstack-trove/src/test/resources/database_create_simple_request.json
new file mode 100644
index 0000000..02ad014
--- /dev/null
+++ b/openstack-trove/src/test/resources/database_create_simple_request.json
@@ -0,0 +1,7 @@
+{
+    "databases": [
+        {   
+            "name": "testingdb"
+        } 
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/database_list.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/database_list.json b/openstack-trove/src/test/resources/database_list.json
new file mode 100644
index 0000000..aca6447
--- /dev/null
+++ b/openstack-trove/src/test/resources/database_list.json
@@ -0,0 +1,19 @@
+{
+    "databases": [
+        {
+            "name": "anotherdb"
+        }, 
+        {
+            "name": "nextround"
+        }, 
+        {
+            "name": "oneMoreDB"
+        }, 
+        {
+            "name": "sampledb"
+        }, 
+        {
+            "name": "testingdb"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/flavor_get.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/flavor_get.json b/openstack-trove/src/test/resources/flavor_get.json
new file mode 100644
index 0000000..ea07770
--- /dev/null
+++ b/openstack-trove/src/test/resources/flavor_get.json
@@ -0,0 +1,17 @@
+{
+    "flavor":{
+        "id":1,
+        "links":[
+            {
+                "href":"https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1",
+                "rel":"self"
+            },
+            {
+                "href":"https://ord.databases.api.rackspacecloud.com/flavors/1",
+                "rel":"bookmark"
+            }
+        ],
+        "name":"512MB Instance",
+        "ram":512
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/flavor_list.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/flavor_list.json b/openstack-trove/src/test/resources/flavor_list.json
new file mode 100644
index 0000000..a9108f2
--- /dev/null
+++ b/openstack-trove/src/test/resources/flavor_list.json
@@ -0,0 +1,94 @@
+{
+    "flavors":[
+        {
+            "ram":512,
+            "id":1,
+            "links":[
+                {
+                    "href":"https://localhost:8778/v1.0/811050/flavors/1",
+                    "rel":"self"
+                },
+                {
+                    "href":"https://localhost:8778/flavors/1",
+                    "rel":"bookmark"
+                }
+            ],
+            "name":"512MB Instance"
+        },
+        {
+            "ram":1024,
+            "id":2,
+            "links":[
+                {
+                    "href":"https://localhost:8778/v1.0/811050/flavors/2",
+                    "rel":"self"
+                },
+                {
+                    "href":"https://localhost:8778/flavors/2",
+                    "rel":"bookmark"
+                }
+            ],
+            "name":"1GB Instance"
+        },
+        {
+            "ram":2048,
+            "id":3,
+            "links":[
+                {
+                    "href":"https://localhost:8778/v1.0/811050/flavors/3",
+                    "rel":"self"
+                },
+                {
+                    "href":"https://localhost:8778/flavors/3",
+                    "rel":"bookmark"
+                }
+            ],
+            "name":"2GB Instance"
+        },
+        {
+            "ram":4096,
+            "id":4,
+            "links":[
+                {
+                    "href":"https://localhost:8778/v1.0/811050/flavors/4",
+                    "rel":"self"
+                },
+                {
+                    "href":"https://localhost:8778/flavors/4",
+                    "rel":"bookmark"
+                }
+            ],
+            "name":"4GB Instance"
+        },
+        {
+            "ram":8192,
+            "id":5,
+            "links":[
+                {
+                    "href":"https://localhost:8778/v1.0/811050/flavors/5",
+                    "rel":"self"
+                },
+                {
+                    "href":"https://localhost:8778/flavors/5",
+                    "rel":"bookmark"
+                }
+            ],
+            "name":"8GB Instance"
+        },
+        {
+            "ram":16384,
+            "id":6,
+            "links":[
+                {
+                    "href":"https://localhost:8778/v1.0/811050/flavors/6",
+                    "rel":"self"
+                },
+                {
+                    "href":"https://localhost:8778/flavors/6",
+                    "rel":"bookmark"
+                }
+            ],
+            "name":"16GB Instance"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_create.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_create.json b/openstack-trove/src/test/resources/instance_create.json
new file mode 100644
index 0000000..cfb4106
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_create.json
@@ -0,0 +1,35 @@
+{
+    "instance": {
+        "created": "2013-03-18T19:09:17", 
+        "flavor": {
+            "id": "1", 
+            "links": [
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", 
+                    "rel": "self"
+                }, 
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/flavors/1", 
+                    "rel": "bookmark"
+                }
+            ]
+        }, 
+        "id": "44b277eb-39be-4921-be31-3d61b43651d7", 
+        "links": [
+            {
+                "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/44b277eb-39be-4921-be31-3d61b43651d7", 
+                "rel": "self"
+            }, 
+            {
+                "href": "https://ord.databases.api.rackspacecloud.com/instances/44b277eb-39be-4921-be31-3d61b43651d7", 
+                "rel": "bookmark"
+            }
+        ], 
+        "name": "json_rack_instance", 
+        "status": "BUILD", 
+        "updated": "2013-03-18T19:09:17", 
+        "volume": {
+            "size": 2
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_create_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_create_request.json b/openstack-trove/src/test/resources/instance_create_request.json
new file mode 100644
index 0000000..607c5a1
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_create_request.json
@@ -0,0 +1,9 @@
+{
+    "instance":{
+        "name":"json_rack_instance",
+        "volume":{
+            "size":2
+        },
+        "flavorRef":"1"
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_get.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_get.json b/openstack-trove/src/test/resources/instance_get.json
new file mode 100644
index 0000000..baf8708
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_get.json
@@ -0,0 +1,37 @@
+{
+    "instance": {
+        "created": "2013-03-18T19:09:17", 
+        "flavor": {
+            "id": "1", 
+            "links": [
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", 
+                    "rel": "self"
+                }, 
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/flavors/1", 
+                    "rel": "bookmark"
+                }
+            ]
+        }, 
+        "hostname": "e09ad9a3f73309469cf1f43d11e79549caf9acf2.rackspaceclouddb.com",
+        "id": "44b277eb-39be-4921-be31-3d61b43651d7", 
+        "links": [
+            {
+                "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/44b277eb-39be-4921-be31-3d61b43651d7", 
+                "rel": "self"
+            }, 
+            {
+                "href": "https://ord.databases.api.rackspacecloud.com/instances/44b277eb-39be-4921-be31-3d61b43651d7", 
+                "rel": "bookmark"
+            }
+        ], 
+        "name": "json_rack_instance", 
+        "status": "ACTIVE", 
+        "updated": "2013-03-18T19:09:17", 
+        "volume": {
+            "size": 2, 
+            "used": 0.16368598397821188
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_is_rooted.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_is_rooted.json b/openstack-trove/src/test/resources/instance_is_rooted.json
new file mode 100644
index 0000000..f3990b4
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_is_rooted.json
@@ -0,0 +1,3 @@
+{
+    "rootEnabled": true
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_is_rooted_false.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_is_rooted_false.json b/openstack-trove/src/test/resources/instance_is_rooted_false.json
new file mode 100644
index 0000000..04e4e6d
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_is_rooted_false.json
@@ -0,0 +1,3 @@
+{
+    "rootEnabled": false
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_list.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_list.json b/openstack-trove/src/test/resources/instance_list.json
new file mode 100644
index 0000000..c1834a2
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_list.json
@@ -0,0 +1,66 @@
+{
+    "instances": [
+        {
+            "flavor": {
+                "id": "1", 
+                "links": [
+                    {
+                        "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", 
+                        "rel": "self"
+                    }, 
+                    {
+                        "href": "https://ord.databases.api.rackspacecloud.com/flavors/1", 
+                        "rel": "bookmark"
+                    }
+                ]
+            }, 
+            "id": "098653ba-218b-47ce-936a-e0b749101f81", 
+            "links": [
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/098653ba-218b-47ce-936a-e0b749101f81", 
+                    "rel": "self"
+                }, 
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/instances/098653ba-218b-47ce-936a-e0b749101f81", 
+                    "rel": "bookmark"
+                }
+            ], 
+            "name": "xml_rack_instance", 
+            "status": "ACTIVE", 
+            "volume": {
+                "size": 2
+            }
+        }, 
+        {
+            "flavor": {
+                "id": "1", 
+                "links": [
+                    {
+                        "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/flavors/1", 
+                        "rel": "self"
+                    }, 
+                    {
+                        "href": "https://ord.databases.api.rackspacecloud.com/flavors/1", 
+                        "rel": "bookmark"
+                    }
+                ]
+            }, 
+            "id": "44b277eb-39be-4921-be31-3d61b43651d7", 
+            "links": [
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/v1.0/1234/instances/44b277eb-39be-4921-be31-3d61b43651d7", 
+                    "rel": "self"
+                }, 
+                {
+                    "href": "https://ord.databases.api.rackspacecloud.com/instances/44b277eb-39be-4921-be31-3d61b43651d7", 
+                    "rel": "bookmark"
+                }
+            ], 
+            "name": "json_rack_instance", 
+            "status": "ACTIVE", 
+            "volume": {
+                "size": 2
+            }
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/instance_root.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/instance_root.json b/openstack-trove/src/test/resources/instance_root.json
new file mode 100644
index 0000000..e937b90
--- /dev/null
+++ b/openstack-trove/src/test/resources/instance_root.json
@@ -0,0 +1,6 @@
+{
+    "user": {
+        "name": "root", 
+        "password": "12345"
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/logback-test.xml
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/logback-test.xml b/openstack-trove/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..6559c23
--- /dev/null
+++ b/openstack-trove/src/test/resources/logback-test.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<!--
+
+    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.
+
+-->
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="BLOBSTOREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-blobstore.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.blobstore">
+        <level value="DEBUG" />
+        <appender-ref ref="BLOBSTOREFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/logback.xml b/openstack-trove/src/test/resources/logback.xml
new file mode 100644
index 0000000..6559c23
--- /dev/null
+++ b/openstack-trove/src/test/resources/logback.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+<!--
+
+    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.
+
+-->
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="BLOBSTOREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-blobstore.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.blobstore">
+        <level value="DEBUG" />
+        <appender-ref ref="BLOBSTOREFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/trove_user_list.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/trove_user_list.json b/openstack-trove/src/test/resources/trove_user_list.json
new file mode 100644
index 0000000..546df43
--- /dev/null
+++ b/openstack-trove/src/test/resources/trove_user_list.json
@@ -0,0 +1,35 @@
+{
+    "users": [
+        {
+            "databases": [],
+            "host": "%", 
+            "name": "dbuser1"
+        }, 
+        {
+            "databases": [
+                {
+                    "name": "databaseB"
+                }, 
+                {
+                    "name": "databaseC"
+                }
+            ],
+            "host": "%",
+            "name": "dbuser2"
+        }, 
+        {
+            "databases": [], 
+            "name": "dbuser3",
+            "host": "%"
+        }, 
+        {
+            "databases": [
+                {
+                    "name": "sampledb"
+                }
+            ],
+            "host": "%",
+            "name": "demouser"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_create_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_create_request.json b/openstack-trove/src/test/resources/user_create_request.json
new file mode 100644
index 0000000..f9b923e
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_create_request.json
@@ -0,0 +1,35 @@
+{
+    "users":[
+        {
+            "databases":[
+                {
+                    "name":"databaseA"
+                }
+            ],
+            "name":"dbuser1",
+            "password":"password"
+        },
+        {
+            "databases":[
+                {
+                    "name":"databaseB"
+                },
+                {
+                    "name":"databaseC"
+                }
+            ],
+            "name":"dbuser2",
+            "password":"password"
+        },
+        {
+            "databases":[
+                {
+                    "name":"databaseD"
+                }
+            ],
+            "name":"dbuser3",
+            "host":"192.168.64.64",
+            "password":"password"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_create_simple_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_create_simple_request.json b/openstack-trove/src/test/resources/user_create_simple_request.json
new file mode 100644
index 0000000..921f68e
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_create_simple_request.json
@@ -0,0 +1,13 @@
+{
+    "users":[
+        {
+            "databases":[
+                {
+                    "name":"databaseA"
+                }
+            ],
+            "name":"dbuser1",
+            "password":"password"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_create_with_host_simple_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_create_with_host_simple_request.json b/openstack-trove/src/test/resources/user_create_with_host_simple_request.json
new file mode 100644
index 0000000..5dc0b78
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_create_with_host_simple_request.json
@@ -0,0 +1,14 @@
+{
+    "users":[
+        {
+            "databases":[
+                {
+                    "name":"databaseA"
+                }
+            ],
+            "name":"dbuser1",
+            "password":"password",
+            "host":"192.168.64.64"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_get.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_get.json b/openstack-trove/src/test/resources/user_get.json
new file mode 100644
index 0000000..478a94d
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_get.json
@@ -0,0 +1,14 @@
+{
+   "user": {
+      "name": "exampleuser",
+      "host": "%",
+      "databases": [
+         {
+            "name": "databaseA"
+         },
+         {
+            "name": "databaseB"
+         }
+      ]
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_get_withhost.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_get_withhost.json b/openstack-trove/src/test/resources/user_get_withhost.json
new file mode 100644
index 0000000..03274b6
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_get_withhost.json
@@ -0,0 +1,14 @@
+{
+   "user": {
+      "name": "exampleuser",
+      "host": "192.168.64.64",
+      "databases": [
+         {
+            "name": "databaseA"
+         },
+         {
+            "name": "databaseB"
+         }
+      ]
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_grant_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_grant_request.json b/openstack-trove/src/test/resources/user_grant_request.json
new file mode 100644
index 0000000..97a1239
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_grant_request.json
@@ -0,0 +1,10 @@
+{
+   "databases": [
+      {
+         "name": "databaseC"
+      },
+      {
+         "name": "databaseD"
+      }
+   ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_grant_simple_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_grant_simple_request.json b/openstack-trove/src/test/resources/user_grant_simple_request.json
new file mode 100644
index 0000000..5113e4f
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_grant_simple_request.json
@@ -0,0 +1,7 @@
+{
+   "databases": [
+      {
+         "name": "databaseZ"
+      }
+   ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_list_access.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_list_access.json b/openstack-trove/src/test/resources/user_list_access.json
new file mode 100644
index 0000000..c58e1fa
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_list_access.json
@@ -0,0 +1,10 @@
+{
+   "databases": [
+      {
+         "name": "databaseA"
+      },
+      {
+         "name": "databaseB"
+      }
+   ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/openstack-trove/src/test/resources/user_password_request.json
----------------------------------------------------------------------
diff --git a/openstack-trove/src/test/resources/user_password_request.json b/openstack-trove/src/test/resources/user_password_request.json
new file mode 100644
index 0000000..e42b277
--- /dev/null
+++ b/openstack-trove/src/test/resources/user_password_request.json
@@ -0,0 +1,12 @@
+{
+   "users": [
+      {
+          "name": "dbuser1",
+          "password": "newpassword"
+      },
+      {
+           "name": "dbuser2",
+           "password": "anotherpassword"
+      }
+   ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 6253977..eed889c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,7 @@
   <modules>
     <module>openstack-glance</module>
     <module>openstack-quantum</module>
-    <module>openstack-reddwarf</module>
+    <module>openstack-trove</module>
     <module>openstack-swift</module>
     <module>rackspace-clouddatabases-us</module>
     <module>rackspace-clouddatabases-uk</module>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/pom.xml
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/pom.xml b/rackspace-clouddatabases-uk/pom.xml
index 82322b1..dc08876 100644
--- a/rackspace-clouddatabases-uk/pom.xml
+++ b/rackspace-clouddatabases-uk/pom.xml
@@ -25,12 +25,12 @@
       <version>1.7.0-SNAPSHOT</version>
   </parent>
   
-  <!-- TODO: when out of labs, switch to org.jclouds.provider; update dependencies when RedDwarf is moved to jclouds -->
+  <!-- TODO: when out of labs, switch to org.jclouds.provider; update dependencies when Trove is moved to jclouds -->
   
   <groupId>org.apache.jclouds.provider</groupId>
   <artifactId>rackspace-clouddatabases-uk</artifactId>
   <name>jclouds Rackspace Cloud Databases UK provider</name>
-  <description>OpenStack RedDwarf implementation targeted to Rackspace Cloud Databases UK</description>
+  <description>OpenStack Trove implementation targeted to Rackspace Cloud Databases UK</description>
   <packaging>bundle</packaging>
 
   <properties>
@@ -57,7 +57,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.jclouds.labs</groupId>
-      <artifactId>openstack-reddwarf</artifactId>
+      <artifactId>openstack-trove</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
@@ -79,7 +79,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.jclouds.labs</groupId>
-      <artifactId>openstack-reddwarf</artifactId>
+      <artifactId>openstack-trove</artifactId>
       <version>${project.version}</version>
       <type>test-jar</type>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/main/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadata.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/main/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadata.java b/rackspace-clouddatabases-uk/src/main/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadata.java
index 96cf9bc..dd56dfc 100644
--- a/rackspace-clouddatabases-uk/src/main/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadata.java
+++ b/rackspace-clouddatabases-uk/src/main/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadata.java
@@ -26,9 +26,9 @@ import java.net.URI;
 import java.util.Properties;
 
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
-import org.jclouds.openstack.reddwarf.v1.RedDwarfApiMetadata;
-import org.jclouds.openstack.reddwarf.v1.config.RedDwarfHttpApiModule;
-import org.jclouds.openstack.reddwarf.v1.config.RedDwarfParserModule;
+import org.jclouds.openstack.trove.v1.TroveApiMetadata;
+import org.jclouds.openstack.trove.v1.config.TroveHttpApiModule;
+import org.jclouds.openstack.trove.v1.config.TroveParserModule;
 import org.jclouds.providers.ProviderMetadata;
 import org.jclouds.providers.internal.BaseProviderMetadata;
 import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityAuthenticationApiModule;
@@ -76,7 +76,7 @@ public class CloudDatabasesUKProviderMetadata extends BaseProviderMetadata {
       protected Builder(){
          id("rackspace-clouddatabases-uk")
          .name("Rackspace Clouddatabases UK")
-         .apiMetadata(new RedDwarfApiMetadata().toBuilder()
+         .apiMetadata(new TroveApiMetadata().toBuilder()
                   .identityName("${userName}")
                   .credentialName("${apiKey}")
                   .defaultEndpoint("https://lon.api.rackspacecloud.com/v2.0/")
@@ -86,8 +86,8 @@ public class CloudDatabasesUKProviderMetadata extends BaseProviderMetadata {
                                               .add(CloudIdentityAuthenticationApiModule.class)
                                               .add(CloudIdentityAuthenticationModule.class)
                                               .add(ZoneModule.class)
-                                              .add(RedDwarfParserModule.class)
-                                              .add(RedDwarfHttpApiModule.class).build())
+                                              .add(TroveParserModule.class)
+                                              .add(TroveHttpApiModule.class).build())
                   .build())
          .homepage(URI.create("http://www.rackspace.com/cloud/public/databases/"))
          .console(URI.create("https://mycloud.rackspace.com"))

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadataExpectTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadataExpectTest.java b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadataExpectTest.java
index e066993..afbfc4a 100644
--- a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadataExpectTest.java
+++ b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderMetadataExpectTest.java
@@ -20,8 +20,8 @@ import static org.testng.Assert.assertEquals;
 
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
-import org.jclouds.openstack.reddwarf.v1.RedDwarfApi;
-import org.jclouds.openstack.reddwarf.v1.internal.BaseRedDwarfApiExpectTest;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.internal.BaseTroveApiExpectTest;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
@@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableSet;
  * @author Zack Shoylev
  */
 @Test(groups = "unit", testName = "CloudDatabasesUKProviderMetadataExpectTest")
-public class CloudDatabasesUKProviderMetadataExpectTest extends BaseRedDwarfApiExpectTest {
+public class CloudDatabasesUKProviderMetadataExpectTest extends BaseTroveApiExpectTest {
 
    public CloudDatabasesUKProviderMetadataExpectTest() {
       this.provider = "rackspace-clouddatabases-uk";
@@ -55,7 +55,7 @@ public class CloudDatabasesUKProviderMetadataExpectTest extends BaseRedDwarfApiE
             .payload(payloadFromResourceWithContentType("/access_rax_uk.json", "application/json"))
             .build();
 
-      RedDwarfApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse);
+      TroveApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse);
 
       assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("LON"));
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderTest.java b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderTest.java
index bf0934c..a4bb2c9 100644
--- a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderTest.java
+++ b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/CloudDatabasesUKProviderTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.clouddatabases.uk;
 
-import org.jclouds.openstack.reddwarf.v1.RedDwarfApiMetadata;
+import org.jclouds.openstack.trove.v1.TroveApiMetadata;
 import org.jclouds.providers.internal.BaseProviderMetadataTest;
 import org.testng.annotations.Test;
 
@@ -27,6 +27,6 @@ import org.testng.annotations.Test;
 public class CloudDatabasesUKProviderTest extends BaseProviderMetadataTest {
 
    public CloudDatabasesUKProviderTest() {
-      super(new CloudDatabasesUKProviderMetadata(), new RedDwarfApiMetadata());
+      super(new CloudDatabasesUKProviderMetadata(), new TroveApiMetadata());
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKDatabaseApiLiveTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKDatabaseApiLiveTest.java b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKDatabaseApiLiveTest.java
index 7f7ddba..294e021 100644
--- a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKDatabaseApiLiveTest.java
+++ b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKDatabaseApiLiveTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.clouddatabases.uk.features;
 
-import org.jclouds.openstack.reddwarf.v1.features.DatabaseApiLiveTest;
+import org.jclouds.openstack.trove.v1.features.DatabaseApiLiveTest;
 import org.testng.annotations.Test;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKFlavorApiLiveTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKFlavorApiLiveTest.java b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKFlavorApiLiveTest.java
index 8d5bcef..75d0f4f 100644
--- a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKFlavorApiLiveTest.java
+++ b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKFlavorApiLiveTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.clouddatabases.uk.features;
 
-import org.jclouds.openstack.reddwarf.v1.features.FlavorApiLiveTest;
+import org.jclouds.openstack.trove.v1.features.FlavorApiLiveTest;
 import org.testng.annotations.Test;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKInstanceApiLiveTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKInstanceApiLiveTest.java b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKInstanceApiLiveTest.java
index 21923c3..7419e18 100644
--- a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKInstanceApiLiveTest.java
+++ b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKInstanceApiLiveTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.clouddatabases.uk.features;
 
-import org.jclouds.openstack.reddwarf.v1.features.InstanceApiLiveTest;
+import org.jclouds.openstack.trove.v1.features.InstanceApiLiveTest;
 import org.testng.annotations.Test;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKUserApiLiveTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKUserApiLiveTest.java b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKUserApiLiveTest.java
index 22c70a2..afde455 100644
--- a/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKUserApiLiveTest.java
+++ b/rackspace-clouddatabases-uk/src/test/java/org/jclouds/rackspace/clouddatabases/uk/features/CloudDatabasesUKUserApiLiveTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.clouddatabases.uk.features;
 
-import org.jclouds.openstack.reddwarf.v1.features.UserApiLiveTest;
+import org.jclouds.openstack.trove.v1.features.UserApiLiveTest;
 import org.testng.annotations.Test;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-us/pom.xml
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-us/pom.xml b/rackspace-clouddatabases-us/pom.xml
index 5acdc4e..8d6ab03 100644
--- a/rackspace-clouddatabases-us/pom.xml
+++ b/rackspace-clouddatabases-us/pom.xml
@@ -25,12 +25,12 @@
       <version>1.7.0-SNAPSHOT</version>
   </parent>
   
-  <!-- TODO: when out of labs, switch to org.jclouds.provider; update dependencies when RedDwarf is moved to jclouds -->
+  <!-- TODO: when out of labs, switch to org.jclouds.provider; update dependencies when Trove is moved to jclouds -->
   
   <groupId>org.apache.jclouds.provider</groupId>
   <artifactId>rackspace-clouddatabases-us</artifactId>
   <name>jclouds Rackspace Cloud Databases US provider</name>
-  <description>OpenStack RedDwarf implementation targeted to Rackspace Cloud Databases US</description>
+  <description>OpenStack Trove implementation targeted to Rackspace Cloud Databases US</description>
   <packaging>bundle</packaging>
 
   <properties>
@@ -57,7 +57,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.jclouds.labs</groupId>
-      <artifactId>openstack-reddwarf</artifactId>
+      <artifactId>openstack-trove</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
@@ -79,7 +79,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.jclouds.labs</groupId>
-      <artifactId>openstack-reddwarf</artifactId>
+      <artifactId>openstack-trove</artifactId>
       <version>${project.version}</version>
       <type>test-jar</type>
       <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-us/src/main/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadata.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-us/src/main/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadata.java b/rackspace-clouddatabases-us/src/main/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadata.java
index 8441ffd..6435fa3 100644
--- a/rackspace-clouddatabases-us/src/main/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadata.java
+++ b/rackspace-clouddatabases-us/src/main/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadata.java
@@ -25,9 +25,9 @@ import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERV
 import java.net.URI;
 import java.util.Properties;
 
-import org.jclouds.openstack.reddwarf.v1.RedDwarfApiMetadata;
-import org.jclouds.openstack.reddwarf.v1.config.RedDwarfParserModule;
-import org.jclouds.openstack.reddwarf.v1.config.RedDwarfHttpApiModule;
+import org.jclouds.openstack.trove.v1.TroveApiMetadata;
+import org.jclouds.openstack.trove.v1.config.TroveParserModule;
+import org.jclouds.openstack.trove.v1.config.TroveHttpApiModule;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
 import org.jclouds.providers.ProviderMetadata;
@@ -79,7 +79,7 @@ public class CloudDatabasesUSProviderMetadata extends BaseProviderMetadata {
       protected Builder(){
          id("rackspace-clouddatabases-us")
          .name("Rackspace Clouddatabases US")
-         .apiMetadata(new RedDwarfApiMetadata().toBuilder()
+         .apiMetadata(new TroveApiMetadata().toBuilder()
                   .identityName("${userName}")
                   .credentialName("${apiKey}")
                   .defaultEndpoint("https://identity.api.rackspacecloud.com/v2.0/")
@@ -89,8 +89,8 @@ public class CloudDatabasesUSProviderMetadata extends BaseProviderMetadata {
                                               .add(CloudIdentityAuthenticationApiModule.class)
                                               .add(CloudIdentityAuthenticationModule.class)
                                               .add(ZoneModule.class)
-                                              .add(RedDwarfParserModule.class)
-                                              .add(RedDwarfHttpApiModule.class).build())
+                                              .add(TroveParserModule.class)
+                                              .add(TroveHttpApiModule.class).build())
                   .build())
          .homepage(URI.create("http://www.rackspace.com/cloud/public/databases/"))
          .console(URI.create("https://mycloud.rackspace.com"))

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadataExpectTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadataExpectTest.java b/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadataExpectTest.java
index 7178898..ac49b61 100644
--- a/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadataExpectTest.java
+++ b/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderMetadataExpectTest.java
@@ -20,8 +20,8 @@ import static org.testng.Assert.assertEquals;
 
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
-import org.jclouds.openstack.reddwarf.v1.RedDwarfApi;
-import org.jclouds.openstack.reddwarf.v1.internal.BaseRedDwarfApiExpectTest;
+import org.jclouds.openstack.trove.v1.TroveApi;
+import org.jclouds.openstack.trove.v1.internal.BaseTroveApiExpectTest;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
@@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableSet;
  * @author Zack Shoylev
  */
 @Test(groups = "unit", testName = "CloudDatabasesUSProviderMetadataExpectTest")
-public class CloudDatabasesUSProviderMetadataExpectTest extends BaseRedDwarfApiExpectTest {
+public class CloudDatabasesUSProviderMetadataExpectTest extends BaseTroveApiExpectTest {
 
    public CloudDatabasesUSProviderMetadataExpectTest() {
       this.provider = "rackspace-clouddatabases-us";
@@ -55,7 +55,7 @@ public class CloudDatabasesUSProviderMetadataExpectTest extends BaseRedDwarfApiE
             .payload(payloadFromResourceWithContentType("/access_rax_us.json", "application/json"))
             .build();
 
-      RedDwarfApi whenRegionExists = requestSendsResponse(authenticate, authenticationResponse);
+      TroveApi whenRegionExists = requestSendsResponse(authenticate, authenticationResponse);
 
       assertEquals(whenRegionExists.getConfiguredZones(), ImmutableSet.of("ORD", "DFW", "SYD"));
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs-openstack/blob/0d9dd39a/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderTest.java
----------------------------------------------------------------------
diff --git a/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderTest.java b/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderTest.java
index 24255a1..e6dbbed 100644
--- a/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderTest.java
+++ b/rackspace-clouddatabases-us/src/test/java/org/jclouds/rackspace/clouddatabases/us/CloudDatabasesUSProviderTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.clouddatabases.us;
 
-import org.jclouds.openstack.reddwarf.v1.RedDwarfApiMetadata;
+import org.jclouds.openstack.trove.v1.TroveApiMetadata;
 import org.jclouds.providers.internal.BaseProviderMetadataTest;
 import org.testng.annotations.Test;
 
@@ -27,6 +27,6 @@ import org.testng.annotations.Test;
 public class CloudDatabasesUSProviderTest extends BaseProviderMetadataTest {
 
    public CloudDatabasesUSProviderTest() {
-      super(new CloudDatabasesUSProviderMetadata(), new RedDwarfApiMetadata());
+      super(new CloudDatabasesUSProviderMetadata(), new TroveApiMetadata());
    }
 }