You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2018/01/17 08:08:02 UTC

[35/50] [abbrv] jclouds git commit: add FWaaS extension to openstack-neutron

add FWaaS extension to openstack-neutron


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

Branch: refs/heads/master
Commit: 289cce042a81782f3ef5f4128ba3482f59d72007
Parents: 83b104d
Author: Andrea Turli <an...@gmail.com>
Authored: Tue Jun 9 17:25:25 2015 +0200
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Thu Jul 2 15:00:36 2015 -0500

----------------------------------------------------------------------
 apis/openstack-neutron/pom.xml                  |   5 +
 .../openstack/neutron/v2/NeutronApi.java        |  11 +
 .../neutron/v2/domain/CreateFirewall.java       | 120 +++
 .../neutron/v2/domain/CreateFirewallPolicy.java | 142 +++
 .../neutron/v2/domain/CreateFirewallRule.java   | 231 +++++
 .../openstack/neutron/v2/domain/Firewall.java   |  47 +
 .../neutron/v2/domain/FirewallPolicies.java     |  36 +
 .../neutron/v2/domain/FirewallPolicy.java       |  48 +
 .../neutron/v2/domain/FirewallRule.java         |  52 +
 .../neutron/v2/domain/FirewallRules.java        |  36 +
 .../openstack/neutron/v2/domain/Firewalls.java  |  36 +
 .../openstack/neutron/v2/domain/IpVersion.java  |  50 +
 .../neutron/v2/domain/UpdateFirewall.java       |  68 ++
 .../neutron/v2/domain/UpdateFirewallPolicy.java |  80 ++
 .../neutron/v2/domain/UpdateFirewallRule.java   | 100 ++
 .../v2/extensions/ExtensionNamespaces.java      |   4 +
 .../neutron/v2/extensions/FWaaSApi.java         | 253 +++++
 .../FirewallPolicyToPagedIterable.java          |  63 ++
 .../functions/FirewallRuleToPagedIterable.java  |  63 ++
 .../v2/functions/FirewallToPagedIterable.java   |  63 ++
 .../v2/functions/ParseFirewallPolicies.java     |  38 +
 .../v2/functions/ParseFirewallRules.java        |  38 +
 .../neutron/v2/functions/ParseFirewalls.java    |  38 +
 .../neutron/v2/extensions/FWaaSApiLiveTest.java | 199 ++++
 .../neutron/v2/extensions/FWaaSApiMockTest.java | 984 +++++++++++++++++++
 .../v2/features/ExtensionApiMockTest.java       |   2 +-
 .../src/test/resources/extension_list.json      | 262 +++--
 .../test/resources/firewall_create_request.json |   6 +
 .../resources/firewall_create_response.json     |  11 +
 .../test/resources/firewall_get_response.json   |  11 +
 .../test/resources/firewall_list_response.json  |  13 +
 .../firewall_policy_create_request.json         |   8 +
 .../firewall_policy_create_response.json        |  11 +
 .../resources/firewall_policy_get_response.json |  14 +
 .../firewall_policy_insert_rule_request.json    |   1 +
 .../firewall_policy_insert_rule_response.json   |  10 +
 .../firewall_policy_list_response.json          | 255 +++++
 .../resources/firewall_rule_create_request.json |  12 +
 .../firewall_rule_create_response.json          |  19 +
 .../resources/firewall_rule_get_response.json   |  19 +
 .../resources/firewall_rule_update_request.json |   6 +
 .../firewall_rule_update_response.json          |  19 +
 .../test/resources/firewall_update_request.json |   5 +
 .../resources/firewall_update_response.json     |  11 +
 .../src/test/resources/logback.xml              |  43 +-
 45 files changed, 3371 insertions(+), 172 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/pom.xml
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/pom.xml b/apis/openstack-neutron/pom.xml
index 15e0225..42da458 100644
--- a/apis/openstack-neutron/pom.xml
+++ b/apis/openstack-neutron/pom.xml
@@ -111,6 +111,11 @@
       <artifactId>auto-service</artifactId>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>com.google.auto.value</groupId>
+      <artifactId>auto-value</artifactId>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>
 
   <profiles>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
index 4dca71b..6eb3f53 100644
--- a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
@@ -26,6 +26,7 @@ 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.extensions.lbaas.v1.LBaaSApi;
+import org.jclouds.openstack.neutron.v2.extensions.FWaaSApi;
 import org.jclouds.openstack.neutron.v2.features.NetworkApi;
 import org.jclouds.openstack.neutron.v2.features.PortApi;
 import org.jclouds.openstack.neutron.v2.features.SubnetApi;
@@ -120,4 +121,14 @@ public interface NeutronApi extends Closeable {
     */
    @Delegate
    Optional<LBaaSApi> getLBaaSApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to FWaaS 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<FWaaSApi> getFWaaSApi(@EndpointParam(parser = VersionAwareRegionToEndpoint.class) String region);
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewall.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewall.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewall.java
new file mode 100644
index 0000000..9c65419
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewall.java
@@ -0,0 +1,120 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * Representation of creation options for an OpenStack Neutron Firewall.
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ *      doc</a>
+ */
+@AutoValue
+public abstract class CreateFirewall {
+
+   /**
+    * @see Builder#tenantId(String)
+    */
+   @Nullable public abstract String getTenantId();
+
+   /**
+    * @see Builder#name(String)
+    */
+   @Nullable public abstract String getName();
+
+   /**
+    * @see Builder#description(String)
+    */
+   @Nullable public abstract String getDescription();
+
+   /**
+    * @see Builder#adminStateUp(Boolean)
+    */
+   @Nullable public abstract Boolean getAdminStateUp();
+
+   /**
+    * @see Builder#firewallPolicyId(String)
+    */
+   @Nullable public abstract String getFirewallPolicyId();
+
+   @SerializedNames({ "tenant_id", "name", "description", "admin_state_up", "firewall_policy_id"})
+   public static CreateFirewall create(String tenantId, String name, String description, Boolean adminStateUp, String firewallPolicyId) {
+      return builder().tenantId(tenantId).name(name).description(description).adminStateUp(adminStateUp)
+              .firewallPolicyId(firewallPolicyId).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_CreateFirewall.Builder();
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      /**
+       *
+       * @param tenantId Owner of the firewall. Only admin users can specify a tenant_id other than its own.
+       * @return The CreateFirewall builder.
+       */
+      public abstract Builder tenantId(String tenantId);
+
+      /**
+       *
+       * @param name Human readable name for the firewall (255 characters limit).
+       * @return The CreateFirewall builder.
+       */
+      public abstract Builder name(String name);
+
+      /**
+       *
+       * @param description Human readable description for the firewall (1024 characters limit).
+       * @return The CreateFirewall builder.
+       */
+      public abstract Builder description(String description);
+
+      /**
+       *
+       * @param adminStateUp The administrative state of the firewall. If False (down), the firewall does not forward any packets.
+       * @return The CreateFirewall builder.
+       */
+      public abstract Builder adminStateUp(Boolean adminStateUp);
+
+      /**
+       *
+       * @param firewallPolicyId The firewall policy uuid that this firewall is associated with. This firewall implements the rules contained in the
+       *                         firewall policy represented by this uuid.
+       *
+       * @return The CreateFirewall builder.
+       */
+      public abstract Builder firewallPolicyId(String firewallPolicyId);
+
+      @Nullable public abstract String getTenantId();
+      @Nullable public abstract String getName();
+      @Nullable public abstract String getDescription();
+      @Nullable public abstract Boolean getAdminStateUp();
+      @Nullable public abstract String getFirewallPolicyId();
+
+      public abstract CreateFirewall build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallPolicy.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallPolicy.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallPolicy.java
new file mode 100644
index 0000000..6418c0d
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallPolicy.java
@@ -0,0 +1,142 @@
+/*
+ * 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.domain;
+
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Representation of creation options for an OpenStack Neutron Firewall Policy.
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ *      doc</a>
+ */
+@AutoValue
+public abstract class CreateFirewallPolicy {
+
+   /**
+    * @see Builder#tenantId(String)
+    */
+   @Nullable public abstract String getTenantId();
+
+   /**
+    * @see Builder#name(String)
+    */
+   @Nullable public abstract String getName();
+
+   /**
+    * @see Builder#description(String)
+    */
+   @Nullable public abstract String getDescription();
+
+   /**
+    * @see Builder#shared(Boolean)
+    */
+   @Nullable public abstract Boolean getShared();
+
+   /**
+    * @see Builder#firewallRules(java.util.List)
+    */
+   @Nullable public abstract List<String> getFirewallRules();
+
+   /**
+    * @see Builder#audited(Boolean)
+    */
+   @Nullable public abstract Boolean getAudited();
+
+   @SerializedNames({"tenant_id", "name", "description", "shared", "firewall_rules", "audited"})
+   private static CreateFirewallPolicy create(String tenantId, String name, String description, Boolean shared, List<String> firewallRules, Boolean audited) {
+      return builder().tenantId(tenantId).name(name).description(description).shared(shared).firewallRules(firewallRules).audited(audited).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_CreateFirewallPolicy.Builder().shared(false).audited(false);
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      /**
+       *
+       * @param tenantId Owner of the firewall. Only admin users can specify a tenant_id other than its own.
+       * @return The CreateFirewallPolicy builder.
+       */
+      public abstract Builder tenantId(String tenantId);
+
+      /**
+       *
+       * @param name Human readable name for the firewall (255 characters limit).
+       * @return The CreateFirewallPolicy builder.
+       */
+      public abstract Builder name(String name);
+
+      /**
+       *
+       * @param description Human readable description for the firewall (1024 characters limit).
+       * @return The CreateFirewallPolicy builder.
+       */
+      public abstract Builder description(String description);
+
+      /**
+       *
+       * @param shared When set to True makes this firewall policy visible to tenants other than its owner and
+       *               can be used to associate with firewalls not owned by its tenant.
+       * @return The CreateFirewallPolicy builder.
+       */
+      public abstract Builder shared(Boolean shared);
+
+      /**
+       *
+       * @param firewallRules This is an ordered list of firewall rule uuids.
+       *                      The firewall applies the rules in the order in which they appear in this list.
+       * @return The CreateFirewallPolicy builder.
+       */
+      public abstract Builder firewallRules(List<String> firewallRules);
+
+      /**
+       *
+       * @param audited When set to True by the policy owner indicates that the firewall policy has been audited. This attribute is meant to aid in the
+       *                firewall policy audit work flows. Each time the firewall policy or the associated firewall rules are changed, this attribute is set
+       *                to False and must be explicitly set to True through an update operation.
+       * @return The CreateFirewallPolicy builder.
+       */
+      public abstract Builder audited(Boolean audited);
+
+      @Nullable public abstract String getTenantId();
+      @Nullable public abstract String getName();
+      @Nullable public abstract String getDescription();
+      @Nullable public abstract Boolean getShared();
+      @Nullable public abstract List<String> getFirewallRules();
+      @Nullable public abstract Boolean getAudited();
+
+      abstract CreateFirewallPolicy autoBuild();
+
+      public CreateFirewallPolicy build() {
+         firewallRules(getFirewallRules() != null ? ImmutableList.copyOf(getFirewallRules()) : ImmutableList.<String>of());
+         return autoBuild();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallRule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallRule.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallRule.java
new file mode 100644
index 0000000..0e7bdbe
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/CreateFirewallRule.java
@@ -0,0 +1,231 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * Representation of creation options for an OpenStack Neutron Firewall Rule.
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ *      doc</a>
+ */
+@AutoValue
+public abstract class CreateFirewallRule {
+
+   /**
+    * @see Builder#tenantId(String)
+    */
+   @Nullable public abstract String getTenantId();
+   /**
+    * @see Builder#name(String)
+    */
+   @Nullable public abstract String getName();
+   /**
+    * @see Builder#description(String)
+    */
+   @Nullable public abstract String getDescription();
+   /**
+    * @see Builder#firewallPolicyId(String)
+    */
+   @Nullable public abstract String getFirewallPolicyId();
+   /**
+    * @see Builder#shared(Boolean)
+    */
+   @Nullable public abstract Boolean getShared();
+   /**
+    * @see Builder#protocol(String)
+    */
+   @Nullable public abstract String getProtocol();
+   /**
+    * @see Builder#ipVersion(IpVersion)
+    */
+   @Nullable public abstract IpVersion getIpVersion();
+   /**
+    * @see Builder#sourceIpAddress(String)
+    */
+   @Nullable public abstract String getSourceIpAddress();
+   /**
+    * @see Builder#destinationIpAddress(String)
+    */
+   @Nullable public abstract String getDestinationIpAddress();
+   /**
+    * @see Builder#sourcePort(String)
+    */
+   @Nullable public abstract String getSourcePort();
+   /**
+    * @see Builder#destinationPort(String)
+    */
+   @Nullable public abstract String getDestinationPort();
+   /**
+    * see Builder#position(Integer)
+    */
+   @Nullable public abstract Integer getPosition();
+   /**
+    * @see Builder#action(String)
+    */
+   @Nullable public abstract String getAction();
+   /**
+    * @see Builder#enabled(Boolean)
+    */
+   @Nullable public abstract Boolean getEnabled();
+
+   @SerializedNames({ "tenant_id", "name", "description", "firewall_policy_id", "shared", "protocol", "ip_version", "source_ip_address",
+           "destination_ip_address", "source_port", "destination_port", "position", "action", "enabled"})
+   public static CreateFirewallRule create(String tenantId, String name, String description, String firewallPolicyId, Boolean shared, String protocol,
+                                     IpVersion ipVersion, String sourceIpAddress, String destinationIpAddress, String sourcePort, String destinationPort, int position,
+                                     String action, Boolean enabled) {
+      return builder().tenantId(tenantId).name(name).description(description).firewallPolicyId(firewallPolicyId).shared(shared)
+              .protocol(protocol).ipVersion(ipVersion).sourceIpAddress(sourceIpAddress).destinationIpAddress(destinationIpAddress).sourcePort(sourcePort)
+              .destinationPort(destinationPort).position(position).action(action).enabled(enabled).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_CreateFirewallRule.Builder();
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+
+      /**
+       *
+       * @param tenantId Owner of the firewall. Only admin users can specify a tenant_id other than its own.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder tenantId(String tenantId);
+
+      /**
+       *
+       * @param name Human readable name for the firewall (255 characters limit).
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder name(String name);
+
+      /**
+       *
+       * @param description Human readable description for the firewall (1024 characters limit).
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder description(String description);
+
+      /**
+       *
+       * @param shared When set to True makes this firewall policy visible to tenants other than its owner and
+       *               can be used to associate with firewalls not owned by its tenant.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder shared(Boolean shared);
+
+      /**
+       *
+       * @param firewallPolicyId This is a read-only attribute that gets populated with the uuid of the firewall policy when this firewall rule is associated
+       *                         with a firewall policy. A firewall rule can be associated with only one firewall policy at a time. However, the association
+       *                         can be changed to a different firewall policy.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder firewallPolicyId(String firewallPolicyId);
+
+      /**
+       *
+       * @param protocol IP protocol (icmp, tcp, udp, None).
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder protocol(String protocol);
+
+      /**
+       *
+       * @param ipVersion IP version (4, 6).
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder ipVersion(IpVersion ipVersion);
+
+      /**
+       *
+       * @param sourceIpAddress Source IP address or CIDR.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder sourceIpAddress(String sourceIpAddress);
+
+      /**
+       *
+       * @param destinationIpAddress Destination IP address or CIDR.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder destinationIpAddress(String destinationIpAddress);
+
+      /**
+       *
+       * @param sourcePort Source port number or a range.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder sourcePort(String sourcePort);
+
+      /**
+       *
+       * @param destinationPort Destination port number or a range.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder destinationPort(String destinationPort);
+
+      /**
+       *
+       * @param position This is a read-only attribute that gets assigned to this rule when the rule is associated with a firewall policy. It indicates the
+       *                 position of this rule in that firewall policy.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder position(Integer position);
+
+      /**
+       *
+       * @param action Action to be performed on the traffic matching the rule (allow, deny).
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder action(String action);
+
+      /**
+       *
+       * @param enabled When set to False, disables this rule in the firewall policy. Facilitates selectively turning off rules without having to
+       *                disassociate the rule from the firewall policy.
+       * @return The CreateFirewallRule builder.
+       */
+      public abstract Builder enabled(Boolean enabled);
+
+      @Nullable public abstract String getTenantId();
+      @Nullable public abstract String getName();
+      @Nullable public abstract String getDescription();
+      @Nullable public abstract Boolean getShared();
+      @Nullable public abstract String getFirewallPolicyId();
+      @Nullable public abstract String getProtocol();
+      @Nullable public abstract IpVersion getIpVersion();
+      @Nullable public abstract String getSourceIpAddress();
+      @Nullable public abstract String getDestinationIpAddress();
+      @Nullable public abstract String getSourcePort();
+      @Nullable public abstract String getDestinationPort();
+      @Nullable public abstract Integer getPosition();
+      @Nullable public abstract String getAction();
+      @Nullable public abstract Boolean getEnabled();
+
+      public abstract CreateFirewallRule build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewall.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewall.java
new file mode 100644
index 0000000..e9e8e6e
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewall.java
@@ -0,0 +1,47 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * A Firewall
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ *      doc</a>
+ */
+@AutoValue
+public abstract class Firewall {
+
+   public abstract String getId();
+   public abstract String getTenantId();
+   @Nullable public abstract String getName();
+   @Nullable public abstract String getDescription();
+   @Nullable public abstract Boolean isAdminStateUp();
+   public abstract String getStatus();
+   @Nullable public abstract String getFirewallPolicyId();
+
+   @SerializedNames({"id", "tenant_id", "name", "description", "admin_state_up", "status", "firewall_policy_id"})
+   public static Firewall create(String id, String tenantId, String name, String description, Boolean adminStateUp, String status, String firewallPolicyId) {
+      return new AutoValue_Firewall(id, tenantId, name, description, adminStateUp, status, firewallPolicyId);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicies.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicies.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicies.java
new file mode 100644
index 0000000..1dbf429
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicies.java
@@ -0,0 +1,36 @@
+/*
+ * 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.domain;
+
+import java.beans.ConstructorProperties;
+
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A collection of FirewallPolicies
+ */
+public class FirewallPolicies extends PaginatedCollection<FirewallPolicy> {
+   public static final FirewallPolicies EMPTY = new FirewallPolicies(ImmutableSet.<FirewallPolicy> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({"firewall_policies", "firewall_policies_links"})
+   protected FirewallPolicies(Iterable<FirewallPolicy> firewallPolicies, Iterable<Link> firewallPoliciesLinks) {
+      super(firewallPolicies, firewallPoliciesLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicy.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicy.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicy.java
new file mode 100644
index 0000000..d0f2fec
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallPolicy.java
@@ -0,0 +1,48 @@
+/*
+ * 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.domain;
+
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * A firewall policy
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api doc</a>
+ */
+@AutoValue
+public abstract class FirewallPolicy {
+
+   public abstract String getId();
+   public abstract String getTenantId();
+   public abstract String getName();
+   @Nullable public abstract String getDescription();
+   public abstract boolean isShared();
+   @Nullable public abstract List<String> getFirewallRules();
+   public abstract boolean isAudited();
+
+   @SerializedNames({"id", "tenant_id", "name", "description", "shared", "firewall_rules", "audited"})
+   private static FirewallPolicy create(String id, String tenantId, String name, String description, boolean shared, List<String> firewallRules, boolean audited) {
+      return new AutoValue_FirewallPolicy(id, tenantId, name, description, shared, firewallRules, audited);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRule.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRule.java
new file mode 100644
index 0000000..0bc23de
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRule.java
@@ -0,0 +1,52 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class FirewallRule {
+
+   public abstract String getId();
+   public abstract String getTenantId();
+   public abstract String getName();
+   @Nullable public abstract String getDescription();
+   @Nullable public abstract String getFirewallPolicyId();
+   public abstract boolean isShared();
+   @Nullable public abstract String getProtocol();
+   @Nullable public abstract IpVersion getIpVersion();
+   @Nullable public abstract String getSourceIpAddress();
+   @Nullable public abstract String getDestinationIpAddress();
+   @Nullable public abstract String getSourcePort();
+   @Nullable public abstract String getDestinationPort();
+   @Nullable public abstract Integer getPosition(); // for AutoValue.builder
+   @Nullable public abstract String getAction();
+   public abstract boolean isEnabled();
+
+   @SerializedNames({"id", "tenant_id", "name", "description", "firewall_policy_id", "shared", "protocol", "ip_version", "source_ip_address",
+           "destination_ip_address", "source_port", "destination_port", "position", "action", "enabled"})
+   public static FirewallRule create(String id, String tenantId, String name, String description, String firewallPolicyId, boolean shared, String protocol,
+                          IpVersion ipVersion, String sourceIpAddress, String destinationIpAddress, String sourcePort, String destinationPort, int position,
+                          String action, boolean enabled) {
+      return new AutoValue_FirewallRule(id, tenantId, name, description, firewallPolicyId, shared, protocol, ipVersion, sourceIpAddress,
+              destinationIpAddress, sourcePort, destinationPort, position, action, enabled);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRules.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRules.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRules.java
new file mode 100644
index 0000000..79281b8
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FirewallRules.java
@@ -0,0 +1,36 @@
+/*
+ * 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.domain;
+
+import java.beans.ConstructorProperties;
+
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A collection of FirewallRules
+ */
+public class FirewallRules extends PaginatedCollection<FirewallRule> {
+   public static final FirewallRules EMPTY = new FirewallRules(ImmutableSet.<FirewallRule> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({"firewall_rules", "firewall_rules_links"})
+   protected FirewallRules(Iterable<FirewallRule> firewallRules, Iterable<Link> firewallRulesLinks) {
+      super(firewallRules, firewallRulesLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewalls.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewalls.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewalls.java
new file mode 100644
index 0000000..739e0e2
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Firewalls.java
@@ -0,0 +1,36 @@
+/*
+ * 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.domain;
+
+import java.beans.ConstructorProperties;
+
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A collection of Firewalls
+ */
+public class Firewalls extends PaginatedCollection<Firewall> {
+   public static final Firewalls EMPTY = new Firewalls(ImmutableSet.<Firewall> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({"firewalls", "firewalls_links"})
+   protected Firewalls(Iterable<Firewall> firewalls, Iterable<Link> firewallsLinks) {
+      super(firewalls, firewallsLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IpVersion.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IpVersion.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IpVersion.java
new file mode 100644
index 0000000..c1be347
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IpVersion.java
@@ -0,0 +1,50 @@
+/*
+ * 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.domain;
+
+public enum IpVersion {
+
+   IPV4(4),
+   IPV6(6),
+   UNRECOGNIZED(Integer.MAX_VALUE);;
+
+   private final int version;
+
+   IpVersion(int version) {
+      this.version = version;
+   }
+
+   public int version() {
+      return this.version;
+   }
+
+   public static IpVersion fromValue(String value) {
+      try {
+         int statusCode = Integer.parseInt(value);
+         switch (statusCode) {
+            case 4:
+               return IpVersion.IPV4;
+            case 6:
+               return IpVersion.IPV6;
+            default:
+               return IpVersion.IPV4;
+         }
+      } catch (NumberFormatException e) {
+         return IpVersion.UNRECOGNIZED;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewall.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewall.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewall.java
new file mode 100644
index 0000000..10f5cab
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewall.java
@@ -0,0 +1,68 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+
+/**
+ * Representation of update options for an OpenStack Neutron Firewall.
+ *
+ * @see <a
+ * href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ * doc</a>
+ */
+@AutoValue
+public abstract class UpdateFirewall {
+
+   @Nullable public abstract String getTenantId();
+   @Nullable public abstract String getName();
+   @Nullable public abstract String getDescription();
+   @Nullable public abstract Boolean getAdminStateUp();
+   @Nullable public abstract String getFirewallPolicyId();
+
+   @SerializedNames({"tenant_id", "name", "description", "admin_state_up", "firewall_policy_id"})
+   public static UpdateFirewall create(String tenantId, String name, String description, Boolean adminStateUp, String firewallPolicyId) {
+      return builder().tenantId(tenantId).name(name).description(description).adminStateUp(adminStateUp).firewallPolicyId(firewallPolicyId).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_UpdateFirewall.Builder();
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder tenantId(String tenantId);
+      public abstract Builder name(String name);
+      public abstract Builder description(String description);
+      public abstract Builder adminStateUp(Boolean adminStateUp);
+      public abstract Builder firewallPolicyId(String firewallPolicyId);
+
+      @Nullable public abstract String getTenantId();
+      @Nullable public abstract String getName();
+      @Nullable public abstract String getDescription();
+      @Nullable public abstract Boolean getAdminStateUp();
+      @Nullable public abstract String getFirewallPolicyId();
+
+      public abstract UpdateFirewall build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallPolicy.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallPolicy.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallPolicy.java
new file mode 100644
index 0000000..3791b34
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallPolicy.java
@@ -0,0 +1,80 @@
+/*
+ * 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.domain;
+
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Representation of update options for an OpenStack Neutron Firewall Policy.
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ *      doc</a>
+ */
+@AutoValue
+public abstract class UpdateFirewallPolicy {
+
+   @Nullable public abstract String getTenantId();
+   @Nullable public abstract String getName();
+   @Nullable public abstract String getDescription();
+   @Nullable public abstract Boolean getShared();
+   @Nullable public abstract List<String> getFirewallRules();
+   @Nullable public abstract Boolean getAudited();
+
+   @SerializedNames({"tenant_id", "name", "description", "shared", "firewall_rules", "audited"})
+   private static UpdateFirewallPolicy create(String tenantId, String name, String description, Boolean shared, List<String> firewallRules, Boolean audited) {
+      return builder().tenantId(tenantId).name(name).description(description).shared(shared).firewallRules(firewallRules).audited(audited).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_UpdateFirewallPolicy.Builder().shared(false).audited(false);
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder tenantId(String tenantId);
+      public abstract Builder name(String name);
+      public abstract Builder description(String description);
+      public abstract Builder shared(Boolean shared);
+      public abstract Builder firewallRules(List<String> firewallRules);
+      public abstract Builder audited(Boolean audited);
+
+      abstract UpdateFirewallPolicy autoBuild();
+
+      @Nullable public abstract String getTenantId();
+      @Nullable public abstract String getName();
+      @Nullable public abstract String getDescription();
+      @Nullable public abstract Boolean getShared();
+      @Nullable public abstract List<String> getFirewallRules();
+      @Nullable public abstract Boolean getAudited();
+
+      public UpdateFirewallPolicy build() {
+         firewallRules(getFirewallRules() != null ? ImmutableList.copyOf(getFirewallRules()) : ImmutableList.<String>of());
+         return autoBuild();
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallRule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallRule.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallRule.java
new file mode 100644
index 0000000..b66e902
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/UpdateFirewallRule.java
@@ -0,0 +1,100 @@
+/*
+ * 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.domain;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+/**
+ * Representation of update options for an OpenStack Neutron Firewall Rule.
+ *
+ * @see <a
+ *      href="http://docs.openstack.org/admin-guide-cloud/content/fwaas_api_abstractions.html">api
+ *      doc</a>
+ */
+@AutoValue
+public abstract class UpdateFirewallRule {
+
+   @Nullable public abstract String getTenantId();
+   @Nullable public abstract String getName();
+   @Nullable public abstract String getDescription();
+   @Nullable public abstract String getFirewallPolicyId();
+   @Nullable public abstract Boolean getShared();
+   @Nullable public abstract String getProtocol();
+   @Nullable public abstract IpVersion getIpVersion();
+   @Nullable public abstract String getSourceIpAddress();
+   @Nullable public abstract String getDestinationIpAddress();
+   @Nullable public abstract String getSourcePort();
+   @Nullable public abstract String getDestinationPort();
+   @Nullable public abstract Integer getPosition();
+   @Nullable public abstract String getAction();
+   @Nullable public abstract Boolean getEnabled();
+
+   @SerializedNames({ "tenant_id", "name", "description", "firewall_policy_id", "shared", "protocol", "ip_version", "source_ip_address",
+           "destination_ip_address", "source_port", "destination_port", "position", "action", "enabled"})
+   public static UpdateFirewallRule create(String tenantId, String name, String description, String firewallPolicyId, Boolean shared, String protocol,
+                                           IpVersion ipVersion, String sourceIpAddress, String destinationIpAddress, String sourcePort, String destinationPort, int position,
+                                           String action, Boolean enabled) {
+      return builder().tenantId(tenantId).name(name).description(description).firewallPolicyId(firewallPolicyId).shared(shared)
+              .protocol(protocol).ipVersion(ipVersion).sourceIpAddress(sourceIpAddress).destinationIpAddress(destinationIpAddress).sourcePort(sourcePort)
+              .destinationPort(destinationPort).position(position).action(action).enabled(enabled).build();
+   }
+
+   public static Builder builder() {
+      return new AutoValue_UpdateFirewallRule.Builder().shared(false).enabled(false).position(null);
+   }
+
+   public abstract Builder toBuilder();
+
+   @AutoValue.Builder
+   public abstract static class Builder {
+      public abstract Builder tenantId(String tenantId);
+      public abstract Builder name(String name);
+      public abstract Builder description(String description);
+      public abstract Builder firewallPolicyId(String firewallPolicyId);
+      public abstract Builder shared(Boolean shared);
+      public abstract Builder protocol(String protocol);
+      public abstract Builder ipVersion(IpVersion ipVersion);
+      public abstract Builder sourceIpAddress(String sourceIpAddress);
+      public abstract Builder destinationIpAddress(String destinationIpAddress);
+      public abstract Builder sourcePort(String sourcePort);
+      public abstract Builder destinationPort(String destinationPort);
+      public abstract Builder position(Integer position);
+      public abstract Builder action(String action);
+      public abstract Builder enabled(Boolean enabled);
+
+      @Nullable public abstract String getTenantId();
+      @Nullable public abstract String getName();
+      @Nullable public abstract String getDescription();
+      @Nullable public abstract String getFirewallPolicyId();
+      @Nullable public abstract Boolean getShared();
+      @Nullable public abstract String getProtocol();
+      @Nullable public abstract IpVersion getIpVersion();
+      @Nullable public abstract String getSourceIpAddress();
+      @Nullable public abstract String getDestinationIpAddress();
+      @Nullable public abstract String getSourcePort();
+      @Nullable public abstract String getDestinationPort();
+      @Nullable public abstract Integer getPosition();
+      @Nullable public abstract String getAction();
+      @Nullable public abstract Boolean getEnabled();
+
+      public abstract UpdateFirewallRule build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/ExtensionNamespaces.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/ExtensionNamespaces.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/ExtensionNamespaces.java
index 60d23a3..2130972 100644
--- a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/ExtensionNamespaces.java
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/ExtensionNamespaces.java
@@ -32,6 +32,10 @@ public final class ExtensionNamespaces {
     * LBaaS Extension.
     */
    public static final String LBAAS = "http://wiki.openstack.org/neutron/LBaaS/API_1.0";
+   /**
+    * FWaaS Extension.
+    */
+   public static final String FWAAS = "http://wiki.openstack.org/Neutron/FWaaS/API_1.0";
 
    private ExtensionNamespaces() {
       throw new AssertionError("intentionally unimplemented");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FWaaSApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FWaaSApi.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FWaaSApi.java
new file mode 100644
index 0000000..6c5338f
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FWaaSApi.java
@@ -0,0 +1,253 @@
+/*
+ * 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.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
+import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+
+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.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.neutron.v2.domain.CreateFirewall;
+import org.jclouds.openstack.neutron.v2.domain.CreateFirewallPolicy;
+import org.jclouds.openstack.neutron.v2.domain.CreateFirewallRule;
+import org.jclouds.openstack.neutron.v2.domain.Firewall;
+import org.jclouds.openstack.neutron.v2.domain.FirewallPolicy;
+import org.jclouds.openstack.neutron.v2.domain.FirewallRule;
+import org.jclouds.openstack.neutron.v2.domain.UpdateFirewall;
+import org.jclouds.openstack.neutron.v2.domain.UpdateFirewallPolicy;
+import org.jclouds.openstack.neutron.v2.domain.UpdateFirewallRule;
+import org.jclouds.openstack.neutron.v2.functions.FirewallPolicyToPagedIterable;
+import org.jclouds.openstack.neutron.v2.functions.FirewallRuleToPagedIterable;
+import org.jclouds.openstack.neutron.v2.functions.FirewallToPagedIterable;
+import org.jclouds.openstack.neutron.v2.functions.ParseFirewallPolicies;
+import org.jclouds.openstack.neutron.v2.functions.ParseFirewallRules;
+import org.jclouds.openstack.neutron.v2.functions.ParseFirewalls;
+import org.jclouds.openstack.v2_0.ServiceType;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+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;
+
+/**
+ * The FWaaS extension provides OpenStack users with the ability to deploy firewalls to protect their networks.
+ * <p/>
+ *
+ * @see <a href=
+ *      "http://specs.openstack.org/openstack/neutron-specs/specs/api/firewall_as_a_service__fwaas_.html">api doc</a>
+ */
+@Beta
+@Path("/fw")
+@RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Extension(of = ServiceType.NETWORK, namespace = ExtensionNamespaces.FWAAS)
+public interface FWaaSApi {
+
+   /**
+    * Returns the list of all routers currently defined in Neutron for the current tenant. The list provides the unique
+    * identifier of each firewall configured for the tenant
+    *
+    * @return the list of all firewall references configured for the tenant.
+    */
+   @Named("fw:list")
+   @GET
+   @Transform(FirewallToPagedIterable.class)
+   @ResponseParser(ParseFirewalls.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   @Path("/firewalls")
+   PagedIterable<Firewall> list();
+
+   /**
+    * @return the list of all firewall references configured for the tenant.
+    */
+   @Named("firewall:list")
+   @GET
+   @ResponseParser(ParseFirewalls.class)
+   @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class)
+   @Path("/firewalls")
+   PaginatedCollection<Firewall> list(PaginationOptions options);
+
+   /**
+    * Returns the details for a specific firewall.
+    *
+    * @param id the id of the firewall to return
+    * @return firewall or empty if not found
+    */
+   @Named("firewall:get")
+   @GET
+   @Path("/firewalls/{id}")
+   @SelectJson("firewall")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   Firewall get(@PathParam("id") String id);
+
+   /**
+    * Create a new firewall
+    *
+    * @param firewall Options for creating a firewall
+    * @return the newly created firewall
+    */
+   @Named("firewall:create")
+   @POST
+   @SelectJson("firewall")
+   @Path("/firewalls")
+   Firewall create(@WrapWith("firewall") CreateFirewall firewall);
+
+   /**
+    * Update a firewall
+    *
+    * @param id the id of the firewall to update
+    * @param updateFirewall Contains only the attributes to update
+    * @return The modified firewall
+    */
+   @Named("firewall:update")
+   @PUT
+   @Path("/firewalls/{id}")
+   @SelectJson("firewall")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   Firewall update(@PathParam("id") String id, @WrapWith("firewall") UpdateFirewall updateFirewall);
+
+   /**
+    * Deletes the specified firewall
+    *
+    * @param id the id of the firewall to delete
+    * @return true if delete successful, false if not
+    */
+   @Named("firewall:delete")
+   @DELETE
+   @Path("/firewalls/{id}")
+   @Fallback(FalseOnNotFoundOr404.class)
+   boolean delete(@PathParam("id") String id);
+
+   @Named("firewall:createPolicy")
+   @POST
+   @SelectJson("firewall_policy")
+   @Path("/firewall_policies")
+   FirewallPolicy createFirewallPolicy(@WrapWith("firewall_policy") CreateFirewallPolicy firewallPolicy);
+
+   @Named("firewall:listPolicies")
+   @GET
+   @Transform(FirewallPolicyToPagedIterable.class)
+   @ResponseParser(ParseFirewallPolicies.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   @Path("/firewall_policies")
+   PagedIterable<FirewallPolicy> listFirewallPolicies();
+
+   @Named("firewall:listPolicies")
+   @GET
+   @ResponseParser(ParseFirewallPolicies.class)
+   @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class)
+   @Path("/firewall_policies")
+   PaginatedCollection<FirewallPolicy> listFirewallPolicies(PaginationOptions options);
+
+   @Named("firewall:getPolicy")
+   @GET
+   @SelectJson("firewall_policy")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Path("/firewall_policies/{id}")
+   FirewallPolicy getFirewallPolicy(@PathParam("id") String id);
+
+   @Named("firewall:updatePolicy")
+   @PUT
+   @SelectJson("firewall_policy")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Path("/firewall_policies/{id}")
+   FirewallPolicy updateFirewallPolicy(@PathParam("id") String id, @WrapWith("firewall_policy") UpdateFirewallPolicy updateFirewallPolicy);
+
+   @Named("firewall:deletePolicy")
+   @DELETE
+   @Path("/firewall_policies/{id}")
+   boolean deleteFirewallPolicy(@PathParam("id") String id);
+
+   @Named("firewall:createFirewallRule")
+   @POST
+   @SelectJson("firewall_rule")
+   @Path("/firewall_rules")
+   FirewallRule createFirewallRule(@WrapWith("firewall_rule") CreateFirewallRule firewallRule);
+
+   @Named("firewall:listFirewallRules")
+   @GET
+   @Transform(FirewallRuleToPagedIterable.class)
+   @ResponseParser(ParseFirewallRules.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   @Path("/firewall_rules")
+   PagedIterable<FirewallRule> listFirewallRules();
+
+   @Named("firewall:listFirewallRules")
+   @GET
+   @ResponseParser(ParseFirewallRules.class)
+   @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class)
+   @Path("/firewall_rules")
+   PaginatedCollection<FirewallRule> listFirewallRules(PaginationOptions options);
+
+   @Named("firewall:getFirewallRule")
+   @GET
+   @Path("/firewall_rules/{id}")
+   @SelectJson("firewall_rule")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   FirewallRule getFirewallRule(@PathParam("id") String firewallRuleId);
+
+   @Named("firewall:updateFirewallRule")
+   @PUT
+   @Path("/firewall_rules/{id}")
+   @SelectJson("firewall_rule")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   FirewallRule updateFirewallRule(@PathParam("id") String id, @WrapWith("firewall_rule") UpdateFirewallRule updateFirewallRule);
+
+   @Named("firewall:deleteFirewallRule")
+   @DELETE
+   @Path("/firewall_rules/{id}")
+   @Fallback(FalseOnNotFoundOr404.class)
+   boolean deleteFirewallRule(@PathParam("id") String id);
+
+   @Named("firewall:insertFirewallRuleToPolicy")
+   @PUT
+   @Path("/firewall_policies/{id}/insert_rule")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   FirewallPolicy insertFirewallRuleToPolicy(@PathParam("id") String policyId, @WrapWith("firewall_rule_id") String firewallRuleId);
+
+   @Named("firewall:removeFirewallRuleFromPolicy")
+   @DELETE
+   @Path("/firewall_policies/{id}/remove_rule")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   FirewallPolicy removeFirewallRuleFromPolicy(@PathParam("id") String policyId, @WrapWith("firewall_rule_id") String firewallRuleId);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallPolicyToPagedIterable.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallPolicyToPagedIterable.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallPolicyToPagedIterable.java
new file mode 100644
index 0000000..f70a83d
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallPolicyToPagedIterable.java
@@ -0,0 +1,63 @@
+/*
+ * 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.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+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.FirewallPolicy;
+import org.jclouds.openstack.neutron.v2.extensions.FWaaSApi;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
+/**
+ * Ensures FirewallRule works as PagedIterable.
+ */
+public class FirewallPolicyToPagedIterable extends Arg0ToPagedIterable.FromCaller<FirewallPolicy, FirewallPolicyToPagedIterable> {
+
+   private final NeutronApi api;
+
+   @Inject
+   protected FirewallPolicyToPagedIterable(NeutronApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   protected Function<Object, IterableWithMarker<FirewallPolicy>> markerToNextForArg0(Optional<Object> arg0) {
+      String region = arg0.isPresent() ? arg0.get().toString() : null;
+      final FWaaSApi firewallApi = api.getFWaaSApi(region).get();
+      return new Function<Object, IterableWithMarker<FirewallPolicy>>() {
+
+         @SuppressWarnings("unchecked")
+         @Override
+         public IterableWithMarker<FirewallPolicy> apply(Object input) {
+            return IterableWithMarker.class.cast(firewallApi.listFirewallPolicies());
+         }
+
+         @Override
+         public String toString() {
+            return "listFirewallPolicies()";
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallRuleToPagedIterable.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallRuleToPagedIterable.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallRuleToPagedIterable.java
new file mode 100644
index 0000000..eff4dc1
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallRuleToPagedIterable.java
@@ -0,0 +1,63 @@
+/*
+ * 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.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+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.FirewallRule;
+import org.jclouds.openstack.neutron.v2.extensions.FWaaSApi;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
+/**
+ * Ensures FirewallRule works as PagedIterable.
+ */
+public class FirewallRuleToPagedIterable extends Arg0ToPagedIterable.FromCaller<FirewallRule, FirewallRuleToPagedIterable> {
+
+   private final NeutronApi api;
+
+   @Inject
+   protected FirewallRuleToPagedIterable(NeutronApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   protected Function<Object, IterableWithMarker<FirewallRule>> markerToNextForArg0(Optional<Object> arg0) {
+      String region = arg0.isPresent() ? arg0.get().toString() : null;
+      final FWaaSApi firewallApi = api.getFWaaSApi(region).get();
+      return new Function<Object, IterableWithMarker<FirewallRule>>() {
+
+         @SuppressWarnings("unchecked")
+         @Override
+         public IterableWithMarker<FirewallRule> apply(Object input) {
+            return IterableWithMarker.class.cast(firewallApi.listFirewallRules());
+         }
+
+         @Override
+         public String toString() {
+            return "listFirewallRules()";
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallToPagedIterable.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallToPagedIterable.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallToPagedIterable.java
new file mode 100644
index 0000000..5d6892a
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FirewallToPagedIterable.java
@@ -0,0 +1,63 @@
+/*
+ * 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.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+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.Firewall;
+import org.jclouds.openstack.neutron.v2.extensions.FWaaSApi;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
+/**
+ * Ensures Firewall works as PagedIterable.
+ */
+public class FirewallToPagedIterable extends Arg0ToPagedIterable.FromCaller<Firewall, FirewallToPagedIterable> {
+
+   private final NeutronApi api;
+
+   @Inject
+   protected FirewallToPagedIterable(NeutronApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   protected Function<Object, IterableWithMarker<Firewall>> markerToNextForArg0(Optional<Object> arg0) {
+      String region = arg0.isPresent() ? arg0.get().toString() : null;
+      final FWaaSApi firewallApi = api.getFWaaSApi(region).get();
+      return new Function<Object, IterableWithMarker<Firewall>>() {
+
+         @SuppressWarnings("unchecked")
+         @Override
+         public IterableWithMarker<Firewall> apply(Object input) {
+            return IterableWithMarker.class.cast(firewallApi.list());
+         }
+
+         @Override
+         public String toString() {
+            return "listFirewalls()";
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallPolicies.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallPolicies.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallPolicies.java
new file mode 100644
index 0000000..4773e2b
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallPolicies.java
@@ -0,0 +1,38 @@
+/*
+ * 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.functions;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.neutron.v2.domain.FirewallPolicies;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Used by jclouds to provide more specific collections and fallbacks.
+ */
+@Singleton
+public class ParseFirewallPolicies extends ParseJson<FirewallPolicies> {
+
+   @Inject
+   public ParseFirewallPolicies(Json json) {
+      super(json, TypeLiteral.get(FirewallPolicies.class));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallRules.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallRules.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallRules.java
new file mode 100644
index 0000000..126a2ce
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewallRules.java
@@ -0,0 +1,38 @@
+/*
+ * 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.functions;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.neutron.v2.domain.FirewallRules;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Used by jclouds to provide more specific collections and fallbacks.
+ */
+@Singleton
+public class ParseFirewallRules extends ParseJson<FirewallRules> {
+
+   @Inject
+   public ParseFirewallRules(Json json) {
+      super(json, TypeLiteral.get(FirewallRules.class));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/289cce04/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewalls.java
----------------------------------------------------------------------
diff --git a/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewalls.java b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewalls.java
new file mode 100644
index 0000000..89208cd
--- /dev/null
+++ b/apis/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFirewalls.java
@@ -0,0 +1,38 @@
+/*
+ * 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.functions;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.neutron.v2.domain.Firewalls;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Used by jclouds to provide more specific collections and fallbacks.
+ */
+@Singleton
+public class ParseFirewalls extends ParseJson<Firewalls> {
+
+   @Inject
+   public ParseFirewalls(Json json) {
+      super(json, TypeLiteral.get(Firewalls.class));
+   }
+}