You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by jd...@apache.org on 2014/08/26 23:06:22 UTC

[1/2] Strip hardcoded v2.0 in Neutron APIs. Prefer usage of ApiMetadata version string.

Repository: jclouds-labs-openstack
Updated Branches:
  refs/heads/master 23a293ec5 -> 92112318c


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
index a1ac790..fd4a50e 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
@@ -16,13 +16,13 @@
  */
 package org.jclouds.openstack.neutron.v2.internal;
 
-import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
-import org.jclouds.openstack.neutron.v2.NeutronApi;
-import org.jclouds.openstack.v2_0.internal.BaseOpenStackMockTest;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
 
 import java.util.Properties;
 
-import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
+import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.v2_0.internal.BaseOpenStackMockTest;
 
 /**
  * Base class for writing Neutron Mock tests

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/test/resources/extension_details.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/extension_details.json b/openstack-neutron/src/test/resources/extension_details.json
new file mode 100644
index 0000000..9e10fef
--- /dev/null
+++ b/openstack-neutron/src/test/resources/extension_details.json
@@ -0,0 +1,10 @@
+{
+    "extension": {
+        "name": "Neutron L3 Router",
+        "namespace": "http://docs.openstack.org/ext/neutron/router/api/v1.0",
+        "alias": "router",
+        "updated": "2012-07-20T10:00:00-00:00",
+        "description": "Router abstraction for basic L3 forwarding between L2 Neutron networks and access to external networks via a NAT gateway.",
+        "links": []
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/test/resources/extension_list.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/extension_list.json b/openstack-neutron/src/test/resources/extension_list.json
new file mode 100644
index 0000000..9f85e1e
--- /dev/null
+++ b/openstack-neutron/src/test/resources/extension_list.json
@@ -0,0 +1,140 @@
+{
+    "extensions": [
+        {
+            "updated": "2013-01-20T00:00:00-00:00",
+            "name": "Neutron Service Type Management",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/service-type/api/v1.0",
+            "alias": "service-type",
+            "description": "API for retrieving service providers for Neutron advanced services"
+        },
+        {
+            "updated": "2012-10-05T10:00:00-00:00",
+            "name": "security-group",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/securitygroups/api/v2.0",
+            "alias": "security-group",
+            "description": "The security groups extension."
+        },
+        {
+            "updated": "2013-02-07T10:00:00-00:00",
+            "name": "L3 Agent Scheduler",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/l3_agent_scheduler/api/v1.0",
+            "alias": "l3_agent_scheduler",
+            "description": "Schedule routers among l3 agents"
+        },
+        {
+            "updated": "2013-02-07T10:00:00-00:00",
+            "name": "Loadbalancer Agent Scheduler",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/lbaas_agent_scheduler/api/v1.0",
+            "alias": "lbaas_agent_scheduler",
+            "description": "Schedule pools among lbaas agents"
+        },
+        {
+            "updated": "2013-03-28T10:00:00-00:00",
+            "name": "Neutron L3 Configurable external gateway mode",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/ext-gw-mode/api/v1.0",
+            "alias": "ext-gw-mode",
+            "description": "Extension of the router abstraction for specifying whether SNAT should occur on the external gateway"
+        },
+        {
+            "updated": "2014-02-03T10:00:00-00:00",
+            "name": "Port Binding",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/binding/api/v1.0",
+            "alias": "binding",
+            "description": "Expose port bindings of a virtual port to external application"
+        },
+        {
+            "updated": "2012-09-07T10:00:00-00:00",
+            "name": "Provider Network",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/provider/api/v1.0",
+            "alias": "provider",
+            "description": "Expose mapping of virtual networks to physical networks"
+        },
+        {
+            "updated": "2013-02-03T10:00:00-00:00",
+            "name": "agent",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/agent/api/v2.0",
+            "alias": "agent",
+            "description": "The agent management extension."
+        },
+        {
+            "updated": "2012-07-29T10:00:00-00:00",
+            "name": "Quota management support",
+            "links": [],
+            "namespace": "http://docs.openstack.org/network/ext/quotas-sets/api/v2.0",
+            "alias": "quotas",
+            "description": "Expose functions for quotas management per tenant"
+        },
+        {
+            "updated": "2013-02-07T10:00:00-00:00",
+            "name": "DHCP Agent Scheduler",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/dhcp_agent_scheduler/api/v1.0",
+            "alias": "dhcp_agent_scheduler",
+            "description": "Schedule networks among dhcp agents"
+        },
+        {
+            "updated": "2013-06-27T10:00:00-00:00",
+            "name": "Multi Provider Network",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/multi-provider/api/v1.0",
+            "alias": "multi-provider",
+            "description": "Expose mapping of virtual networks to multiple physical networks"
+        },
+        {
+            "updated": "2013-01-14T10:00:00-00:00",
+            "name": "Neutron external network",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/external_net/api/v1.0",
+            "alias": "external-net",
+            "description": "Adds external network attribute to network resource."
+        },
+        {
+            "updated": "2012-07-20T10:00:00-00:00",
+            "name": "Neutron L3 Router",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/router/api/v1.0",
+            "alias": "router",
+            "description": "Router abstraction for basic L3 forwarding between L2 Neutron networks and access to external networks via a NAT gateway."
+        },
+        {
+            "updated": "2013-07-23T10:00:00-00:00",
+            "name": "Allowed Address Pairs",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/allowedaddresspairs/api/v2.0",
+            "alias": "allowed-address-pairs",
+            "description": "Provides allowed address pairs"
+        },
+        {
+            "updated": "2013-03-17T12:00:00-00:00",
+            "name": "Neutron Extra DHCP opts",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/extra_dhcp_opt/api/v1.0",
+            "alias": "extra_dhcp_opt",
+            "description": "Extra options configuration for DHCP. For example PXE boot options to DHCP clients can be specified (e.g. tftp-server, server-ip-address, bootfile-name)"
+        },
+        {
+            "updated": "2012-10-07T10:00:00-00:00",
+            "name": "LoadBalancing service",
+            "links": [],
+            "namespace": "http://wiki.openstack.org/neutron/LBaaS/API_1.0",
+            "alias": "lbaas",
+            "description": "Extension for LoadBalancing service"
+        },
+        {
+            "updated": "2013-02-01T10:00:00-00:00",
+            "name": "Neutron Extra Route",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/extraroutes/api/v1.0",
+            "alias": "extraroute",
+            "description": "Extra routes configuration for L3 router"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java
index 36bdc21..9558a16 100644
--- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java
+++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiLiveTest.java
@@ -32,18 +32,14 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.TimeUnit;
 
-import javax.ws.rs.PathParam;
-
 import org.jclouds.http.options.GetOptions;
 import org.jclouds.io.Payload;
 import org.jclouds.openstack.swift.v1.CopyObjectException;
 import org.jclouds.openstack.swift.v1.SwiftApi;
-import org.jclouds.openstack.swift.v1.binders.SetPayload;
 import org.jclouds.openstack.swift.v1.domain.ObjectList;
 import org.jclouds.openstack.swift.v1.domain.SwiftObject;
 import org.jclouds.openstack.swift.v1.internal.BaseSwiftApiLiveTest;
 import org.jclouds.openstack.swift.v1.options.ListContainerOptions;
-import org.jclouds.rest.annotations.BinderParam;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java
index d267f11..eaece48 100644
--- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java
+++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java
@@ -18,8 +18,6 @@ package org.jclouds.openstack.swift.v1.features;
 
 import static com.google.common.base.Charsets.US_ASCII;
 import static com.google.common.net.HttpHeaders.EXPIRES;
-import static com.google.common.net.HttpHeaders.RANGE;
-import static com.google.common.net.HttpHeaders.LAST_MODIFIED;
 import static org.jclouds.Constants.PROPERTY_MAX_RETRIES;
 import static org.jclouds.Constants.PROPERTY_RETRY_DELAY_START;
 import static org.jclouds.Constants.PROPERTY_SO_TIMEOUT;


[2/2] git commit: Strip hardcoded v2.0 in Neutron APIs. Prefer usage of ApiMetadata version string.

Posted by jd...@apache.org.
Strip hardcoded v2.0 in Neutron APIs. Prefer usage of ApiMetadata version string.


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

Branch: refs/heads/master
Commit: 92112318c14e7d779463b57f4701d19736f00297
Parents: 23a293e
Author: Jeremy Daggett <je...@rackspace.com>
Authored: Fri Aug 22 10:44:35 2014 -0700
Committer: Jeremy Daggett <je...@rackspace.com>
Committed: Tue Aug 26 14:05:12 2014 -0700

----------------------------------------------------------------------
 .../openstack/neutron/v2/NeutronApi.java        |   4 +
 .../neutron/v2/NeutronApiMetadata.java          |   2 +-
 .../neutron/v2/extensions/RouterApi.java        |   2 +-
 .../neutron/v2/features/NetworkApi.java         |   2 +-
 .../openstack/neutron/v2/features/PortApi.java  |   2 +-
 .../neutron/v2/features/SubnetApi.java          |   2 +-
 .../v2/extensions/RouterApiLiveTest.java        | 173 +++++
 .../v2/extensions/RouterApiMockTest.java        | 631 +++++++++++++++++++
 .../v2/features/ExtensionApiLiveTest.java       |  83 +++
 .../v2/features/ExtensionApiMockTest.java       | 152 +++++
 .../neutron/v2/features/RouterApiLiveTest.java  | 171 -----
 .../neutron/v2/features/RouterApiMockTest.java  | 631 -------------------
 .../v2/internal/BaseNeutronApiMockTest.java     |   8 +-
 .../src/test/resources/extension_details.json   |  10 +
 .../src/test/resources/extension_list.json      | 140 ++++
 .../swift/v1/features/ObjectApiLiveTest.java    |   4 -
 .../swift/v1/features/ObjectApiMockTest.java    |   2 -
 17 files changed, 1202 insertions(+), 817 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
index 29a75e1..233c41b 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
@@ -19,6 +19,9 @@ package org.jclouds.openstack.neutron.v2;
 import java.io.Closeable;
 import java.util.Set;
 
+import javax.ws.rs.Path;
+
+import org.jclouds.Constants;
 import org.jclouds.location.Region;
 import org.jclouds.location.functions.RegionToEndpoint;
 import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
@@ -35,6 +38,7 @@ import com.google.inject.Provides;
 /**
  * Provides access to the OpenStack Networking (Neutron) v2 API.
  */
+@Path("{" + Constants.PROPERTY_API_VERSION + "}")
 public interface NeutronApi extends Closeable {
    /**
     * @return the Region codes configured

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
index d11cbb7..043bed8 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
@@ -70,7 +70,7 @@ public class NeutronApiMetadata extends BaseHttpApiMetadata<NeutronApi> {
             .credentialName("${password}")
             .endpointName("Neutron base url ending in /v2.0/")
             .documentation(URI.create("http://docs.openstack.org/api/openstack-network/2.0/content/"))
-            .version("2.0")
+            .version("v2.0")
             .defaultEndpoint("http://localhost:5000/v2.0/")
             .defaultProperties(NeutronApiMetadata.defaultProperties())
             .defaultModules(ImmutableSet.<Class<? extends Module>>builder()

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
index 376cdea..37cc282 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
@@ -61,7 +61,7 @@ import com.google.common.annotations.Beta;
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/router_ext.html">api doc</a>
  */
 @Beta
-@Path("/v2.0/routers")
+@Path("/routers")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 public interface RouterApi {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
index 6ab6fc9..769ae1f 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
@@ -58,7 +58,7 @@ import javax.ws.rs.core.MediaType;
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/Networks.html">api doc</a>
  */
 @Beta
-@Path("/v2.0/networks")
+@Path("/networks")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
index dabdc86..30cdacc 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
@@ -57,7 +57,7 @@ import java.util.List;
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/Ports.html">api doc</a>
  */
 @Beta
-@Path("/v2.0/ports")
+@Path("/ports")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 public interface PortApi {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
index a3aec61..3484e4a 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
@@ -53,7 +53,7 @@ import java.util.List;
  * @see <a href=
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/Subnets.html">api doc</a>
  */
-@Path("/v2.0/subnets")
+@Path("/subnets")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java
new file mode 100644
index 0000000..5f06195
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java
@@ -0,0 +1,173 @@
+/*
+ * 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 java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
+import org.jclouds.openstack.neutron.v2.domain.Network;
+import org.jclouds.openstack.neutron.v2.domain.NetworkType;
+import org.jclouds.openstack.neutron.v2.domain.Port;
+import org.jclouds.openstack.neutron.v2.domain.Router;
+import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
+import org.jclouds.openstack.neutron.v2.domain.Subnet;
+import org.jclouds.openstack.neutron.v2.features.NetworkApi;
+import org.jclouds.openstack.neutron.v2.features.PortApi;
+import org.jclouds.openstack.neutron.v2.features.SubnetApi;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.testng.annotations.Test;
+
+/**
+ * Tests parsing and Guice wiring of RouterApi
+ */
+@Test(groups = "live", testName = "RouterApiLiveTest")
+public class RouterApiLiveTest extends BaseNeutronApiLiveTest {
+
+   public void testCreateUpdateAndDeleteRouter() {
+      for (String region : api.getConfiguredRegions()) {
+         RouterApi routerApi = api.getRouterExtensionApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+         SubnetApi subnetApi = api.getSubnetApi(region);
+
+         Network network = networkApi.create(
+               Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network);
+
+         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet);
+
+         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test")
+            .externalGatewayInfo(ExternalGatewayInfo.builder().networkId(network.getId()).build()).build());
+         assertNotNull(router);
+
+         /* List and Get test */
+         Set<Router> routers = api.getRouterExtensionApi(region).get().list().concat().toSet();
+         Router routerList = routers.iterator().next();
+         Router routerGet = api.getRouterExtensionApi(region).get().get(routerList.getId());
+
+         assertNotNull(routerGet);
+         assertEquals(routerGet, routerList);
+         /***/
+
+         routerGet = routerApi.get(router.getId());
+
+         assertEquals(routerGet.getName(), router.getName());
+         assertEquals(routerGet.getId(), router.getId());
+         assertEquals(routerGet.getExternalGatewayInfo(), router.getExternalGatewayInfo());
+
+         Router routerUpdate = routerApi.update(router.getId(), Router.updateOptions().name("jclouds-router-test-rename").build());
+         assertNotNull(routerUpdate);
+         assertEquals(routerUpdate.getName(), "jclouds-router-test-rename");
+
+         routerGet = routerApi.get(router.getId());
+
+         assertEquals(routerGet.getId(), router.getId());
+         assertEquals(routerGet.getName(), "jclouds-router-test-rename");
+
+         assertTrue(routerApi.delete(router.getId()));
+         assertTrue(subnetApi.delete(subnet.getId()));
+         assertTrue(networkApi.delete(network.getId()));
+      }
+   }
+
+   public void testCreateAndDeleteRouterInterfaceForSubnet() {
+      for (String region : api.getConfiguredRegions()) {
+         RouterApi routerApi = api.getRouterExtensionApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+         SubnetApi subnetApi = api.getSubnetApi(region);
+
+         Network network = networkApi.create(Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network);
+
+         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet);
+
+         Network network2 = networkApi.create(Network.createOptions("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network2);
+
+         Subnet subnet2 = subnetApi.create(Subnet.createOptions(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet2);
+
+         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test").build());
+         assertNotNull(router);
+
+         RouterInterface routerInterface = routerApi.addInterfaceForSubnet(router.getId(), subnet.getId());
+         assertNotNull(routerInterface);
+
+         RouterInterface routerInterface2 = routerApi.addInterfaceForSubnet(router.getId(), subnet2.getId());
+         assertNotNull(routerInterface2);
+
+         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet.getId()));
+         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet2.getId()));
+         assertTrue(routerApi.delete(router.getId()));
+         assertTrue(subnetApi.delete(subnet.getId()));
+         assertTrue(networkApi.delete(network.getId()));
+         assertTrue(subnetApi.delete(subnet2.getId()));
+         assertTrue(networkApi.delete(network2.getId()));
+      }
+   }
+
+   public void testCreateAndDeleteRouterInterfaceForPort() {
+      for (String region : api.getConfiguredRegions()) {
+         RouterApi routerApi = api.getRouterExtensionApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+         SubnetApi subnetApi = api.getSubnetApi(region);
+         PortApi portApi = api.getPortApi(region);
+
+         Network network = networkApi.create(Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network);
+
+         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet);
+
+         Network network2 = networkApi.create(Network.createOptions("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network2);
+
+         Subnet subnet2 = subnetApi.create(Subnet.createOptions(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet2);
+
+         Port port = portApi.create(Port.createOptions(network.getId()).build());
+         assertNotNull(port);
+
+         Port port2 = portApi.create(Port.createOptions(network2.getId()).build());
+         assertNotNull(port2);
+
+         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test").build());
+         assertNotNull(router);
+
+         RouterInterface routerInterface = routerApi.addInterfaceForPort(router.getId(), port.getId());
+         assertNotNull(routerInterface);
+
+         RouterInterface routerInterface2 = routerApi.addInterfaceForPort(router.getId(), port2.getId());
+         assertNotNull(routerInterface2);
+
+         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port.getId()));
+         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port2.getId()));
+         assertTrue(routerApi.delete(router.getId()));
+         assertTrue(subnetApi.delete(subnet.getId()));
+         assertTrue(networkApi.delete(network.getId()));
+         assertTrue(subnetApi.delete(subnet2.getId()));
+         assertTrue(networkApi.delete(network2.getId()));
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/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..0d16f39
--- /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.getRouterExtensionApi("RegionOne").get();
+
+         Router.CreateOptions createRouter = Router.createOptions().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.getRouterExtensionApi("RegionOne").get();
+
+         Router.CreateOptions createRouter = Router.createOptions().name("another_router").adminStateUp(true)
+               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.create(createRouter);
+         fail("Should have failed with not found exception");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPagePort() 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.getRouterExtensionApi("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 testListSpecificPagePortFail() 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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("RegionOne").get();
+
+         Router.UpdateOptions updateOptions = Router.updateOptions()
+               .externalGatewayInfo(
+                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.update("12345", updateOptions);
+
+         /*
+          * 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.getRouterExtensionApi("RegionOne").get();
+
+         Router.UpdateOptions updateOptions = Router.updateOptions()
+               .externalGatewayInfo(
+                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.update("12345", updateOptions);
+
+         /*
+          * 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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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/92112318/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/92112318/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/92112318/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java
deleted file mode 100644
index 4e364a5..0000000
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java
+++ /dev/null
@@ -1,171 +0,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.
- */
-
-package org.jclouds.openstack.neutron.v2.features;
-
-import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
-import org.jclouds.openstack.neutron.v2.domain.Network;
-import org.jclouds.openstack.neutron.v2.domain.NetworkType;
-import org.jclouds.openstack.neutron.v2.domain.Port;
-import org.jclouds.openstack.neutron.v2.domain.Router;
-import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
-import org.jclouds.openstack.neutron.v2.domain.Subnet;
-import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
-import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests parsing and Guice wiring of RouterApi
- */
-@Test(groups = "live", testName = "RouterApiLiveTest")
-public class RouterApiLiveTest extends BaseNeutronApiLiveTest {
-
-   public void testCreateUpdateAndDeleteRouter() {
-      for (String region : api.getConfiguredRegions()) {
-         RouterApi routerApi = api.getRouterExtensionApi(region).get();
-         NetworkApi networkApi = api.getNetworkApi(region);
-         SubnetApi subnetApi = api.getSubnetApi(region);
-
-         Network network = networkApi.create(
-               Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network);
-
-         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet);
-
-         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test")
-            .externalGatewayInfo(ExternalGatewayInfo.builder().networkId(network.getId()).build()).build());
-         assertNotNull(router);
-
-         /* List and Get test */
-         Set<Router> routers = api.getRouterExtensionApi(region).get().list().concat().toSet();
-         Router routerList = routers.iterator().next();
-         Router routerGet = api.getRouterExtensionApi(region).get().get(routerList.getId());
-
-         assertNotNull(routerGet);
-         assertEquals(routerGet, routerList);
-         /***/
-
-         routerGet = routerApi.get(router.getId());
-
-         assertEquals(routerGet.getName(), router.getName());
-         assertEquals(routerGet.getId(), router.getId());
-         assertEquals(routerGet.getExternalGatewayInfo(), router.getExternalGatewayInfo());
-
-         Router routerUpdate = routerApi.update(router.getId(), Router.updateOptions().name("jclouds-router-test-rename").build());
-         assertNotNull(routerUpdate);
-         assertEquals(routerUpdate.getName(), "jclouds-router-test-rename");
-
-         routerGet = routerApi.get(router.getId());
-
-         assertEquals(routerGet.getId(), router.getId());
-         assertEquals(routerGet.getName(), "jclouds-router-test-rename");
-
-         assertTrue(routerApi.delete(router.getId()));
-         assertTrue(subnetApi.delete(subnet.getId()));
-         assertTrue(networkApi.delete(network.getId()));
-      }
-   }
-
-   public void testCreateAndDeleteRouterInterfaceForSubnet() {
-      for (String region : api.getConfiguredRegions()) {
-         RouterApi routerApi = api.getRouterExtensionApi(region).get();
-         NetworkApi networkApi = api.getNetworkApi(region);
-         SubnetApi subnetApi = api.getSubnetApi(region);
-
-         Network network = networkApi.create(Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network);
-
-         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet);
-
-         Network network2 = networkApi.create(Network.createOptions("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network2);
-
-         Subnet subnet2 = subnetApi.create(Subnet.createOptions(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet2);
-
-         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test").build());
-         assertNotNull(router);
-
-         RouterInterface routerInterface = routerApi.addInterfaceForSubnet(router.getId(), subnet.getId());
-         assertNotNull(routerInterface);
-
-         RouterInterface routerInterface2 = routerApi.addInterfaceForSubnet(router.getId(), subnet2.getId());
-         assertNotNull(routerInterface2);
-
-         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet.getId()));
-         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet2.getId()));
-         assertTrue(routerApi.delete(router.getId()));
-         assertTrue(subnetApi.delete(subnet.getId()));
-         assertTrue(networkApi.delete(network.getId()));
-         assertTrue(subnetApi.delete(subnet2.getId()));
-         assertTrue(networkApi.delete(network2.getId()));
-      }
-   }
-
-   public void testCreateAndDeleteRouterInterfaceForPort() {
-      for (String region : api.getConfiguredRegions()) {
-         RouterApi routerApi = api.getRouterExtensionApi(region).get();
-         NetworkApi networkApi = api.getNetworkApi(region);
-         SubnetApi subnetApi = api.getSubnetApi(region);
-         PortApi portApi = api.getPortApi(region);
-
-         Network network = networkApi.create(Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network);
-
-         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet);
-
-         Network network2 = networkApi.create(Network.createOptions("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network2);
-
-         Subnet subnet2 = subnetApi.create(Subnet.createOptions(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet2);
-
-         Port port = portApi.create(Port.createOptions(network.getId()).build());
-         assertNotNull(port);
-
-         Port port2 = portApi.create(Port.createOptions(network2.getId()).build());
-         assertNotNull(port2);
-
-         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test").build());
-         assertNotNull(router);
-
-         RouterInterface routerInterface = routerApi.addInterfaceForPort(router.getId(), port.getId());
-         assertNotNull(routerInterface);
-
-         RouterInterface routerInterface2 = routerApi.addInterfaceForPort(router.getId(), port2.getId());
-         assertNotNull(routerInterface2);
-
-         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port.getId()));
-         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port2.getId()));
-         assertTrue(routerApi.delete(router.getId()));
-         assertTrue(subnetApi.delete(subnet.getId()));
-         assertTrue(networkApi.delete(network.getId()));
-         assertTrue(subnetApi.delete(subnet2.getId()));
-         assertTrue(networkApi.delete(network2.getId()));
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/92112318/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java
deleted file mode 100644
index 0b2424c..0000000
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java
+++ /dev/null
@@ -1,631 +0,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.
- */
-package org.jclouds.openstack.neutron.v2.features;
-
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-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.extensions.RouterApi;
-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 java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.List;
-
-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;
-
-/**
- * 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.getRouterExtensionApi("RegionOne").get();
-
-         Router.CreateOptions createRouter = Router.createOptions().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.getRouterExtensionApi("RegionOne").get();
-
-         Router.CreateOptions createRouter = Router.createOptions().name("another_router").adminStateUp(true)
-               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.create(createRouter);
-         fail("Should have failed with not found exception");
-
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testListSpecificPagePort() 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.getRouterExtensionApi("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 testListSpecificPagePortFail() 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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("RegionOne").get();
-
-         Router.UpdateOptions updateOptions = Router.updateOptions()
-               .externalGatewayInfo(
-                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.update("12345", updateOptions);
-
-         /*
-          * 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.getRouterExtensionApi("RegionOne").get();
-
-         Router.UpdateOptions updateOptions = Router.updateOptions()
-               .externalGatewayInfo(
-                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.update("12345", updateOptions);
-
-         /*
-          * 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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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.getRouterExtensionApi("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();
-      }
-   }
-}