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

[5/6] git commit: Support LBaaS v1

Support LBaaS v1

Conflicts:
	openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/config/NeutronHttpApiModule.java
	openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/ExtensionNamespaces.java


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

Branch: refs/heads/1.8.x
Commit: 50e02c8d6f7c076afd453b698be4248a447823c2
Parents: 16e87b7
Author: fbrouille <f....@akka.eu>
Authored: Wed Oct 1 11:34:03 2014 +0200
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Thu Oct 2 15:21:42 2014 -0500

----------------------------------------------------------------------
 .../openstack/neutron/v2/NeutronApi.java        |   12 +-
 .../neutron/v2/config/NeutronHttpApiModule.java |    6 +
 .../v2/domain/lbaas/v1/HealthMonitor.java       |  451 +++++
 .../v2/domain/lbaas/v1/HealthMonitorStatus.java |  101 +
 .../v2/domain/lbaas/v1/HealthMonitors.java      |   37 +
 .../neutron/v2/domain/lbaas/v1/HttpMethod.java  |   75 +
 .../neutron/v2/domain/lbaas/v1/LBaaSStatus.java |   78 +
 .../neutron/v2/domain/lbaas/v1/Member.java      |  368 ++++
 .../neutron/v2/domain/lbaas/v1/Members.java     |   36 +
 .../neutron/v2/domain/lbaas/v1/Pool.java        |  482 +++++
 .../neutron/v2/domain/lbaas/v1/PoolStatus.java  |  101 +
 .../neutron/v2/domain/lbaas/v1/Pools.java       |   36 +
 .../neutron/v2/domain/lbaas/v1/ProbeType.java   |   70 +
 .../neutron/v2/domain/lbaas/v1/Protocol.java    |   67 +
 .../v2/domain/lbaas/v1/SessionPersistence.java  |  183 ++
 .../neutron/v2/domain/lbaas/v1/VIP.java         |  493 +++++
 .../neutron/v2/domain/lbaas/v1/VIPs.java        |   36 +
 .../v2/extensions/ExtensionNamespaces.java      |   39 +
 .../v2/extensions/lbaas/v1/LBaaSApi.java        |  426 +++++
 .../lbaas/v1/EmptyHealthMonitorsFallback.java   |   46 +
 .../lbaas/v1/EmptyMembersFallback.java          |   46 +
 .../fallbacks/lbaas/v1/EmptyPoolsFallback.java  |   46 +
 .../fallbacks/lbaas/v1/EmptyVIPsFallback.java   |   46 +
 .../lbaas/v1/HealthMonitorsToPagedIterable.java |   66 +
 .../lbaas/v1/MembersToPagedIterable.java        |   65 +
 .../functions/lbaas/v1/ParseHealthMonitors.java |   38 +
 .../v2/functions/lbaas/v1/ParseMembers.java     |   38 +
 .../v2/functions/lbaas/v1/ParsePools.java       |   38 +
 .../v2/functions/lbaas/v1/ParseVIPs.java        |   38 +
 .../lbaas/v1/PoolsToPagedIterable.java          |   65 +
 .../functions/lbaas/v1/VIPsToPagedIterable.java |   65 +
 .../extensions/lbaas/v1/LBaaSApiLiveTest.java   |  637 +++++++
 .../extensions/lbaas/v1/LBaaSApiMockTest.java   | 1787 ++++++++++++++++++
 .../extension_list_with_lbaas_v1_response.json  |  140 ++
 ...xtension_list_without_lbaas_v1_response.json |  132 ++
 .../lbaas/v1/health_monitor_create_request.json |    8 +
 .../v1/health_monitor_create_response.json      |   16 +
 .../lbaas/v1/health_monitor_get_response.json   |   16 +
 .../v1/health_monitor_list_response_paged1.json |   20 +
 .../v1/health_monitor_list_response_paged2.json |   23 +
 .../lbaas/v1/health_monitor_update_request.json |   11 +
 .../v1/health_monitor_update_response.json      |   16 +
 .../lbaas/v1/member_create_request.json         |    6 +
 .../lbaas/v1/member_create_response.json        |   12 +
 .../resources/lbaas/v1/member_get_response.json |   12 +
 .../lbaas/v1/member_list_response_paged1.json   |   20 +
 .../lbaas/v1/member_list_response_paged2.json   |   20 +
 .../lbaas/v1/member_update_request.json         |    7 +
 .../lbaas/v1/member_update_response.json        |   12 +
 .../pool_associate_health_monitor_request.json  |    5 +
 .../pool_associate_health_monitor_response.json |    4 +
 .../resources/lbaas/v1/pool_create_request.json |    8 +
 .../lbaas/v1/pool_create_response.json          |   18 +
 .../resources/lbaas/v1/pool_get_response.json   |   35 +
 .../lbaas/v1/pool_list_response_paged1.json     |   46 +
 .../lbaas/v1/pool_list_response_paged2.json     |   42 +
 .../resources/lbaas/v1/pool_update_request.json |   11 +
 .../lbaas/v1/pool_update_response.json          |   29 +
 .../resources/lbaas/v1/vip_create_request.json  |    9 +
 .../resources/lbaas/v1/vip_create_response.json |   17 +
 .../resources/lbaas/v1/vip_get_response.json    |   21 +
 .../lbaas/v1/vip_list_response_paged1.json      |   29 +
 .../lbaas/v1/vip_list_response_paged2.json      |   29 +
 .../resources/lbaas/v1/vip_update_request.json  |   13 +
 .../resources/lbaas/v1/vip_update_response.json |   21 +
 65 files changed, 6925 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/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 b54fa39..983fe94 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
@@ -22,12 +22,12 @@ import java.util.Set;
 import javax.ws.rs.Path;
 
 import org.jclouds.Constants;
-
 import org.jclouds.location.Region;
 import org.jclouds.location.functions.RegionToEndpoint;
 import org.jclouds.openstack.neutron.v2.extensions.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.features.NetworkApi;
 import org.jclouds.openstack.neutron.v2.features.PortApi;
 import org.jclouds.openstack.neutron.v2.features.SubnetApi;
@@ -103,4 +103,14 @@ public interface NeutronApi extends Closeable {
     */
    @Delegate
    Optional<SecurityGroupApi> getSecurityGroupApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to LBaaS 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<LBaaSApi> getLBaaSApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/config/NeutronHttpApiModule.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/config/NeutronHttpApiModule.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/config/NeutronHttpApiModule.java
index 545e7e4..338acd7 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/config/NeutronHttpApiModule.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/config/NeutronHttpApiModule.java
@@ -60,6 +60,12 @@ public class NeutronHttpApiModule extends HttpApiModule<NeutronApi> {
    @Singleton
    public Multimap<URI, URI> aliases() {
        return ImmutableMultimap.<URI, URI>builder()
+          .put(URI.create(ExtensionNamespaces.L3_ROUTER),
+               URI.create("http://docs.openstack.org/ext/neutron/router/api/v1.0"))
+          .put(URI.create(ExtensionNamespaces.SECURITY_GROUPS),
+               URI.create("http://docs.openstack.org/ext/securitygroups/api/v2.0"))
+          .put(URI.create(ExtensionNamespaces.LBAAS),
+                  URI.create("http://docs.openstack.org/networking/ext/lbaas/api/v1.0"))
           .build();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitor.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitor.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitor.java
new file mode 100644
index 0000000..29ec991
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitor.java
@@ -0,0 +1,451 @@
+/*
+ * 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.lbaas.v1;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * A Neutron LBaaS v1 HealthMonitor.
+ */
+public class HealthMonitor {
+
+   // Mandatory attributes when creating
+   @Named("tenant_id")
+   private String tenantId;
+   private ProbeType type;
+   // Mandatory attributes that can be updated
+   private Integer delay;
+   private Integer timeout;
+   @Named("max_retries")
+   private Integer maxRetries;
+   // Optional attributes that can be updated
+   @Named("http_method")
+   private HttpMethod httpMethod;
+   @Named("url_path")
+   private String urlPath;
+   @Named("expected_codes")
+   private String expectedCodes;
+   @Named("admin_state_up")
+   private Boolean adminStateUp;
+   // Read-only attributes
+   private String id;
+   private ImmutableList<PoolStatus> pools;
+   private LBaaSStatus status;
+   @Named("status_description")
+   private String statusDescription;
+
+   /**
+    * Deserialization constructor
+    */
+   @ConstructorProperties({ "id", "tenant_id", "type", "delay", "timeout", "max_retries", "http_method", "url_path",
+         "expected_codes", "pools", "admin_state_up", "status", "status_description" })
+   private HealthMonitor(String id, String tenantId, ProbeType type, Integer delay, Integer timeout,
+         Integer maxRetries, HttpMethod httpMethod, String urlPath, String expectedCodes,
+         ImmutableList<PoolStatus> pools, Boolean adminStateUp, LBaaSStatus status, String statusDescription) {
+      this.id = id;
+      this.tenantId = tenantId;
+      this.type = type;
+      this.delay = delay;
+      this.timeout = timeout;
+      this.maxRetries = maxRetries;
+      this.httpMethod = httpMethod;
+      this.urlPath = urlPath;
+      this.expectedCodes = expectedCodes;
+      this.pools = pools;
+      this.adminStateUp = adminStateUp;
+      this.status = status;
+      this.statusDescription = statusDescription;
+   }
+
+   /**
+    * Default constructor.
+    */
+   private HealthMonitor() {
+   }
+
+   /**
+    * Copy constructor.
+    *
+    * @param healthMonitor the HealthMonitor to copy from.
+    */
+   private HealthMonitor(HealthMonitor healthMonitor) {
+      this(healthMonitor.id, healthMonitor.tenantId, healthMonitor.type, healthMonitor.delay, healthMonitor.timeout,
+            healthMonitor.maxRetries, healthMonitor.httpMethod, healthMonitor.urlPath, healthMonitor.expectedCodes,
+            healthMonitor.pools, healthMonitor.adminStateUp, healthMonitor.status, healthMonitor.statusDescription);
+   }
+
+   /**
+    * @return the id of the HealthMonitor.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the tenant id of the HealthMonitor.
+    */
+   @Nullable
+   public String getTenantId() {
+      return tenantId;
+   }
+
+   /**
+    * @return the probe type for this HealthMonitor.
+    */
+   @Nullable
+   public ProbeType getType() {
+      return type;
+   }
+
+   /**
+    * @return the delay for this HealthMonitor.
+    */
+   @Nullable
+   public Integer getDelay() {
+      return delay;
+   }
+
+   /**
+    * @return the timeout for this HealthMonitor.
+    */
+   @Nullable
+   public Integer getTimeout() {
+      return timeout;
+   }
+
+   /**
+    * @return the max retries for this HealthMonitor.
+    */
+   @Nullable
+   public Integer getMaxRetries() {
+      return maxRetries;
+   }
+
+   /**
+    * @return the HTTP method for this HealthMonitor.
+    */
+   @Nullable
+   public HttpMethod getHttpMethod() {
+      return httpMethod;
+   }
+
+   /**
+    * @return the URL path for this HealthMonitor.
+    */
+   @Nullable
+   public String getUrlPath() {
+      return urlPath;
+   }
+
+   /**
+    * @return the expected codes for this HealthMonitor.
+    */
+   @Nullable
+   public String getExpectedCodes() {
+      return expectedCodes;
+   }
+
+   /**
+    * @return the pools for this HealthMonitor.
+    */
+   @Nullable
+   public ImmutableList<PoolStatus> getPools() {
+      return pools;
+   }
+
+   /**
+    * @return the administrative state for this HealthMonitor.
+    */
+   @Nullable
+   public Boolean getAdminStateUp() {
+      return adminStateUp;
+   }
+
+   /**
+    * @return the status for this HealthMonitor.
+    */
+   @Nullable
+   public LBaaSStatus getStatus() {
+      return status;
+   }
+
+   /**
+    * @return the status description for this HealthMonitor.
+    */
+   @Nullable
+   public String getStatusDescription() {
+      return statusDescription;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o)
+         return true;
+      if (o == null || getClass() != o.getClass())
+         return false;
+
+      HealthMonitor that = (HealthMonitor) o;
+
+      return Objects.equal(this.id, that.id) && Objects.equal(this.tenantId, that.tenantId)
+            && Objects.equal(this.type, that.type) && Objects.equal(this.delay, that.delay)
+            && Objects.equal(this.timeout, that.timeout) && Objects.equal(this.maxRetries, that.maxRetries)
+            && Objects.equal(this.httpMethod, that.httpMethod) && Objects.equal(this.urlPath, that.urlPath)
+            && Objects.equal(this.expectedCodes, that.expectedCodes) && Objects.equal(this.pools, that.pools)
+            && Objects.equal(this.adminStateUp, that.adminStateUp) && Objects.equal(this.status, that.status)
+            && Objects.equal(this.statusDescription, that.statusDescription);
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, tenantId, type, delay, timeout, maxRetries, httpMethod, urlPath, expectedCodes,
+            pools, adminStateUp, status, statusDescription);
+   }
+
+   @Override
+   public String toString() {
+      return MoreObjects.toStringHelper(this).add("id", id).add("tenantId", tenantId).add("type", type)
+            .add("delay", delay).add("timeout", timeout).add("maxRetries", maxRetries).add("httpMethod", httpMethod)
+            .add("urlPath", urlPath).add("expectedCodes", expectedCodes).add("pools", pools)
+            .add("adminStateUp", adminStateUp).add("status", status).add("statusDescription", statusDescription)
+            .toString();
+   }
+
+   /*
+    * Methods to get the Create and Update builders follow.
+    */
+
+   /**
+    * @return the Builder for creating a new HealthMonitor.
+    */
+   public static CreateBuilder createBuilder(ProbeType type, Integer delay, Integer timeout, Integer maxRetries) {
+      return new CreateBuilder(type, delay, timeout, maxRetries);
+   }
+
+   /**
+    * @return the Builder for updating a HealthMonitor.
+    */
+   public static UpdateBuilder updateBuilder() {
+      return new UpdateBuilder();
+   }
+
+   private abstract static class Builder<ParameterizedBuilderType> {
+      protected HealthMonitor healthMonitor;
+
+      /**
+       * Default constructor.
+       */
+      private Builder() {
+         healthMonitor = new HealthMonitor();
+      }
+
+      protected abstract ParameterizedBuilderType self();
+
+      /**
+       * Provides the delay for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getDelay()
+       */
+      public ParameterizedBuilderType delay(Integer delay) {
+         healthMonitor.delay = delay;
+         return self();
+      }
+
+      /**
+       * Provides the timeout for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getTimeout()
+       */
+      public ParameterizedBuilderType timeout(Integer timeout) {
+         healthMonitor.timeout = timeout;
+         return self();
+      }
+
+      /**
+       * Provides the max retries for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getMaxRetries()
+       */
+      public ParameterizedBuilderType maxRetries(Integer maxRetries) {
+         healthMonitor.maxRetries = maxRetries;
+         return self();
+      }
+
+      /**
+       * Provides the HTTP method for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getHttpMethod()
+       */
+      public ParameterizedBuilderType httpMethod(HttpMethod httpMethod) {
+         healthMonitor.httpMethod = httpMethod;
+         return self();
+      }
+
+      /**
+       * Provides the URL path for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getUrlPath()
+       */
+      public ParameterizedBuilderType urlPath(String urlPath) {
+         healthMonitor.urlPath = urlPath;
+         return self();
+      }
+
+      /**
+       * Provides the expected codes for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getExpectedCodes()
+       */
+      public ParameterizedBuilderType expectedCodes(String expectedCodes) {
+         healthMonitor.expectedCodes = expectedCodes;
+         return self();
+      }
+
+      /**
+       * Provides the administrative state for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getAdminStateUp()
+       */
+      public ParameterizedBuilderType adminStateUp(Boolean adminStateUp) {
+         healthMonitor.adminStateUp = adminStateUp;
+         return self();
+      }
+   }
+
+   /**
+    * Create builder (inheriting from Builder).
+    */
+   public static class CreateBuilder extends Builder<CreateBuilder> {
+      /**
+       * Supply required properties for creating a HealthMonitor's CreateBuilder.
+       *
+       * @param type the probe type.
+       * @param delay the delay.
+       * @param timeout the timeout.
+       * @param maxRetries the max retries.
+       */
+      private CreateBuilder(ProbeType type, Integer delay, Integer timeout, Integer maxRetries) {
+         type(type).delay(delay).timeout(timeout).maxRetries(maxRetries);
+      }
+
+      /**
+       * Provides the tenantId for this HealthMonitor's CreateBuilder. Admin-only.
+       * When keystone is enabled, it is not mandatory to specify tenant_id for resources in create requests, as the
+       * tenant identifier will be derived from the Authentication token. Please note that the default authorization
+       * settings only allow administrative users to create resources on behalf of a different tenant.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getTenantId()
+       */
+      public CreateBuilder tenantId(String tenantId) {
+         healthMonitor.tenantId = tenantId;
+         return self();
+      }
+
+      /**
+       * Provides the probe type for this HealthMonitor's Builder.
+       *
+       * @return the Builder.
+       * @see HealthMonitor#getType()
+       */
+      public CreateBuilder type(ProbeType type) {
+         healthMonitor.type = type;
+         return self();
+      }
+
+      /**
+       * @return a CreateHealthMonitor constructed with this Builder.
+       */
+      public CreateHealthMonitor build() {
+         return new CreateHealthMonitor(healthMonitor);
+      }
+
+      @Override
+      protected CreateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Update builder (inheriting from Builder).
+    */
+   public static class UpdateBuilder extends Builder<UpdateBuilder> {
+      /**
+       * Supply required properties for creating a HealthMonitor's UpdateBuilder.
+       */
+      private UpdateBuilder() {
+      }
+
+      /**
+       * @return an UpdateHealthMonitor constructed with this Builder.
+       */
+      public UpdateHealthMonitor build() {
+         return new UpdateHealthMonitor(healthMonitor);
+      }
+
+      @Override
+      protected UpdateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Create options - extend the domain class, passed to API create calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class CreateHealthMonitor extends HealthMonitor {
+      /**
+       * Copy constructor.
+       *
+       * @param healthMonitor the HealthMonitor to copy from.
+       */
+      private CreateHealthMonitor(HealthMonitor healthMonitor) {
+         super(healthMonitor);
+      }
+   }
+
+   /**
+    * Update options - extend the domain class, passed to API update calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class UpdateHealthMonitor extends HealthMonitor {
+      /**
+       * Copy constructor.
+       *
+       * @param healthMonitor the HealthMonitor to copy from.
+       */
+      private UpdateHealthMonitor(HealthMonitor healthMonitor) {
+         super(healthMonitor);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitorStatus.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitorStatus.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitorStatus.java
new file mode 100644
index 0000000..ad8d468
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitorStatus.java
@@ -0,0 +1,101 @@
+/*
+ * 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.lbaas.v1;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * A Neutron LBaaS v1 HealthMonitorStatus.
+ * Contains an id and status describing the health monitor's status.
+ *
+ * @see Pool#getHealthMonitorsStatus()
+ */
+public class HealthMonitorStatus {
+
+   // Mandatory attributes
+   @Named("monitor_id")
+   protected final String id;
+   protected final LBaaSStatus status;
+   // Optional attributes
+   @Named("status_description")
+   protected final String statusDescription;
+
+   @ConstructorProperties({ "monitor_id", "status", "status_description" })
+   protected HealthMonitorStatus(String id, LBaaSStatus status, String statusDescription) {
+      this.id = id;
+      this.status = status;
+      this.statusDescription = statusDescription;
+   }
+
+   /**
+    * @return the id of the HealthMonitorStatus.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the status of the HealthMonitorStatus
+    */
+   @Nullable
+   public LBaaSStatus getStatus() {
+      return status;
+   }
+
+   /**
+    * @return the status description of the HealthMonitorStatus
+    */
+   @Nullable
+   public String getStatusDescription() {
+      return statusDescription;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, status, statusDescription);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null || getClass() != obj.getClass())
+         return false;
+      HealthMonitorStatus that = HealthMonitorStatus.class.cast(obj);
+      return Objects.equal(this.id, that.id) && Objects.equal(this.status, that.status)
+            && Objects.equal(this.statusDescription, that.statusDescription);
+   }
+
+   protected MoreObjects.ToStringHelper string() {
+      return MoreObjects.toStringHelper(this).add("id", id).add("status", status)
+            .add("statusDescription", statusDescription);
+   }
+
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitors.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitors.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitors.java
new file mode 100644
index 0000000..a254938
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HealthMonitors.java
@@ -0,0 +1,37 @@
+/*
+ * 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.lbaas.v1;
+
+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 Neutron LBaaS v1 HealthMonitors.
+ */
+public class HealthMonitors extends PaginatedCollection<HealthMonitor> {
+   public static final HealthMonitors EMPTY = new HealthMonitors(ImmutableSet.<HealthMonitor> of(),
+         ImmutableSet.<Link> of());
+
+   @ConstructorProperties({ "health_monitors", "health_monitors_links" })
+   protected HealthMonitors(Iterable<HealthMonitor> healthMonitors, Iterable<Link> healthMonitorsLinks) {
+      super(healthMonitors, healthMonitorsLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HttpMethod.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HttpMethod.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HttpMethod.java
new file mode 100644
index 0000000..f795c66
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/HttpMethod.java
@@ -0,0 +1,75 @@
+/*
+ * 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.lbaas.v1;
+
+
+/**
+ * Enumerates supported HTTP methods used by probes of type HTTP/HTTPS that are sent by health monitor to verify member state.
+ */
+public enum HttpMethod {
+   /**
+    * Health monitor sends a GET HTTP request to the member.
+    */
+   GET("GET"),
+   /**
+    * Health monitor sends a POST HTTP request to the member.
+    */
+   POST("POST"),
+   /**
+    * Health monitor sends a PUT HTTP request to the member.
+    */
+   PUT("PUT"),
+   /**
+    * Health monitor sends a DELETE HTTP request to the member.
+    */
+   DELETE("DELETE"),
+   /**
+    * Health monitor sends a HEAD HTTP request to the member.
+    */
+   HEAD("HEAD"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private HttpMethod(String name) {
+      this.name = name;
+   }
+
+   @Override
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static HttpMethod fromValue(String name){
+      if (name != null) {
+         for (HttpMethod value : HttpMethod.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/LBaaSStatus.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/LBaaSStatus.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/LBaaSStatus.java
new file mode 100644
index 0000000..85820fc
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/LBaaSStatus.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.domain.lbaas.v1;
+
+/**
+ * Enumerates supported Neutron LBaaS v1 resources status.
+ */
+public enum LBaaSStatus {
+   /**
+    * The LBaaS v1 resource is ready and active.
+    */
+   ACTIVE("active"),
+   /**
+    * The LBaaS v1 resource is being created.
+    */
+   PENDING_CREATE("pending_create"),
+   /**
+    * The LBaaS v1 resource is being updated.
+    */
+   PENDING_UPDATE("pending_update"),
+   /**
+    * The LBaaS v1 resource is going to be deleted.
+    */
+   PENDING_DELETE("pending_delete"),
+   /**
+    * The LBaaS v1 resource is created but not active.
+    */
+   INACTIVE("inactive"),
+   /**
+    * The LBaaS v1 resource is in an error state.
+    */
+   ERROR("error"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private LBaaSStatus(String name) {
+      this.name = name;
+   }
+
+   @Override
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static LBaaSStatus fromValue(String name){
+      if (name != null) {
+         for (LBaaSStatus value : LBaaSStatus.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Member.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Member.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Member.java
new file mode 100644
index 0000000..bff6cfe
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Member.java
@@ -0,0 +1,368 @@
+/*
+ * 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.lbaas.v1;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * A Neutron LBaaS v1 Member.
+ */
+public class Member {
+
+   // Mandatory attributes when creating
+   @Named("tenant_id")
+   private String tenantId;
+   private String address;
+   @Named("protocol_port")
+   private Integer protocolPort;
+   // Mandatory attributes that can be updated
+   @Named("pool_id")
+   private String poolId;
+   // Optional attributes that can be updated
+   private Integer weight;
+   @Named("admin_state_up")
+   private Boolean adminStateUp;
+   // Read-only attributes
+   private String id;
+   private LBaaSStatus status;
+   @Named("status_description")
+   private String statusDescription;
+
+   /**
+    * Deserialization constructor.
+    */
+   @ConstructorProperties({ "id", "tenant_id", "pool_id", "address", "protocol_port", "weight", "admin_state_up",
+         "status", "status_description" })
+   private Member(String id, String tenantId, String poolId, String address, Integer protocolPort, Integer weight,
+         Boolean adminStateUp, LBaaSStatus status, String statusDescription) {
+      this.id = id;
+      this.tenantId = tenantId;
+      this.poolId = poolId;
+      this.address = address;
+      this.protocolPort = protocolPort;
+      this.weight = weight;
+      this.adminStateUp = adminStateUp;
+      this.status = status;
+      this.statusDescription = statusDescription;
+   }
+
+   /**
+    * Default constructor.
+    */
+   private Member() {
+   }
+
+   /**
+    * Copy constructor.
+    *
+    * @param member the Member to copy from.
+    */
+   private Member(Member member) {
+      this(member.id, member.tenantId, member.poolId, member.address, member.protocolPort, member.weight,
+            member.adminStateUp, member.status, member.statusDescription);
+   }
+
+   /**
+    * @return the id of the Member.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the tenant id of the Member.
+    */
+   @Nullable
+   public String getTenantId() {
+      return tenantId;
+   }
+
+   /**
+    * @return the pool id for this Member.
+    */
+   @Nullable
+   public String getPoolId() {
+      return poolId;
+   }
+
+   /**
+    * @return the address for this Member.
+    */
+   @Nullable
+   public String getAddress() {
+      return address;
+   }
+
+   /**
+    * @return the protocol port for this Member.
+    */
+   @Nullable
+   public Integer getProtocolPort() {
+      return protocolPort;
+   }
+
+   /**
+    * @return the weight for this Member.
+    */
+   @Nullable
+   public Integer getWeight() {
+      return weight;
+   }
+
+   /**
+    * @return the administrative state for this Member.
+    */
+   @Nullable
+   public Boolean getAdminStateUp() {
+      return adminStateUp;
+   }
+
+   /**
+    * @return the status for this Member.
+    */
+   @Nullable
+   public LBaaSStatus getStatus() {
+      return status;
+   }
+
+   /**
+    * @return the status description for this Member.
+    */
+   @Nullable
+   public String getStatusDescription() {
+      return statusDescription;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o)
+         return true;
+      if (o == null || getClass() != o.getClass())
+         return false;
+
+      Member that = (Member) o;
+
+      return Objects.equal(this.id, that.id) && Objects.equal(this.tenantId, that.tenantId)
+            && Objects.equal(this.poolId, that.poolId) && Objects.equal(this.address, that.address)
+            && Objects.equal(this.protocolPort, that.protocolPort) && Objects.equal(this.weight, that.weight)
+            && Objects.equal(this.adminStateUp, that.adminStateUp) && Objects.equal(this.status, that.status)
+            && Objects.equal(this.statusDescription, that.statusDescription);
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, tenantId, poolId, address, protocolPort, weight, adminStateUp, status,
+            statusDescription);
+   }
+
+   @Override
+   public String toString() {
+      return MoreObjects.toStringHelper(this).add("id", id).add("tenantId", tenantId).add("poolId", poolId)
+            .add("address", address).add("protocolPort", protocolPort).add("weight", weight)
+            .add("adminStateUp", adminStateUp).add("status", status).add("statusDescription", statusDescription)
+            .toString();
+   }
+
+   /*
+    * Methods to get the Create and Update builders follow.
+    */
+
+   /**
+    * @return the Builder for creating a new Member.
+    */
+   public static CreateBuilder createBuilder(String poolId, String address, Integer port) {
+      return new CreateBuilder(poolId, address, port);
+   }
+
+   /**
+    * @return the Builder for updating a Member.
+    */
+   public static UpdateBuilder updateBuilder() {
+      return new UpdateBuilder();
+   }
+
+   private abstract static class Builder<ParameterizedBuilderType> {
+      protected Member member;
+
+      /**
+       * Default constructor.
+       */
+      private Builder() {
+         member = new Member();
+      }
+
+      protected abstract ParameterizedBuilderType self();
+
+      /**
+       * Provides the pool id for this Member's Builder.
+       *
+       * @return the Builder.
+       * @see Member#getPoolId()
+       */
+      public ParameterizedBuilderType poolId(String poolId) {
+         member.poolId = poolId;
+         return self();
+      }
+
+      /**
+       * Provides the weight for this Member's Builder.
+       *
+       * @return the Builder.
+       * @see Member#getWeight()
+       */
+      public ParameterizedBuilderType weight(Integer weight) {
+         member.weight = weight;
+         return self();
+      }
+
+      /**
+       * Provides the administrative state for this Member's Builder.
+       *
+       * @return the Builder.
+       * @see Member#getAdminStateUp()
+       */
+      public ParameterizedBuilderType adminStateUp(Boolean adminStateUp) {
+         member.adminStateUp = adminStateUp;
+         return self();
+      }
+   }
+
+   /**
+    * Create builder (inheriting from Builder).
+    */
+   public static class CreateBuilder extends Builder<CreateBuilder> {
+      /**
+       * Supply required properties for creating a Member's CreateBuilder.
+       *
+       * @param poolId the pool id.
+       * @param address the IP address.
+       * @param port the protocol port.
+       */
+      private CreateBuilder(String poolId, String address, Integer port) {
+         poolId(poolId).address(address).protocolPort(port);
+      }
+
+      /**
+       * Provides the tenantId for this Member's Builder. Admin-only.
+       * When keystone is enabled, it is not mandatory to specify tenant_id for resources in create requests, as the
+       * tenant identifier will be derived from the Authentication token. Please note that the default authorization
+       * settings only allow administrative users to create resources on behalf of a different tenant.
+       *
+       * @return the Builder.
+       * @see Member#getTenantId()
+       */
+      public CreateBuilder tenantId(String tenantId) {
+         member.tenantId = tenantId;
+         return self();
+      }
+
+      /**
+       * Provides the address for this Member's Builder.
+       *
+       * @return the Builder.
+       * @see Member#getAddress()
+       */
+      public CreateBuilder address(String address) {
+         member.address = address;
+         return self();
+      }
+
+      /**
+       * Provides the protocol port for this Member's Builder.
+       *
+       * @return the Builder.
+       * @see Member#getProtocolPort()
+       */
+      public CreateBuilder protocolPort(Integer protocolPort) {
+         member.protocolPort = protocolPort;
+         return self();
+      }
+
+      /**
+       * @return a CreateMember constructed with this Builder.
+       */
+      public CreateMember build() {
+         return new CreateMember(member);
+      }
+
+      @Override
+      protected CreateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Update builder (inheriting from Builder).
+    */
+   public static class UpdateBuilder extends Builder<UpdateBuilder> {
+      /**
+       * Supply required properties for creating a Member's UpdateBuilder.
+       */
+      private UpdateBuilder() {
+      }
+
+      /**
+       * @return a UpdateMember constructed with this Builder.
+       */
+      public UpdateMember build() {
+         return new UpdateMember(member);
+      }
+
+      @Override
+      protected UpdateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Create options - extend the domain class, passed to API create calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class CreateMember extends Member {
+      /**
+       * Copy constructor.
+       *
+       * @param member the Member to copy from.
+       */
+      private CreateMember(Member member) {
+         super(member);
+      }
+   }
+
+   /**
+    * Update options - extend the domain class, passed to API update calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class UpdateMember extends Member {
+      /**
+       * Copy constructor.
+       *
+       * @param member the Member to copy from.
+       */
+      private UpdateMember(Member member) {
+         super(member);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Members.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Members.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Members.java
new file mode 100644
index 0000000..74a464d
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Members.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.lbaas.v1;
+
+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 of Neutron LBaaS v1 Members.
+ */
+public class Members extends PaginatedCollection<Member> {
+   public static final Members EMPTY = new Members(ImmutableSet.<Member> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({ "members", "members_links" })
+   protected Members(Iterable<Member> members, Iterable<Link> membersLinks) {
+      super(members, membersLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pool.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pool.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pool.java
new file mode 100644
index 0000000..5139141
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pool.java
@@ -0,0 +1,482 @@
+/*
+ * 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.lbaas.v1;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A Neutron LBaaS v1 Pool.
+ */
+public class Pool {
+
+   // Load balancing methods that must be supported by all providers.
+   // Not an enum type because any provider may support additional balancing methods.
+   public static String ROUND_ROBIN = "ROUND_ROBIN";
+   public static String LEAST_CONNECTIONS = "LEAST_CONNECTIONS";
+   public static String SOURCE_IP = "SOURCE_IP";
+
+   // Mandatory attributes when creating
+   @Named("tenant_id")
+   private String tenantId;
+   @Named("subnet_id")
+   private String subnetId;
+   private Protocol protocol;
+   // Mandatory attributes that can be updated
+   @Named("lb_method")
+   private String lbMethod;
+   // Optional attributes when creating
+   private String provider;
+   // Optional attributes that can be updated
+   private String name;
+   private String description;
+   @Named("health_monitors")
+   private ImmutableSet<String> healthMonitors;
+   @Named("admin_state_up")
+   private Boolean adminStateUp;
+   // Read-only attributes
+   private String id;
+   @Named("vip_id")
+   private String vipId;
+   private ImmutableSet<String> members;
+   @Named("health_monitors_status")
+   private ImmutableList<HealthMonitorStatus> healthMonitorsStatus;
+   private LBaaSStatus status;
+   @Named("status_description")
+   private String statusDescription;
+
+   /**
+    * Deserialization constructor.
+    */
+   @ConstructorProperties({ "id", "tenant_id", "vip_id", "name", "description", "subnet_id", "protocol", "provider",
+         "lb_method", "health_monitors", "health_monitors_status", "members", "admin_state_up", "status",
+         "status_description" })
+   private Pool(String id, String tenantId, String vipId, String name, String description, String subnetId,
+         Protocol protocol, String provider, String lbMethod, ImmutableSet<String> healthMonitors,
+         ImmutableList<HealthMonitorStatus> healthMonitorsStatus, ImmutableSet<String> members, Boolean adminStateUp,
+         LBaaSStatus status, String statusDescription) {
+      this.id = id;
+      this.tenantId = tenantId;
+      this.vipId = vipId;
+      this.name = name;
+      this.description = description;
+      this.subnetId = subnetId;
+      this.protocol = protocol;
+      this.provider = provider;
+      this.lbMethod = lbMethod;
+      this.healthMonitors = healthMonitors;
+      this.healthMonitorsStatus = healthMonitorsStatus;
+      this.members = members;
+      this.adminStateUp = adminStateUp;
+      this.status = status;
+      this.statusDescription = statusDescription;
+   }
+
+   /**
+    * Default constructor.
+    */
+   private Pool() {
+   }
+
+   /**
+    * Copy constructor.
+    *
+    * @param pool the Pool to copy from.
+    */
+   private Pool(Pool pool) {
+      this(pool.id, pool.tenantId, pool.vipId, pool.name, pool.description, pool.subnetId, pool.protocol,
+            pool.provider, pool.lbMethod, pool.healthMonitors, pool.healthMonitorsStatus, pool.members,
+            pool.adminStateUp, pool.status, pool.statusDescription);
+   }
+
+   /**
+    * @return the id of the Pool.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the tenant id of the Pool.
+    */
+   @Nullable
+   public String getTenantId() {
+      return tenantId;
+   }
+
+   /**
+    * @return the virtual IP id of the Pool.
+    */
+   @Nullable
+   public String getVIPId() {
+      return vipId;
+   }
+
+   /**
+    * @return the name of the Pool.
+    */
+   @Nullable
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @return the description of the Pool.
+    */
+   @Nullable
+   public String getDescription() {
+      return description;
+   }
+
+   /**
+    * @return the subnet id for this Pool.
+    */
+   @Nullable
+   public String getSubnetId() {
+      return subnetId;
+   }
+
+   /**
+    * @return the protocol for this Pool.
+    */
+   @Nullable
+   public Protocol getProtocol() {
+      return protocol;
+   }
+
+   /**
+    * @return the provider for this Pool.
+    */
+   @Nullable
+   public String getProvider() {
+      return provider;
+   }
+
+   /**
+    * @return the load balancing method for this Pool.
+    */
+   @Nullable
+   public String getLBMethod() {
+      return lbMethod;
+   }
+
+   /**
+    * @return the health monitors for this Pool.
+    */
+   @Nullable
+   public ImmutableSet<String> getHealthMonitors() {
+      return healthMonitors;
+   }
+
+   /**
+    * @return the health monitors status for this Pool.
+    */
+   @Nullable
+   public ImmutableList<HealthMonitorStatus> getHealthMonitorsStatus() {
+      return healthMonitorsStatus;
+   }
+
+   /**
+    * @return the members for this Pool.
+    */
+   @Nullable
+   public ImmutableSet<String> getMembers() {
+      return members;
+   }
+
+   /**
+    * @return the administrative state for this Pool.
+    */
+   @Nullable
+   public Boolean getAdminStateUp() {
+      return adminStateUp;
+   }
+
+   /**
+    * @return the status for this Pool.
+    */
+   @Nullable
+   public LBaaSStatus getStatus() {
+      return status;
+   }
+
+   /**
+    * @return the status description for this Pool.
+    */
+   @Nullable
+   public String getStatusDescription() {
+      return statusDescription;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o)
+         return true;
+      if (o == null || getClass() != o.getClass())
+         return false;
+
+      Pool that = (Pool) o;
+
+      return Objects.equal(this.id, that.id) && Objects.equal(this.tenantId, that.tenantId)
+            && Objects.equal(this.vipId, that.vipId) && Objects.equal(this.name, that.name)
+            && Objects.equal(this.description, that.description) && Objects.equal(this.subnetId, that.subnetId)
+            && Objects.equal(this.protocol, that.protocol) && Objects.equal(this.provider, that.provider)
+            && Objects.equal(this.lbMethod, that.lbMethod) && Objects.equal(this.healthMonitors, that.healthMonitors)
+            && Objects.equal(this.healthMonitorsStatus, that.healthMonitorsStatus)
+            && Objects.equal(this.members, that.members) && Objects.equal(this.adminStateUp, that.adminStateUp)
+            && Objects.equal(this.status, that.status) && Objects.equal(this.statusDescription, that.statusDescription);
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, tenantId, vipId, name, description, subnetId, protocol, provider, lbMethod,
+            healthMonitors, healthMonitorsStatus, members, adminStateUp, status, statusDescription);
+   }
+
+   @Override
+   public String toString() {
+      return MoreObjects.toStringHelper(this).add("id", id).add("tenantId", tenantId).add("vipId", vipId)
+            .add("name", name).add("description", description).add("subnetId", subnetId).add("protocol", protocol)
+            .add("provider", provider).add("lbMethod", lbMethod).add("healthMonitors", healthMonitors)
+            .add("healthMonitorsStatus", healthMonitorsStatus).add("members", members)
+            .add("adminStateUp", adminStateUp).add("status", status).add("statusDescription", statusDescription)
+            .toString();
+   }
+
+   /*
+    * Methods to get the Create and Update builders follow.
+    */
+
+   /**
+    * @return the Builder for creating a new Pool.
+    */
+   public static CreateBuilder createBuilder(String subnetId, Protocol protocol, String lbMethod) {
+      return new CreateBuilder(subnetId, protocol, lbMethod);
+   }
+
+   /**
+    * @return the Builder for updating a Pool.
+    */
+   public static UpdateBuilder updateBuilder() {
+      return new UpdateBuilder();
+   }
+
+   private abstract static class Builder<ParameterizedBuilderType> {
+      protected Pool pool;
+
+      /**
+       * Default constructor.
+       */
+      private Builder() {
+         pool = new Pool();
+      }
+
+      protected abstract ParameterizedBuilderType self();
+
+      /**
+       * Provides the name for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getName()
+       */
+      public ParameterizedBuilderType name(String name) {
+         pool.name = name;
+         return self();
+      }
+
+      /**
+       * Provides the description for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getDescription()
+       */
+      public ParameterizedBuilderType description(String description) {
+         pool.description = description;
+         return self();
+      }
+
+      /**
+       * Provides the load balancing method for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getLBMethod()
+       */
+      public ParameterizedBuilderType lbMethod(String lbMethod) {
+         pool.lbMethod = lbMethod;
+         return self();
+      }
+
+      /**
+       * Provides the health monitors for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getHealthMonitors()
+       */
+      public ParameterizedBuilderType healthMonitors(ImmutableSet<String> healthMonitors) {
+         pool.healthMonitors = healthMonitors;
+         return self();
+      }
+
+      /**
+       * Provides the administrative state for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getAdminStateUp()
+       */
+      public ParameterizedBuilderType adminStateUp(Boolean adminStateUp) {
+         pool.adminStateUp = adminStateUp;
+         return self();
+      }
+   }
+
+   /**
+    * Create builder (inheriting from Builder).
+    */
+   public static class CreateBuilder extends Builder<CreateBuilder> {
+      /**
+       * Supply required properties for creating a Pool's CreateBuilder.
+       *
+       * @param subnetId the subnet id.
+       * @param protocol the protocol.
+       * @param lbMethod the load balancing method.
+       */
+      private CreateBuilder(String subnetId, Protocol protocol, String lbMethod) {
+         subnetId(subnetId).protocol(protocol).lbMethod(lbMethod);
+      }
+
+      /**
+       * Provides the tenantId for this Pool's Builder. Admin-only.
+       * When keystone is enabled, it is not mandatory to specify tenant_id for resources in create requests, as the
+       * tenant identifier will be derived from the Authentication token. Please note that the default authorization
+       * settings only allow administrative users to create resources on behalf of a different tenant.
+       *
+       * @return the Builder.
+       * @see Pool#getTenantId()
+       */
+      public CreateBuilder tenantId(String tenantId) {
+         pool.tenantId = tenantId;
+         return self();
+      }
+
+      /**
+       * Provides the subnet id for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getSubnetId()
+       */
+      public CreateBuilder subnetId(String subnetId) {
+         pool.subnetId = subnetId;
+         return self();
+      }
+
+      /**
+       * Provides the protocol for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getProtocol()
+       */
+      public CreateBuilder protocol(Protocol protocol) {
+         pool.protocol = protocol;
+         return self();
+      }
+
+      /**
+       * Provides the provider for this Pool's Builder.
+       *
+       * @return the Builder.
+       * @see Pool#getProvider()
+       */
+      public CreateBuilder provider(String provider) {
+         pool.provider = provider;
+         return self();
+      }
+
+      /**
+       * @return a CreatePool constructed with this Builder.
+       */
+      public CreatePool build() {
+         return new CreatePool(pool);
+      }
+
+      @Override
+      protected CreateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Update builder (inheriting from Builder).
+    */
+   public static class UpdateBuilder extends Builder<UpdateBuilder> {
+      /**
+       * Supply required properties for creating a Pool's UpdateBuilder.
+       */
+      private UpdateBuilder() {
+      }
+
+      /**
+       * @return a UpdatePool constructed with this Builder.
+       */
+      public UpdatePool build() {
+         return new UpdatePool(pool);
+      }
+
+      @Override
+      protected UpdateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Create options - extend the domain class, passed to API create calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class CreatePool extends Pool {
+      /**
+       * Copy constructor.
+       *
+       * @param pool the Pool to copy from.
+       */
+      private CreatePool(Pool pool) {
+         super(pool);
+      }
+   }
+
+   /**
+    * Update options - extend the domain class, passed to API update calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class UpdatePool extends Pool {
+      /**
+       * Copy constructor.
+       *
+       * @param pool the Pool to copy from.
+       */
+      private UpdatePool(Pool pool) {
+         super(pool);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/PoolStatus.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/PoolStatus.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/PoolStatus.java
new file mode 100644
index 0000000..07989e7
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/PoolStatus.java
@@ -0,0 +1,101 @@
+/*
+ * 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.lbaas.v1;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * A Neutron LBaaS v1 PoolStatus.
+ * Contains an id and status describing the pool's status.
+ *
+ * @see HealthMonitor#getPools()
+ */
+public class PoolStatus {
+
+   // Mandatory attributes
+   @Named("pool_id")
+   protected final String id;
+   protected final LBaaSStatus status;
+   // Optional attributes
+   @Named("status_description")
+   protected final String statusDescription;
+
+   @ConstructorProperties({ "pool_id", "status", "status_description" })
+   protected PoolStatus(String id, LBaaSStatus status, String statusDescription) {
+      this.id = id;
+      this.status = status;
+      this.statusDescription = statusDescription;
+   }
+
+   /**
+    * @return the id of the PoolStatus.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the status of the PoolStatus.
+    */
+   @Nullable
+   public LBaaSStatus getStatus() {
+      return status;
+   }
+
+   /**
+    * @return the status description of the PoolStatus.
+    */
+   @Nullable
+   public String getStatusDescription() {
+      return statusDescription;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, status, statusDescription);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null || getClass() != obj.getClass())
+         return false;
+      PoolStatus that = PoolStatus.class.cast(obj);
+      return Objects.equal(this.id, that.id) && Objects.equal(this.status, that.status)
+            && Objects.equal(this.statusDescription, that.statusDescription);
+   }
+
+   protected MoreObjects.ToStringHelper string() {
+      return MoreObjects.toStringHelper(this).add("id", id).add("status", status)
+            .add("statusDescription", statusDescription);
+   }
+
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pools.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pools.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pools.java
new file mode 100644
index 0000000..c30bc13
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Pools.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.lbaas.v1;
+
+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 of Neutron LBaaS v1 Pools.
+ */
+public class Pools extends PaginatedCollection<Pool> {
+   public static final Pools EMPTY = new Pools(ImmutableSet.<Pool> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({ "pools", "pools_links" })
+   protected Pools(Iterable<Pool> pools, Iterable<Link> poolsLinks) {
+      super(pools, poolsLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/ProbeType.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/ProbeType.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/ProbeType.java
new file mode 100644
index 0000000..fb5d565
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/ProbeType.java
@@ -0,0 +1,70 @@
+/*
+ * 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.lbaas.v1;
+
+/**
+ * Enumerates supported types of probe sent by health monitor to verify member state.
+ */
+public enum ProbeType {
+   /**
+    * Health monitor pings the members by using ICMP.
+    */
+   PING("PING"),
+   /**
+    * Health monitor connects to the members by using TCP.
+    */
+   TCP("TCP"),
+   /**
+    * Health monitor sends an HTTP request to the member.
+    */
+   HTTP("HTTP"),
+   /**
+    * Health monitor sends a secure HTTP request to the member.
+    */
+   HTTPS("HTTPS"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private ProbeType(String name) {
+      this.name = name;
+   }
+
+   @Override
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static ProbeType fromValue(String name){
+      if (name != null) {
+         for (ProbeType value : ProbeType.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Protocol.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Protocol.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Protocol.java
new file mode 100644
index 0000000..e353863
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/Protocol.java
@@ -0,0 +1,67 @@
+/*
+ * 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.lbaas.v1;
+
+/**
+ * Enumerates supported protocols.
+ * Protocol must be specified for the front-end (see {@link VIP}) and for the back-end instances (see {@link Pool}).
+ */
+public enum Protocol {
+   /**
+    * Use TCP for routing traffic.
+    */
+   TCP("TCP"),
+   /**
+    * Use HTTP for routing traffic.
+    */
+   HTTP("HTTP"),
+   /**
+    * Use HTTPS for routing traffic.
+    */
+   HTTPS("HTTPS"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private Protocol(String name) {
+      this.name = name;
+   }
+
+   @Override
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static Protocol fromValue(String name){
+      if (name != null) {
+         for (Protocol value : Protocol.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/50e02c8d/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/SessionPersistence.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/SessionPersistence.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/SessionPersistence.java
new file mode 100644
index 0000000..c984ac4
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/lbaas/v1/SessionPersistence.java
@@ -0,0 +1,183 @@
+/*
+ * 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.lbaas.v1;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * A Neutron LBaaS v1 SessionPersistence.
+ * Contains a type and cookie name describing the session persistence.
+ */
+public class SessionPersistence {
+
+   // Mandatory attributes
+   protected final Type type;
+   // Optional attributes
+   @Named("cookie_name")
+   protected final String cookieName;
+
+   @ConstructorProperties({ "type", "cookie_name" })
+   protected SessionPersistence(Type type, String cookieName) {
+      this.type = type;
+      this.cookieName = cookieName;
+   }
+
+   /**
+    * @return the type of the SessionPersistence.
+    */
+   @Nullable
+   public Type getType() {
+      return type;
+   }
+
+   /**
+    * @return the cookie name of the SessionPersistence.
+    */
+   @Nullable
+   public String getCookieName() {
+      return cookieName;
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(type, cookieName);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null || getClass() != obj.getClass())
+         return false;
+      SessionPersistence that = SessionPersistence.class.cast(obj);
+      return Objects.equal(this.type, that.type) && Objects.equal(this.cookieName, that.cookieName);
+   }
+
+   protected MoreObjects.ToStringHelper string() {
+      return MoreObjects.toStringHelper(this).add("type", type).add("cookieName", cookieName);
+   }
+
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
+   /*
+    * Methods to get the builder follow.
+    */
+
+   /**
+    * @return the Builder for SessionPersistence.
+    */
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   /**
+    * Builder.
+    */
+   public static class Builder {
+      protected Type type;
+      protected String cookieName;
+
+      /**
+       * Provides the type to the SessionPersistence's Builder.
+       *
+       * @return the Builder.
+       * @see SessionPersistence#getType()
+       */
+      public Builder type(Type type) {
+         this.type = type;
+         return this;
+      }
+
+      /**
+       * Provides the cookie name to the SessionPersistence's Builder.
+       *
+       * @return the Builder.
+       * @see SessionPersistence#getCookieName()
+       */
+      public Builder cookieName(String cookieName) {
+         this.cookieName = cookieName;
+         return this;
+      }
+
+      /**
+       * @return a SessionPersistence constructed with this Builder.
+       */
+      public SessionPersistence build() {
+         return new SessionPersistence(type, cookieName);
+      }
+   }
+
+   /**
+    * Enumerates supported SessionPersistence types.
+    */
+   public static enum Type {
+      /**
+       * All connections that originate from the same source IP address are handled by the same member of the pool.
+       */
+      SOURCE_IP("SOURCE_IP"),
+      /**
+       * The load balancing function creates a cookie on the first request from a client. Subsequent requests that
+       * contain the same cookie value are handled by the same member of the pool.
+       */
+      HTTP_COOKIE("HTTP_COOKIE"),
+      /**
+       * The load balancing function relies on a cookie established by the back-end application. All requests with the
+       * same cookie value are handled by the same member of the pool.
+       */
+      APP_COOKIE("APP_COOKIE"),
+      /**
+       * Used by jclouds when the service returns an unknown value other than null.
+       */
+      UNRECOGNIZED("unrecognized");
+
+      private String name;
+
+      private Type(String name) {
+         this.name = name;
+      }
+
+      @Override
+      public String toString() {
+         return name;
+      }
+
+      /*
+       * This provides GSON enum support in jclouds.
+       * */
+      public static Type fromValue(String name){
+         if (name != null) {
+            for (Type value : Type.values()) {
+               if (name.equalsIgnoreCase(value.name)) {
+                  return value;
+               }
+            }
+            return UNRECOGNIZED;
+         }
+         return null;
+      }
+   }
+}