You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2014/09/10 17:37:59 UTC

[3/6] Backports all neutron changes from master for 1.8.1

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java
new file mode 100644
index 0000000..346e820
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java
@@ -0,0 +1,631 @@
+/*
+ * 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.neutron.v2.extensions;
+
+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 static org.testng.Assert.fail;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
+import org.jclouds.openstack.neutron.v2.domain.NetworkStatus;
+import org.jclouds.openstack.neutron.v2.domain.Router;
+import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
+import org.jclouds.openstack.neutron.v2.domain.Routers;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests NetworkApi Guice wiring and parsing
+ *
+ */
+@Test
+public class RouterApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testCreateRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.CreateRouter createRouter = Router.createBuilder().name("another_router").adminStateUp(true)
+               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.create(createRouter);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/routers", "/router_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(router);
+         assertEquals(router.getName(), "another_router");
+         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "8ca37218-28ff-41cb-9b10-039601ea7e6b");
+         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
+         assertEquals(router.isAdminStateUp().booleanValue(), true);
+         assertEquals(router.getId(), "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e");
+         assertEquals(router.getTenantId(), "6b96ff0cb17a4b859e1e575d221683d3");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.CreateRouter createRouter = Router.createBuilder().name("another_router").adminStateUp(true)
+               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         api.create(createRouter);
+         fail("Should have failed with not found exception");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Routers routers = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertEquals(routers.size(), 2);
+         assertEquals(routers.first().get().getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Routers routers = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertTrue(routers.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Router> routers = api.list().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertEquals(routers.size(), 4);
+         assertEquals(routers.get(0).getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
+         assertEquals(routers.get(3).getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d_4");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Router> routers = api.list().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertTrue(routers.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router router = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(router);
+         assertEquals(router.getName(), "router1");
+         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8");
+         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
+         assertEquals(router.isAdminStateUp().booleanValue(), true);
+         assertEquals(router.getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
+         assertEquals(router.getTenantId(), "33a40233088643acb66ff6eb0ebea679");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router router = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(router);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_update_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.UpdateRouter updateRouter = Router.updateBuilder()
+               .externalGatewayInfo(
+                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.update("12345", updateRouter);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345", "/router_update_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(router);
+         assertEquals(router.getName(), "another_router");
+         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "8ca37218-28ff-41cb-9b10-039601ea7e6b");
+         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
+         assertEquals(router.isAdminStateUp().booleanValue(), true);
+         assertEquals(router.getId(), "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e");
+         assertEquals(router.getTenantId(), "6b96ff0cb17a4b859e1e575d221683d3");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.UpdateRouter updateRouter = Router.updateBuilder()
+               .externalGatewayInfo(
+                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.update("12345", updateRouter);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345", "/router_update_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(router);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.delete("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.delete("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForSubnet() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_add_interface_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routerInterface);
+         assertEquals(routerInterface.getSubnetId(), "a2f1f29d-571b-4533-907f-5803ab96ead1");
+         assertEquals(routerInterface.getPortId(), "3a44f4e5-1694-493a-a1fb-393881c673a4");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForSubnetFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(routerInterface);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForPort() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_add_interface_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routerInterface);
+         assertEquals(routerInterface.getSubnetId(), "a2f1f29d-571b-4533-907f-5803ab96ead1");
+         assertEquals(routerInterface.getPortId(), "3a44f4e5-1694-493a-a1fb-393881c673a4");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForPortFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(routerInterface);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForSubnet() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_subnet_request.json");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForSubnetFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_subnet_request.json");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForPort() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForPortFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java
new file mode 100644
index 0000000..a7ef1a6
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.domain.RuleDirection;
+import org.jclouds.openstack.neutron.v2.domain.RuleEthertype;
+import org.jclouds.openstack.neutron.v2.domain.RuleProtocol;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.testng.annotations.Test;
+
+/**
+ * Tests parsing and Guice wiring of RouterApi
+ */
+@Test(groups = "live", testName = "SecurityGroupApiLiveTest")
+public class SecurityGroupApiLiveTest extends BaseNeutronApiLiveTest {
+
+   /**
+    * Smoke test for the Security Group extension for Neutron
+    */
+   public void testCreateUpdateAndDeleteSecurityGroup() {
+      for (String region : api.getConfiguredRegions()) {
+         SecurityGroupApi sgApi = null;
+         Rule rule = null;
+         SecurityGroup securityGroup = null;
+
+         try {
+            sgApi = api.getSecurityGroupApi(region).get();
+
+            securityGroup = sgApi.create(
+                  SecurityGroup.createBuilder().name("jclouds-test").description("jclouds test security group")
+                        .build());
+            assertNotNull(securityGroup);
+
+            rule = sgApi.create(
+                  Rule.createBuilder(RuleDirection.EGRESS, securityGroup.getId())
+                        .ethertype(RuleEthertype.IPV6)
+                        .portRangeMax(90)
+                        .portRangeMin(80)
+                        .protocol(RuleProtocol.TCP)
+                        .build());
+
+            assertNotNull(rule);
+
+            // Refresh
+            securityGroup = sgApi.getSecurityGroup(securityGroup.getId());
+
+            assertEquals(securityGroup.getName(), "jclouds-test");
+            assertEquals(securityGroup.getDescription(), "jclouds test security group");
+
+            assertEquals(securityGroup.getRules().size(), 3);
+
+            Rule newSecGroupRule = null;
+
+            for (Rule sgr : securityGroup.getRules()) {
+               if (sgr.getId().equals(rule.getId())) {
+                  newSecGroupRule = sgr;
+                  break;
+               }
+            }
+            assertNotNull(newSecGroupRule, "Did not find the new rule in the group.");
+
+            assertEquals(rule, newSecGroupRule);
+
+            assertEquals(rule.getEthertype(), RuleEthertype.IPV6);
+            assertEquals(rule.getProtocol(), RuleProtocol.TCP);
+            assertEquals(rule.getPortRangeMax().intValue(), 90);
+            assertEquals(rule.getPortRangeMin().intValue(), 80);
+            assertEquals(rule.getDirection(), RuleDirection.EGRESS);
+         } finally {
+            try {
+               assertTrue(sgApi.deleteRule(rule.getId()));
+            } finally {
+               assertTrue(sgApi.deleteSecurityGroup(securityGroup.getId()));
+            }
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java
new file mode 100644
index 0000000..dfe6a80
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java
@@ -0,0 +1,659 @@
+/*
+ * 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.neutron.v2.extensions;
+
+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.io.IOException;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.domain.RuleDirection;
+import org.jclouds.openstack.neutron.v2.domain.RuleEthertype;
+import org.jclouds.openstack.neutron.v2.domain.RuleProtocol;
+import org.jclouds.openstack.neutron.v2.domain.Rules;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests NetworkApi Guice wiring and parsing
+ *
+ */
+@Test
+public class SecurityGroupApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testCreateSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup.CreateSecurityGroup createSecurityGroup = SecurityGroup.createBuilder().name("new-webservers")
+               .description("security group for webservers")
+               .build();
+
+         SecurityGroup securityGroup = api.create(createSecurityGroup);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/security-groups", "/security_group_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroup);
+         assertEquals(securityGroup.getId(), "2076db17-a522-4506-91de-c6dd8e837028");
+         assertEquals(securityGroup.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         assertEquals(securityGroup.getName(), "new-webservers");
+         assertEquals(securityGroup.getDescription(), "security group for webservers");
+
+         Rule sgr0 = securityGroup.getRules().get(0);
+         Rule sgr1 = securityGroup.getRules().get(1);
+
+         assertEquals(sgr0.getId(), "38ce2d8e-e8f1-48bd-83c2-d33cb9f50c3d");
+         assertEquals(sgr1.getId(), "565b9502-12de-4ffd-91e9-68885cff6ae1");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup.CreateSecurityGroup createSecurityGroup = SecurityGroup.createBuilder().name("new-webservers")
+               .description("security group for webservers")
+               .build();
+
+         SecurityGroup securityGroup = api.create(createSecurityGroup);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testCreateSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_rule_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule.CreateRule createSecurityGroupRule = Rule.createBuilder(
+               RuleDirection.INGRESS, "a7734e61-b545-452d-a3cd-0189cbd9747a")
+               .portRangeMin(80)
+               .portRangeMax(80)
+               .ethertype(RuleEthertype.IPV4)
+               .protocol(RuleProtocol.TCP)
+               .remoteGroupId("85cc3048-abc3-43cc-89b3-377341426ac5")
+               .build();
+
+         Rule rule = api.create(createSecurityGroupRule);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/security-group-rules", "/security_group_rule_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rule);
+         assertEquals(rule.getId(), "2bc0accf-312e-429a-956e-e4407625eb62");
+         assertEquals(rule.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         assertEquals(rule.getDirection(), RuleDirection.INGRESS);
+         assertEquals(rule.getPortRangeMax().intValue(), 80);
+         assertEquals(rule.getPortRangeMin().intValue(), 80);
+         assertEquals(rule.getEthertype(), RuleEthertype.IPV4);
+         assertEquals(rule.getProtocol(), RuleProtocol.TCP);
+         assertEquals(rule.getRemoteGroupId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(rule.getSecurityGroupId(), "a7734e61-b545-452d-a3cd-0189cbd9747a");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule.CreateRule createSecurityGroupRule = Rule.createBuilder(
+               RuleDirection.INGRESS, "a7734e61-b545-452d-a3cd-0189cbd9747a")
+               .portRangeMin(80)
+               .portRangeMax(80)
+               .ethertype(RuleEthertype.IPV4)
+               .protocol(RuleProtocol.TCP)
+               .remoteGroupId("85cc3048-abc3-43cc-89b3-377341426ac5")
+               .build();
+
+         Rule rule = api.create(createSecurityGroupRule);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroups securityGroups = api.listSecurityGroups(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertEquals(securityGroups.size(), 2);
+         // Ensures the full collection is parsed and ordering is preserved.
+         assertEquals(securityGroups.first().get().getId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(securityGroups.get(1).getId(), "85cc3048-abc3-43cc-89b3-377341426ac52");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroups securityGroups = api.listSecurityGroups(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertTrue(securityGroups.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_rule_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rules rules = api.listRules(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertEquals(rules.size(), 4);
+         // Ensures the full collection is parsed and ordering is preserved.
+         assertEquals(rules.first().get().getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+         assertEquals(rules.get(3).getId(), "f7d45c89-008e-4bab-88ad-d6811724c51c");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rules rules = api.listRules(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertTrue(rules.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroups() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<SecurityGroup> securityGroups = api.listSecurityGroups().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertEquals(securityGroups.size(), 4);
+         // Ensures ordering is preserved and both pages are parsed.
+         assertEquals(securityGroups.get(0).getId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(securityGroups.get(3).getId(), "85cc3048-abc3-43cc-89b3-377341426ac524");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroupsFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<SecurityGroup> securityGroups = api.listSecurityGroups().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertTrue(securityGroups.isEmpty());
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroupRules() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_rule_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_rule_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Rule> rules = api.listRules().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertEquals(rules.size(), 8);
+         // Ensures both pages are tested and ordering is preserved.
+         assertEquals(rules.get(0).getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+         assertEquals(rules.get(7).getId(), "f7d45c89-008e-4bab-88ad-d6811724c51c2");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroupRulesFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Rule> rules = api.listRules().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertTrue(rules.isEmpty());
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup securityGroup = api.getSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroup);
+         assertEquals(securityGroup.getName(), "default");
+         assertEquals(securityGroup.getDescription(), "default");
+         assertEquals(securityGroup.getId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(securityGroup.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         Rule sgr = securityGroup.getRules().get(0);
+         assertEquals(sgr.getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup securityGroup = api.getSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(securityGroup);
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_rule_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule rule = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rule);
+         assertEquals(rule.getDirection(), RuleDirection.EGRESS);
+         assertEquals(rule.getEthertype(), RuleEthertype.IPV6);
+         assertEquals(rule.getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+         assertEquals(rule.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         assertEquals(rule.getSecurityGroupId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule rule = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(rule);
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteRule("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteRule("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java
new file mode 100644
index 0000000..6dd729a
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.neutron.v2.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.jclouds.openstack.v2_0.domain.Extension;
+import org.jclouds.openstack.v2_0.features.ExtensionApi;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@link ExtensionApi}
+ */
+@Test(groups = "live", testName = "ExtensionApiLiveTest")
+public class ExtensionApiLiveTest extends BaseNeutronApiLiveTest {
+
+   /**
+    * Tests the listing of Neutron Extensions.
+    *
+    * @throws Exception
+    */
+   public void testListExtensions() throws Exception {
+      for (String regionId : api.getConfiguredRegions()) {
+         ExtensionApi extensionApi = api.getExtensionApi(regionId);
+         Set<Extension> response = extensionApi.list();
+         assertNotNull(response);
+         assertFalse(response.isEmpty());
+
+         for (Extension extension : response) {
+            assertNotNull(extension.getId());
+            assertNotNull(extension.getName());
+            assertNotNull(extension.getDescription());
+            assertNotNull(extension.getNamespace());
+            assertNotNull(extension.getUpdated());
+            assertNotNull(extension.getLinks());
+         }
+      }
+   }
+
+   /**
+    * Tests retrieval of Neutron Extensions by their alias.
+    *
+    * @throws Exception
+    */
+   public void testGetExtensionByAlias() throws Exception {
+      for (String regionId : api.getConfiguredRegions()) {
+         ExtensionApi extensionApi = api.getExtensionApi(regionId);
+         Set<Extension> response = extensionApi.list();
+         assertNotNull(response);
+
+         for (Extension extension : response) {
+            Extension details = extensionApi.get(extension.getId());
+            assertNotNull(details);
+            assertEquals(details.getId(), extension.getId());
+            assertEquals(details.getName(), extension.getName());
+            assertEquals(details.getDescription(), extension.getDescription());
+            assertEquals(details.getNamespace(), extension.getNamespace());
+            assertEquals(details.getUpdated(), extension.getUpdated());
+            assertEquals(details.getLinks(), extension.getLinks());
+         }
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java
new file mode 100644
index 0000000..b9615d6
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.neutron.v2.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.domain.Extension;
+import org.jclouds.openstack.v2_0.features.ExtensionApi;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests annotation parsing of {@code ExtensionApi}
+ */
+@Test(groups = "unit", testName = "ExtensionApiMockTest")
+public class ExtensionApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testListExtensions() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse()
+         .setResponseCode(200).setBody(stringFromResource("/extension_list.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         ExtensionApi api = neutronApi.getExtensionApi("RegionOne");
+
+         Set<Extension> extensions = api.list();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertExtensions(server, "/v2.0");
+
+         /*
+          * Check response
+          */
+         assertNotNull(extensions);
+         assertEquals(extensions.size(), 17);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListExtensionsIsEmpty() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         ExtensionApi api = neutronApi.getExtensionApi("RegionOne");
+
+         Set<Extension> extensions = api.list();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/extensions");
+
+         /*
+          * Check response
+          */
+         assertTrue(extensions.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetExtensionByAlias() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse()
+         .setResponseCode(200).setBody(stringFromResource("/extension_details.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+
+         Extension routerExtension = neutronApi.getExtensionApi("RegionOne").get("router");
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/extensions/router");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routerExtension);
+         assertEquals(routerExtension.getName(), "Neutron L3 Router");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetExtensionByAliasFail() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+
+         Extension routerExtension = neutronApi.getExtensionApi("RegionOne").get("router");
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/extensions/router");
+
+         /*
+          * Check response
+          */
+         assertNull(routerExtension);
+      } finally {
+         server.shutdown();
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
index ba5b9ee..1d4e3a0 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
@@ -40,8 +40,8 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
    public void testCreateUpdateAndDeleteNetwork() {
       for (String region : api.getConfiguredRegions()) {
          NetworkApi networkApi = api.getNetworkApi(region);
-         Network net = networkApi.create(Network.createOptions("jclouds-test").networkType(NetworkType.LOCAL).build());
-         Network test = networkApi.create(Network.createOptions("jclouds-test").build());
+         Network net = networkApi.create(Network.createBuilder("jclouds-test").networkType(NetworkType.LOCAL).build());
+         Network test = networkApi.create(Network.createBuilder("jclouds-test").build());
          assertNotNull(net);
 
          /* List and get tests */
@@ -57,7 +57,7 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(network.getName(), "jclouds-test");
          assertEquals(network.getNetworkType(), NetworkType.LOCAL);
          assertTrue(network.getSubnets().isEmpty());
-         assertNotNull(networkApi.update(net.getId(), Network.updateOptions().name("jclouds-live-test").build()));
+         assertNotNull(networkApi.update(net.getId(), Network.updateBuilder().name("jclouds-live-test").build()));
 
          network = networkApi.get(net.getId());
 
@@ -65,7 +65,7 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(network.getName(), "jclouds-live-test");
          assertTrue(network.getSubnets().isEmpty());
 
-         Network net2 = networkApi.create(Network.createOptions("jclouds-test2").networkType(NetworkType.LOCAL).build());
+         Network net2 = networkApi.create(Network.createBuilder("jclouds-test2").networkType(NetworkType.LOCAL).build());
          assertNotNull(net2);
 
          assertTrue(networkApi.delete(net.getId()));
@@ -79,9 +79,9 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
          NetworkApi networkApi = api.getNetworkApi(region);
          Set<Network> nets = networkApi.createBulk(
                ImmutableList.of(
-                  Network.createOptions("jclouds-live-test-1").networkType(NetworkType.LOCAL).adminStateUp(true).build(),
-                  Network.createOptions("jclouds-live-test-2").networkType(NetworkType.LOCAL).adminStateUp(false).build(),
-                  Network.createOptions("jclouds-live-test-3").networkType(NetworkType.LOCAL).adminStateUp(false).build()
+                  Network.createBuilder("jclouds-live-test-1").networkType(NetworkType.LOCAL).adminStateUp(true).build(),
+                  Network.createBuilder("jclouds-live-test-2").networkType(NetworkType.LOCAL).adminStateUp(false).build(),
+                  Network.createBuilder("jclouds-live-test-3").networkType(NetworkType.LOCAL).adminStateUp(false).build()
                )
          ).toSet();
          Set<Network> existingNets = networkApi.list().concat().toSet();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
index 3ef3a85..641e276 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
@@ -56,7 +56,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -92,7 +92,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -285,11 +285,11 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork1 = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork1 = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
-         Network.CreateOptions createNetwork2 = Network.createOptions("jclouds-wibble2")
+         Network.CreateNetwork createNetwork2 = Network.createBuilder("jclouds-wibble2")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -332,11 +332,11 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork1 = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork1 = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
-         Network.CreateOptions createNetwork2 = Network.createOptions("jclouds-wibble2")
+         Network.CreateNetwork createNetwork2 = Network.createBuilder("jclouds-wibble2")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -355,7 +355,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.UpdateOptions updateNetwork = Network.updateOptions()
+         Network.UpdateNetwork updateNetwork = Network.updateBuilder()
                .name("jclouds-wibble-updated")
                .networkType(NetworkType.LOCAL)
                .build();
@@ -388,7 +388,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.UpdateOptions updateNetwork = Network.updateOptions()
+         Network.UpdateNetwork updateNetwork = Network.updateBuilder()
                .name("jclouds-wibble-updated")
                .networkType(NetworkType.LOCAL)
                .build();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
index 8ca9f9a..bcde014 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
@@ -48,19 +48,19 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
          SubnetApi subnetApi = api.getSubnetApi(region);
          PortApi portApi = api.getPortApi(region);
          String networkId = networkApi.create(
-               Network.createOptions("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
-         String ipv4SubnetId = subnetApi.create(Subnet.createOptions(networkId, "198.51.100.0/24").ipVersion(4)
+               Network.createBuilder("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
+         String ipv4SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "198.51.100.0/24").ipVersion(4)
                .name("JClouds-Live-IPv4-Subnet").build()).getId();
-         String ipv6SubnetId = subnetApi.create(Subnet.createOptions(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
+         String ipv6SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
                .name("JClouds-Live-IPv6-Subnet").build()).getId();
 
          assertNotNull(networkId);
          assertNotNull(ipv4SubnetId);
          assertNotNull(ipv6SubnetId);
 
-         String ipv4PortId = portApi.create(Port.createOptions(networkId).name("JClouds-Live-IPv4-Port")
+         String ipv4PortId = portApi.create(Port.createBuilder(networkId).name("JClouds-Live-IPv4-Port")
                .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv4SubnetId))).build()).getId();
-         String ipv6PortId = portApi.create(Port.createOptions(networkId).name("JClouds-Live-IPv6-Port")
+         String ipv6PortId = portApi.create(Port.createBuilder(networkId).name("JClouds-Live-IPv6-Port")
                .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv6SubnetId))).build()).getId();
 
          /* List and get test */
@@ -83,7 +83,7 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(ipv6Port.getId(), ipv6PortId);
          assertEquals(ipv6Port.getName(), "JClouds-Live-IPv6-Port");
 
-         assertNotNull(portApi.update(ipv4PortId, Port.updateOptions().name("Updated").build()));
+         assertNotNull(portApi.update(ipv4PortId, Port.updateBuilder().name("Updated").build()));
          Port updatedIpv4Port = portApi.get(ipv4PortId);
          assertEquals(updatedIpv4Port.getName(), "Updated");
 
@@ -102,10 +102,10 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
          PortApi portApi = api.getPortApi(region);
 
          String networkId = networkApi.create(
-               Network.createOptions("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
-         String ipv4SubnetId = subnetApi.create(Subnet.createOptions(networkId, "198.51.100.0/24").ipVersion(4)
+               Network.createBuilder("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
+         String ipv4SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "198.51.100.0/24").ipVersion(4)
                .name("JClouds-Live-IPv4-Subnet").build()).getId();
-         String ipv6SubnetId = subnetApi.create(Subnet.createOptions(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
+         String ipv6SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
                .name("JClouds-Live-IPv6-Subnet").build()).getId();
 
          assertNotNull(networkId);
@@ -114,13 +114,13 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
 
          Set<? extends Port> ports = portApi.createBulk(
                ImmutableList.of(
-                     Port.createOptions(networkId).name("JClouds-Live-IPv4-Subnet-1")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv4-Subnet-1")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv4SubnetId))).build(),
-                     Port.createOptions(networkId).name("JClouds-Live-IPv4-Subnet-2")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv4-Subnet-2")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv4SubnetId))).build(),
-                     Port.createOptions(networkId).name("JClouds-Live-IPv6-Subnet-1")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv6-Subnet-1")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv6SubnetId))).build(),
-                     Port.createOptions(networkId).name("JClouds-Live-IPv6-Subnet-2")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv6-Subnet-2")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv6SubnetId))).build()
                )
          ).toSet();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
index d1d3c3b..a9a2dc4 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
@@ -61,11 +61,11 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort = Port.createOptions("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
+         Port.CreatePort createPort = Port.createBuilder("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
                .name("port1")
                .adminStateUp(true)
                .deviceId("d6b4d3a5-c700-476f-b609-1493dd9dadc0")
-               .allowedAddressPairs(ImmutableSet.of(AddressPair.createOptions("12", "111.222.333.444").build()))
+               .allowedAddressPairs(ImmutableSet.of(AddressPair.builder("12", "111.222.333.444").build()))
                .build();
 
          Port port = api.create(createPort);
@@ -108,11 +108,11 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort = Port.createOptions("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
+         Port.CreatePort createPort = Port.createBuilder("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
                .name("port1")
                .adminStateUp(true)
                .deviceId("d6b4d3a5-c700-476f-b609-1493dd9dadc0")
-               .allowedAddressPairs(ImmutableSet.of(AddressPair.createOptions("12", "111.222.333.444").build()))
+               .allowedAddressPairs(ImmutableSet.of(AddressPair.builder("12", "111.222.333.444").build()))
                .build();
 
          Port port = api.create(createPort);
@@ -246,14 +246,14 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort1 = Port.createOptions("64239a54-dcc4-4b39-920b-b37c2144effa")
+         Port.CreatePort createPort1 = Port.createBuilder("64239a54-dcc4-4b39-920b-b37c2144effa")
                .name("port1")
                .adminStateUp(true)
                .deviceId("24df1d04-d5cb-41e1-8de5-61ed77c558df")
                .securityGroups(ImmutableSet.of("dbc107f4-afcd-4d5a-9352-f68f82241d5b"))
                .build();
 
-         Port.CreateOptions createPort2 = Port.createOptions("e6031bc2-901a-4c66-82da-f4c32ed89406")
+         Port.CreatePort createPort2 = Port.createBuilder("e6031bc2-901a-4c66-82da-f4c32ed89406")
                .name("port2")
                .adminStateUp(false)
                .securityGroups(
@@ -291,14 +291,14 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort1 = Port.createOptions("64239a54-dcc4-4b39-920b-b37c2144effa")
+         Port.CreatePort createPort1 = Port.createBuilder("64239a54-dcc4-4b39-920b-b37c2144effa")
                .name("port1")
                .adminStateUp(true)
                .deviceId("24df1d04-d5cb-41e1-8de5-61ed77c558df")
                .securityGroups(ImmutableSet.of("dbc107f4-afcd-4d5a-9352-f68f82241d5b"))
                .build();
 
-         Port.CreateOptions createPort2 = Port.createOptions("e6031bc2-901a-4c66-82da-f4c32ed89406")
+         Port.CreatePort createPort2 = Port.createBuilder("e6031bc2-901a-4c66-82da-f4c32ed89406")
                .name("port2")
                .adminStateUp(false)
                .securityGroups(
@@ -384,7 +384,7 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.UpdateOptions updatePort = Port.updateOptions()
+         Port.UpdatePort updatePort = Port.updateBuilder()
                .securityGroups(
                      ImmutableSet.of("85cc3048-abc3-43cc-89b3-377341426ac5", "c5ab5c29-2c99-44cb-a4b8-e70a88b77799"))
                .build();
@@ -417,7 +417,7 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.UpdateOptions updatePort = Port.updateOptions()
+         Port.UpdatePort updatePort = Port.updateBuilder()
                .securityGroups(ImmutableSet.of("85cc3048-abc3-43cc-89b3-377341426ac5", "c5ab5c29-2c99-44cb-a4b8-e70a88b77799"))
                .build();