You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2017/12/12 08:52:56 UTC

jclouds-labs-openstack git commit: [Openstack-Neutron] move SecurityGroupApi from extensions to features

Repository: jclouds-labs-openstack
Updated Branches:
  refs/heads/master 51873d8ed -> 660f10fb8


[Openstack-Neutron] move SecurityGroupApi from extensions to features


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/660f10fb
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/660f10fb
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/660f10fb

Branch: refs/heads/master
Commit: 660f10fb8b93e12454256ef6a26dcfddb982de80
Parents: 51873d8
Author: andreaturli <an...@gmail.com>
Authored: Tue Nov 21 12:34:12 2017 +0100
Committer: andreaturli <an...@gmail.com>
Committed: Tue Dec 12 09:47:11 2017 +0100

----------------------------------------------------------------------
 .../openstack/neutron/v2/NeutronApi.java        |  18 +-
 .../neutron/v2/extensions/SecurityGroupApi.java | 190 ---------
 .../neutron/v2/features/SecurityGroupApi.java   | 184 +++++++++
 .../v2/functions/RulesToPagedIterable.java      |   4 +-
 .../SecurityGroupsToPagedIterable.java          |   4 +-
 .../v2/extensions/SecurityGroupApiLiveTest.java | 103 -----
 .../v2/extensions/SecurityGroupApiMockTest.java | 413 -------------------
 .../v2/features/SecurityGroupApiLiveTest.java   | 103 +++++
 .../v2/features/SecurityGroupApiMockTest.java   | 394 ++++++++++++++++++
 ...CloudNetworksUSSecurityGroupApiLiveTest.java |   2 +-
 10 files changed, 693 insertions(+), 722 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/660f10fb/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 6eb3f53..97530f8 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
@@ -24,7 +24,7 @@ import javax.ws.rs.Path;
 import org.jclouds.location.Region;
 import org.jclouds.openstack.neutron.v2.extensions.FloatingIPApi;
 import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
-import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApi;
+import org.jclouds.openstack.neutron.v2.features.SecurityGroupApi;
 import org.jclouds.openstack.neutron.v2.extensions.lbaas.v1.LBaaSApi;
 import org.jclouds.openstack.neutron.v2.extensions.FWaaSApi;
 import org.jclouds.openstack.neutron.v2.features.NetworkApi;
@@ -83,34 +83,30 @@ public interface NeutronApi extends Closeable {
    PortApi getPortApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
 
    /**
-    * Provides access to Router features.
-    *
-    * <h3>NOTE</h3>
-    * This API is an extension that may or may not be present in your OpenStack cloud. Use the Optional return type
-    * to determine if it is present.
+    * Provides access to SecurityGroup features.
     */
    @Delegate
-   Optional<RouterApi> getRouterApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
+   SecurityGroupApi getSecurityGroupApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
 
    /**
-    * Provides access to Floating IP features.
+    * Provides access to Router features.
     *
     * <h3>NOTE</h3>
     * This API is an extension that may or may not be present in your OpenStack cloud. Use the Optional return type
     * to determine if it is present.
     */
    @Delegate
-   Optional<FloatingIPApi> getFloatingIPApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
+   Optional<RouterApi> getRouterApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
 
    /**
-    * Provides access to SecurityGroup features.
+    * Provides access to Floating IP features.
     *
     * <h3>NOTE</h3>
     * This API is an extension that may or may not be present in your OpenStack cloud. Use the Optional return type
     * to determine if it is present.
     */
    @Delegate
-   Optional<SecurityGroupApi> getSecurityGroupApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
+   Optional<FloatingIPApi> getFloatingIPApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
 
    /**
     * Provides access to LBaaS features.

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/660f10fb/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java
deleted file mode 100644
index 4986343..0000000
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java
+++ /dev/null
@@ -1,190 +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.extensions;
-
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import org.jclouds.Fallbacks;
-import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
-import org.jclouds.collect.PagedIterable;
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
-import org.jclouds.openstack.neutron.v2.domain.Rule;
-import org.jclouds.openstack.neutron.v2.domain.Rules;
-import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
-import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
-import org.jclouds.openstack.neutron.v2.fallbacks.EmptyRulesFallback;
-import org.jclouds.openstack.neutron.v2.fallbacks.EmptySecurityGroupsFallback;
-import org.jclouds.openstack.neutron.v2.functions.ParseRules;
-import org.jclouds.openstack.neutron.v2.functions.ParseSecurityGroups;
-import org.jclouds.openstack.neutron.v2.functions.RulesToPagedIterable;
-import org.jclouds.openstack.neutron.v2.functions.SecurityGroupsToPagedIterable;
-import org.jclouds.openstack.v2_0.ServiceType;
-import org.jclouds.openstack.v2_0.options.PaginationOptions;
-import org.jclouds.openstack.v2_0.services.Extension;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.ResponseParser;
-import org.jclouds.rest.annotations.SelectJson;
-import org.jclouds.rest.annotations.Transform;
-import org.jclouds.rest.annotations.WrapWith;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Provides access to Security Group extension operations for the OpenStack Networking (Neutron) v2 API.
- * <p/>
- * Security groups and security group rules allows administrators and tenants the ability to specify the type of
- * traffic and direction (ingress/egress) that is allowed to pass through a port. A security group is a container for
- * security group rules.
- */
-@Beta
-@RequestFilters(AuthenticateRequest.class)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Extension(of = ServiceType.NETWORK, namespace = ExtensionNamespaces.SECURITY_GROUPS, name = "security-group", alias = "security-group")
-public interface SecurityGroupApi {
-   /**
-    * Groups
-    */
-
-   /**
-    * @return all security groups currently defined in Neutron for the current tenant.
-    */
-   @Path("/security-groups")
-   @Named("security-group:list")
-   @GET
-   @ResponseParser(ParseSecurityGroups.class)
-   @Transform(SecurityGroupsToPagedIterable.class)
-   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
-   PagedIterable<SecurityGroup> listSecurityGroups();
-
-   /**
-    * @return all security groups currently defined in Neutron for the current tenant.
-    */
-   @Path("/security-groups")
-   @Named("security-group:list")
-   @GET
-   @ResponseParser(ParseSecurityGroups.class)
-   @Fallback(EmptySecurityGroupsFallback.class)
-   SecurityGroups listSecurityGroups(PaginationOptions options);
-
-   /**
-    * @param id the id of the security group to return
-    * @return SecurityGroup or null if not found.
-    */
-   @Path("/security-groups/{id}")
-   @Named("security-group:get")
-   @GET
-   @SelectJson("security_group")
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
-   @Nullable
-   SecurityGroup getSecurityGroup(@PathParam("id") String id);
-
-   /**
-    * Creates a new SecurityGroup.
-    *
-    * @param securityGroup Describes the security group to be created.
-    * @return a reference of the newly-created security group
-    */
-   @Path("/security-groups")
-   @Named("secuity-group:create")
-   @POST
-   @SelectJson("security_group")
-   SecurityGroup create(@WrapWith("security_group") SecurityGroup.CreateSecurityGroup securityGroup);
-
-   /**
-    * Deletes the specified Security Group.
-    *
-    * @param id the id of the security group to delete
-    * @return true if delete was successful, false if not
-    */
-   @Path("/security-groups/{id}")
-   @Named("security-group:delete")
-   @DELETE
-   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
-   boolean deleteSecurityGroup(@PathParam("id") String id);
-
-   /**
-    * Rules
-    */
-
-   /**
-    * @return all security groups rules currently defined in Neutron for the current tenant.
-    */
-   @Path("/security-group-rules")
-   @Named("security-group-rule:list")
-   @GET
-   @ResponseParser(ParseRules.class)
-   @Transform(RulesToPagedIterable.class)
-   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
-   PagedIterable<Rule> listRules();
-
-   /**
-    * @return all security groups rules currently defined in Neutron for the current tenant.
-    */
-   @Path("/security-group-rules")
-   @Named("security-group-rule:list")
-   @GET
-   @ResponseParser(ParseRules.class)
-   @Fallback(EmptyRulesFallback.class)
-   Rules listRules(PaginationOptions options);
-
-   /**
-    * @param id the id of the security group rule to return.
-    * @return SecurityGroupRule or null if not found.
-    */
-   @Path("/security-group-rules/{id}")
-   @Named("security-group-rule:get")
-   @GET
-   @SelectJson("security_group_rule")
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
-   @Nullable
-   Rule get(@PathParam("id") String id);
-
-   /**
-    * Creates a new Security Group Rule.
-    *
-    * @param securityGroupRule Describes the security group rule to be created.
-    * @return a reference of the newly-created security group rule.
-    */
-   @Path("/security-group-rules")
-   @Named("security-group-rule:create")
-   @POST
-   @SelectJson("security_group_rule")
-   Rule create(@WrapWith("security_group_rule") Rule.CreateRule securityGroupRule);
-
-   /**
-    * Deletes the specified Security Group Rule.
-    *
-    * @param id the id of the security group rule to delete.
-    * @return true if delete was successful, false if not.
-    */
-   @Path("/security-group-rules/{id}")
-   @Named("security-group-rule:delete")
-   @DELETE
-   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
-   boolean deleteRule(@PathParam("id") String id);
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/660f10fb/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SecurityGroupApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SecurityGroupApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SecurityGroupApi.java
new file mode 100644
index 0000000..4b9803c
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SecurityGroupApi.java
@@ -0,0 +1,184 @@
+/*
+ * 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 javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.domain.Rules;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
+import org.jclouds.openstack.neutron.v2.fallbacks.EmptyRulesFallback;
+import org.jclouds.openstack.neutron.v2.fallbacks.EmptySecurityGroupsFallback;
+import org.jclouds.openstack.neutron.v2.functions.ParseRules;
+import org.jclouds.openstack.neutron.v2.functions.ParseSecurityGroups;
+import org.jclouds.openstack.neutron.v2.functions.RulesToPagedIterable;
+import org.jclouds.openstack.neutron.v2.functions.SecurityGroupsToPagedIterable;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.annotations.Transform;
+import org.jclouds.rest.annotations.WrapWith;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Provides access to Security Group extension operations for the OpenStack Networking (Neutron) v2 API.
+ * <p/>
+ * Security groups and security group rules allows administrators and tenants the ability to specify the type of
+ * traffic and direction (ingress/egress) that is allowed to pass through a port. A security group is a container for
+ * security group rules.
+ */
+@Beta
+@RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public interface SecurityGroupApi {
+
+   /**
+    * @return all security groups currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-groups")
+   @Named("security-group:list")
+   @GET
+   @ResponseParser(ParseSecurityGroups.class)
+   @Transform(SecurityGroupsToPagedIterable.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   PagedIterable<SecurityGroup> listSecurityGroups();
+
+   /**
+    * @return all security groups currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-groups")
+   @Named("security-group:list")
+   @GET
+   @ResponseParser(ParseSecurityGroups.class)
+   @Fallback(EmptySecurityGroupsFallback.class)
+   SecurityGroups listSecurityGroups(PaginationOptions options);
+
+   /**
+    * @param id the id of the security group to return
+    * @return SecurityGroup or null if not found.
+    */
+   @Path("/security-groups/{id}")
+   @Named("security-group:get")
+   @GET
+   @SelectJson("security_group")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Nullable
+   SecurityGroup getSecurityGroup(@PathParam("id") String id);
+
+   /**
+    * Creates a new SecurityGroup.
+    *
+    * @param securityGroup Describes the security group to be created.
+    * @return a reference of the newly-created security group
+    */
+   @Path("/security-groups")
+   @Named("secuity-group:create")
+   @POST
+   @SelectJson("security_group")
+   SecurityGroup create(@WrapWith("security_group") SecurityGroup.CreateSecurityGroup securityGroup);
+
+   /**
+    * Deletes the specified Security Group.
+    *
+    * @param id the id of the security group to delete
+    * @return true if delete was successful, false if not
+    */
+   @Path("/security-groups/{id}")
+   @Named("security-group:delete")
+   @DELETE
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteSecurityGroup(@PathParam("id") String id);
+
+   /**
+    * Rules
+    */
+
+   /**
+    * @return all security groups rules currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-group-rules")
+   @Named("security-group-rule:list")
+   @GET
+   @ResponseParser(ParseRules.class)
+   @Transform(RulesToPagedIterable.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   PagedIterable<Rule> listRules();
+
+   /**
+    * @return all security groups rules currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-group-rules")
+   @Named("security-group-rule:list")
+   @GET
+   @ResponseParser(ParseRules.class)
+   @Fallback(EmptyRulesFallback.class)
+   Rules listRules(PaginationOptions options);
+
+   /**
+    * @param id the id of the security group rule to return.
+    * @return SecurityGroupRule or null if not found.
+    */
+   @Path("/security-group-rules/{id}")
+   @Named("security-group-rule:get")
+   @GET
+   @SelectJson("security_group_rule")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Nullable
+   Rule get(@PathParam("id") String id);
+
+   /**
+    * Creates a new Security Group Rule.
+    *
+    * @param securityGroupRule Describes the security group rule to be created.
+    * @return a reference of the newly-created security group rule.
+    */
+   @Path("/security-group-rules")
+   @Named("security-group-rule:create")
+   @POST
+   @SelectJson("security_group_rule")
+   Rule create(@WrapWith("security_group_rule") Rule.CreateRule securityGroupRule);
+
+   /**
+    * Deletes the specified Security Group Rule.
+    *
+    * @param id the id of the security group rule to delete.
+    * @return true if delete was successful, false if not.
+    */
+   @Path("/security-group-rules/{id}")
+   @Named("security-group-rule:delete")
+   @DELETE
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteRule(@PathParam("id") String id);
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/660f10fb/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
index d664cd6..e4283c2 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
@@ -24,7 +24,7 @@ import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.openstack.neutron.v2.NeutronApi;
 import org.jclouds.openstack.neutron.v2.domain.Rule;
-import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApi;
+import org.jclouds.openstack.neutron.v2.features.SecurityGroupApi;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
 import com.google.common.base.Function;
@@ -46,7 +46,7 @@ public class RulesToPagedIterable extends
    @Override
    protected Function<Object, IterableWithMarker<Rule>> markerToNextForArg0(Optional<Object> arg0) {
       String region = arg0.isPresent() ? arg0.get().toString() : null;
-      final SecurityGroupApi securityGroupApi = api.getSecurityGroupApi(region).get();
+      final SecurityGroupApi securityGroupApi = api.getSecurityGroupApi(region);
       return new Function<Object, IterableWithMarker<Rule>>() {
 
          @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/660f10fb/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
index 15c7c14..ddb4240 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
@@ -24,7 +24,7 @@ import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.openstack.neutron.v2.NeutronApi;
 import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
-import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApi;
+import org.jclouds.openstack.neutron.v2.features.SecurityGroupApi;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
 import com.google.common.base.Function;
@@ -46,7 +46,7 @@ public class SecurityGroupsToPagedIterable extends
    @Override
    protected Function<Object, IterableWithMarker<SecurityGroup>> markerToNextForArg0(Optional<Object> arg0) {
       String region = arg0.isPresent() ? arg0.get().toString() : null;
-      final SecurityGroupApi securityGroupApi = api.getSecurityGroupApi(region).get();
+      final SecurityGroupApi securityGroupApi = api.getSecurityGroupApi(region);
       return new Function<Object, IterableWithMarker<SecurityGroup>>() {
 
          @SuppressWarnings("unchecked")

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

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

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

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

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/660f10fb/rackspace-cloudnetworks-us/src/test/java/org/jclouds/rackspace/cloudnetworks/us/CloudNetworksUSSecurityGroupApiLiveTest.java
----------------------------------------------------------------------
diff --git a/rackspace-cloudnetworks-us/src/test/java/org/jclouds/rackspace/cloudnetworks/us/CloudNetworksUSSecurityGroupApiLiveTest.java b/rackspace-cloudnetworks-us/src/test/java/org/jclouds/rackspace/cloudnetworks/us/CloudNetworksUSSecurityGroupApiLiveTest.java
index b53de9c..dee11f3 100644
--- a/rackspace-cloudnetworks-us/src/test/java/org/jclouds/rackspace/cloudnetworks/us/CloudNetworksUSSecurityGroupApiLiveTest.java
+++ b/rackspace-cloudnetworks-us/src/test/java/org/jclouds/rackspace/cloudnetworks/us/CloudNetworksUSSecurityGroupApiLiveTest.java
@@ -16,7 +16,7 @@
  */
 package org.jclouds.rackspace.cloudnetworks.us;
 
-import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApiLiveTest;
+import org.jclouds.openstack.neutron.v2.features.SecurityGroupApiLiveTest;
 import org.testng.annotations.Test;
 
 @Test(groups = "live", testName = "CloudNetworksUSSecurityGroupApiLiveTest", singleThreaded = true)