Bug 1850 - Adding the missing update and delete connectors for LBaaS Pool and PoolMem... 44/11144/4
authorSrini Seetharaman <srini.seetharaman@gmail.com>
Sat, 13 Sep 2014 19:31:39 +0000 (12:31 -0700)
committerSrini Seetharaman <srini.seetharaman@gmail.com>
Sun, 14 Sep 2014 06:11:38 +0000 (23:11 -0700)
Also renaming the INeutronLoadBalancerPoolMemberRequest to NeutronLoadBalancerPoolMemberRequest for consistency.

Change-Id: I9fb7b051b4b7e53d5c5921e5250c9cd8661764c8
Signed-off-by: Srini Seetharaman <srini.seetharaman@gmail.com>
opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerNorthbound.java
opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMemberRequest.java [moved from opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/INeutronLoadBalancerPoolMemberRequest.java with 82% similarity]
opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMembersNorthbound.java
opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolNorthbound.java

index bb645b34eca8d759f66ada47b612d437e0ba8ef1..863b3cbdc7667874630d0be5918e9442f6d632d0 100644 (file)
@@ -188,8 +188,6 @@ public class NeutronLoadBalancerNorthbound {
             if (loadBalancerInterface.neutronLoadBalancerExists(singleton.getLoadBalancerID())) {
                 throw new BadRequestException("LoadBalancer UUID already exists");
             }
-            loadBalancerInterface.addNeutronLoadBalancer(singleton);
-
             Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerAware.class, this, null);
             if (instances != null) {
                 for (Object instance : instances) {
@@ -216,7 +214,7 @@ public class NeutronLoadBalancerNorthbound {
                 NeutronLoadBalancer test = i.next();
 
                 /*
-                 *  Verify that the firewall policy doesn't already exist
+                 *  Verify that the loadbalancer doesn't already exist
                  */
 
                 if (loadBalancerInterface.neutronLoadBalancerExists(test.getLoadBalancerID())) {
@@ -12,7 +12,7 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool
 import javax.xml.bind.annotation.XmlElement;
 import java.util.List;
 
-public class INeutronLoadBalancerPoolMemberRequest {
+public class NeutronLoadBalancerPoolMemberRequest {
 
     /**
      * See OpenStack Network API v2.0 Reference for description of
@@ -25,15 +25,15 @@ public class INeutronLoadBalancerPoolMemberRequest {
     @XmlElement(name="members")
     List<NeutronLoadBalancerPoolMember> bulkRequest;
 
-    INeutronLoadBalancerPoolMemberRequest() {
+    NeutronLoadBalancerPoolMemberRequest() {
     }
 
-    INeutronLoadBalancerPoolMemberRequest(List<NeutronLoadBalancerPoolMember> bulk) {
+    NeutronLoadBalancerPoolMemberRequest(List<NeutronLoadBalancerPoolMember> bulk) {
         bulkRequest = bulk;
         singletonLoadBalancerPoolMember = null;
     }
 
-    INeutronLoadBalancerPoolMemberRequest(NeutronLoadBalancerPoolMember group) {
+    NeutronLoadBalancerPoolMemberRequest(NeutronLoadBalancerPoolMember group) {
         singletonLoadBalancerPoolMember = group;
     }
 
index ff56fa0a9d3786eaf17cc1848d7212c8054dab58..f8f3cd8c5311f685699257c6a665ef44f6ad5d5a 100644 (file)
@@ -1,46 +1,51 @@
 /*
- * Copyright (C) 2014 Red Hat, Inc.
+ * Copyright (C) 2014 SDN Hub, LLC.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Srini Seetharaman
  */
 
 package org.opendaylight.controller.networkconfig.neutron.northbound;
 
 import org.codehaus.enunciate.jaxrs.ResponseCode;
 import org.codehaus.enunciate.jaxrs.StatusCodes;
+import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD;
 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberAware;
-import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberCRUD;
 import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces;
+import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool;
 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember;
 import org.opendaylight.controller.northbound.commons.RestMessages;
 import org.opendaylight.controller.northbound.commons.exception.BadRequestException;
+import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
 import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException;
 import org.opendaylight.controller.sal.utils.ServiceHelper;
 
 import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 
-
-@Path("/pools/{loadBalancerPoolID}/members")
+@Path("/pools/{loadBalancerPoolUUID}/members")
 public class NeutronLoadBalancerPoolMembersNorthbound {
-
     private NeutronLoadBalancerPoolMember extractFields(NeutronLoadBalancerPoolMember o, List<String> fields) {
         return o.extractFields(fields);
     }
 /**
- * Returns a list of all LoadBalancerPool
+ * Returns a list of all LoadBalancerPoolMembers in specified pool
  */
 @GET
 @Produces({MediaType.APPLICATION_JSON})
@@ -50,8 +55,12 @@ public class NeutronLoadBalancerPoolMembersNorthbound {
         @ResponseCode(code = 501, condition = "Not Implemented")})
 
 public Response listMembers(
+        //Path param
+        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+
         // return fields
         @QueryParam("fields") List<String> fields,
+
         // OpenStack LoadBalancerPool attributes
         @QueryParam("id") String queryLoadBalancerPoolMemberID,
         @QueryParam("tenant_id") String queryLoadBalancerPoolMemberTenantID,
@@ -68,20 +77,24 @@ public Response listMembers(
         @QueryParam("page_reverse") String pageReverse
         // sorting not supported
 ) {
-    INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = NeutronCRUDInterfaces
-            .getINeutronLoadBalancerPoolMemberCRUD(this);
-    if (loadBalancerPoolMemberInterface == null) {
+    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces
+            .getINeutronLoadBalancerPoolCRUD(this);
+    if (loadBalancerPoolInterface == null) {
         throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface "
                 + RestMessages.SERVICEUNAVAILABLE.toString());
     }
-    List<NeutronLoadBalancerPoolMember> allLoadBalancerPoolMembers = loadBalancerPoolMemberInterface
-            .getAllNeutronLoadBalancerPoolMembers();
+    if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+        throw new ResourceNotFoundException("loadBalancerPool UUID does not exist.");
+    }
+    List<NeutronLoadBalancerPoolMember> members =
+                loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
     List<NeutronLoadBalancerPoolMember> ans = new ArrayList<NeutronLoadBalancerPoolMember>();
-    Iterator<NeutronLoadBalancerPoolMember> i = allLoadBalancerPoolMembers.iterator();
+    Iterator<NeutronLoadBalancerPoolMember> i = members.iterator();
     while (i.hasNext()) {
         NeutronLoadBalancerPoolMember nsg = i.next();
         if ((queryLoadBalancerPoolMemberID == null ||
                 queryLoadBalancerPoolMemberID.equals(nsg.getPoolMemberID())) &&
+                loadBalancerPoolUUID.equals(nsg.getPoolID()) &&
                 (queryLoadBalancerPoolMemberTenantID == null ||
                         queryLoadBalancerPoolMemberTenantID.equals(nsg.getPoolMemberTenantID())) &&
                 (queryLoadBalancerPoolMemberAddress == null ||
@@ -102,13 +115,57 @@ public Response listMembers(
         }
     }
     return Response.status(200).entity(
-            new INeutronLoadBalancerPoolMemberRequest(ans)).build();
+            new NeutronLoadBalancerPoolMemberRequest(ans)).build();
+}
+
+/**
+ * Returns a specific LoadBalancerPoolMember
+ */
+
+@Path("{loadBalancerPoolMemberUUID}")
+@GET
+@Produces({ MediaType.APPLICATION_JSON })
+//@TypeHint(OpenStackLoadBalancerPoolMembers.class)
+@StatusCodes({
+    @ResponseCode(code = 200, condition = "Operation successful"),
+    @ResponseCode(code = 401, condition = "Unauthorized"),
+    @ResponseCode(code = 404, condition = "Not Found"),
+    @ResponseCode(code = 501, condition = "Not Implemented") })
+public Response showLoadBalancerPoolMember(
+        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+        @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
+        // return fields
+        @QueryParam("fields") List<String> fields ) {
+
+    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces
+            .getINeutronLoadBalancerPoolCRUD(this);
+    if (loadBalancerPoolInterface == null) {
+        throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface "
+                + RestMessages.SERVICEUNAVAILABLE.toString());
+    }
+    if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+        throw new ResourceNotFoundException("loadBalancerPool UUID does not exist.");
+    }
+    List<NeutronLoadBalancerPoolMember> members =
+                loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
+    for (NeutronLoadBalancerPoolMember ans: members) {
+        if (!ans.getPoolMemberID().equals(loadBalancerPoolMemberUUID))
+            continue;
+
+        if (fields.size() > 0) {
+            return Response.status(200).entity(
+                new NeutronLoadBalancerPoolMemberRequest(extractFields(ans, fields))).build();
+        } else {
+            return Response.status(200).entity(
+                new NeutronLoadBalancerPoolMemberRequest(ans)).build();
+        }
+    }
+    return Response.status(204).build();
 }
 
 /**
  * Adds a Member to an LBaaS Pool member
  */
-@Path("/pools/{loadBalancerPoolID}/members")
 @PUT
 @Produces({MediaType.APPLICATION_JSON})
 @Consumes({MediaType.APPLICATION_JSON})
@@ -117,25 +174,34 @@ public Response listMembers(
         @ResponseCode(code = 401, condition = "Unauthorized"),
         @ResponseCode(code = 404, condition = "Not Found"),
         @ResponseCode(code = 501, condition = "Not Implemented")})
-public Response createLoadBalancerPoolMember(  INeutronLoadBalancerPoolMemberRequest input) {
+public Response createLoadBalancerPoolMember(
+        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+        final NeutronLoadBalancerPoolMemberRequest input) {
 
-    INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolMemberCRUD(
-            this);
-    if (loadBalancerPoolMemberInterface == null) {
-        throw new ServiceUnavailableException("LoadBalancerPoolMember CRUD Interface "
+    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolCRUD(this);
+    if (loadBalancerPoolInterface == null) {
+        throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface "
                 + RestMessages.SERVICEUNAVAILABLE.toString());
     }
+    // Verify that the loadBalancerPool exists, for the member to be added to its cache
+    if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+        throw new ResourceNotFoundException("loadBalancerPool UUID does not exist.");
+    }
+    NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
+
     if (input.isSingleton()) {
         NeutronLoadBalancerPoolMember singleton = input.getSingleton();
+        singleton.setPoolID(loadBalancerPoolUUID);
+        String loadBalancerPoolMemberUUID = singleton.getPoolMemberID();
 
         /*
          *  Verify that the LoadBalancerPoolMember doesn't already exist.
          */
-        if (loadBalancerPoolMemberInterface.neutronLoadBalancerPoolMemberExists(
-                singleton.getPoolMemberID())) {
-            throw new BadRequestException("LoadBalancerPoolMember UUID already exists");
+        List<NeutronLoadBalancerPoolMember> members = singletonPool.getLoadBalancerPoolMembers();
+        for (NeutronLoadBalancerPoolMember member: members) {
+            if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID))
+                throw new BadRequestException("LoadBalancerPoolMember UUID already exists");
         }
-        loadBalancerPoolMemberInterface.addNeutronLoadBalancerPoolMember(singleton);
 
         Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolMemberAware.class, this, null);
         if (instances != null) {
@@ -147,13 +213,18 @@ public Response createLoadBalancerPoolMember(  INeutronLoadBalancerPoolMemberReq
                 }
             }
         }
-        loadBalancerPoolMemberInterface.addNeutronLoadBalancerPoolMember(singleton);
         if (instances != null) {
             for (Object instance : instances) {
                 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
                 service.neutronLoadBalancerPoolMemberCreated(singleton);
             }
         }
+
+        /**
+         * Add the member from the neutron load balancer pool as well
+         */
+        singletonPool.addLoadBalancerPoolMember(singleton);
+
     } else {
         List<NeutronLoadBalancerPoolMember> bulk = input.getBulk();
         Iterator<NeutronLoadBalancerPoolMember> i = bulk.iterator();
@@ -161,15 +232,17 @@ public Response createLoadBalancerPoolMember(  INeutronLoadBalancerPoolMemberReq
         Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolMemberAware.class, this, null);
         while (i.hasNext()) {
             NeutronLoadBalancerPoolMember test = i.next();
+            String loadBalancerPoolMemberUUID = test.getPoolMemberID();
 
             /*
-             *  Verify that the firewall doesn't already exist
+             *  Verify that the LoadBalancerPoolMember doesn't already exist.
              */
-
-            if (loadBalancerPoolMemberInterface.neutronLoadBalancerPoolMemberExists(
-                    test.getPoolMemberID())) {
-                throw new BadRequestException("Load Balancer PoolMember UUID already is already created");
+            List<NeutronLoadBalancerPoolMember> members = singletonPool.getLoadBalancerPoolMembers();
+            for (NeutronLoadBalancerPoolMember member: members) {
+                if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID))
+                    throw new BadRequestException("LoadBalancerPoolMember UUID already exists");
             }
+
             if (testMap.containsKey(test.getPoolMemberID())) {
                 throw new BadRequestException("Load Balancer PoolMember UUID already exists");
             }
@@ -189,15 +262,105 @@ public Response createLoadBalancerPoolMember(  INeutronLoadBalancerPoolMemberReq
         i = bulk.iterator();
         while (i.hasNext()) {
             NeutronLoadBalancerPoolMember test = i.next();
-            loadBalancerPoolMemberInterface.addNeutronLoadBalancerPoolMember(test);
             if (instances != null) {
                 for (Object instance : instances) {
                     INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
                     service.neutronLoadBalancerPoolMemberCreated(test);
                 }
             }
+            singletonPool.addLoadBalancerPoolMember(test);
         }
     }
     return Response.status(201).entity(input).build();
 }
+
+/**
+ * Updates a LB member pool
+ */
+
+@Path("{loadBalancerPoolMemberUUID}")
+@PUT
+@Produces({ MediaType.APPLICATION_JSON })
+@Consumes({ MediaType.APPLICATION_JSON })
+@StatusCodes({
+        @ResponseCode(code = 200, condition = "Operation successful"),
+        @ResponseCode(code = 400, condition = "Bad Request"),
+        @ResponseCode(code = 401, condition = "Unauthorized"),
+        @ResponseCode(code = 403, condition = "Forbidden"),
+        @ResponseCode(code = 404, condition = "Not Found"),
+        @ResponseCode(code = 501, condition = "Not Implemented") })
+public Response updateLoadBalancerPoolMember(
+        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+        @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
+        final NeutronLoadBalancerPoolMemberRequest input) {
+
+    //TODO: Implement update LB member pool
+    return Response.status(501).entity(input).build();
+}
+
+/**
+ * Deletes a LoadBalancerPoolMember
+ */
+
+@Path("{loadBalancerPoolMemberUUID}")
+@DELETE
+@StatusCodes({
+    @ResponseCode(code = 204, condition = "No Content"),
+    @ResponseCode(code = 401, condition = "Unauthorized"),
+    @ResponseCode(code = 403, condition = "Forbidden"),
+    @ResponseCode(code = 404, condition = "Not Found"),
+    @ResponseCode(code = 501, condition = "Not Implemented") })
+public Response deleteLoadBalancerPoolMember(
+        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+        @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) {
+    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolCRUD(this);
+    if (loadBalancerPoolInterface == null) {
+        throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface "
+                + RestMessages.SERVICEUNAVAILABLE.toString());
+    }
+
+    // Verify that the loadBalancerPool exists, for the member to be removed from its cache
+    if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+        throw new ResourceNotFoundException("loadBalancerPool UUID does not exist.");
+    }
+
+    //Verify that the LB pool member exists
+    NeutronLoadBalancerPoolMember singleton = null;
+    List<NeutronLoadBalancerPoolMember> members =
+            loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
+    for (NeutronLoadBalancerPoolMember member: members) {
+        if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) {
+            singleton = member;
+            break;
+        }
+    }
+    if (singleton == null)
+        throw new BadRequestException("LoadBalancerPoolMember UUID does not exist.");
+
+    Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolMemberAware.class, this, null);
+    if (instances != null) {
+        for (Object instance : instances) {
+            INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+            int status = service.canDeleteNeutronLoadBalancerPoolMember(singleton);
+            if (status < 200 || status > 299) {
+                return Response.status(status).build();
+            }
+        }
+    }
+
+    if (instances != null) {
+        for (Object instance : instances) {
+            INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+            service.neutronLoadBalancerPoolMemberDeleted(singleton);
+        }
+    }
+
+    /**
+     * Remove the member from the neutron load balancer pool
+     */
+    NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
+    singletonPool.removeLoadBalancerPoolMember(singleton);
+
+    return Response.status(204).build();
+}
 }
index fc5357ccb5f503680b5e5c5c4220118b8a86e1d0..7802dbb906287e9e18becc916aaa4ba0bb6dd5e3 100644 (file)
@@ -1,9 +1,11 @@
 /*
- * Copyright (C) 2014 Red Hat, Inc.
+ * Copyright (C) 2014 SDN Hub, LLC.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Srini Seetharaman
  */
 
 package org.opendaylight.controller.networkconfig.neutron.northbound;
@@ -13,8 +15,10 @@ import org.codehaus.enunciate.jaxrs.ResponseCode;
 import org.codehaus.enunciate.jaxrs.StatusCodes;
 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolAware;
 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD;
+import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberCRUD;
 import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces;
 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool;
+import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember;
 import org.opendaylight.controller.northbound.commons.RestMessages;
 import org.opendaylight.controller.northbound.commons.exception.BadRequestException;
 import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
@@ -22,6 +26,7 @@ import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailab
 import org.opendaylight.controller.sal.utils.ServiceHelper;
 
 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;
@@ -31,6 +36,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -53,6 +59,13 @@ import java.util.List;
  * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
  *
  */
+
+/**
+ * For now, the LB pool member data is maintained with the INeutronLoadBalancerPoolCRUD,
+ * although there may be an overlap with INeutronLoadBalancerPoolMemberCRUD's cache.
+ * TODO: Consolidate and maintain a single copy
+ */
+
 @Path("/pools")
 public class NeutronLoadBalancerPoolNorthbound {
 
@@ -83,7 +96,7 @@ public class NeutronLoadBalancerPoolNorthbound {
             @QueryParam("healthmonitor_id") String queryLoadBalancerPoolHealthMonitorID,
             @QueryParam("admin_state_up") String queryLoadBalancerIsAdminStateUp,
             @QueryParam("status") String queryLoadBalancerPoolStatus,
-            @QueryParam("members") List queryLoadBalancerPoolMembers,
+            @QueryParam("members") List<NeutronLoadBalancerPoolMember> queryLoadBalancerPoolMembers,
             // pagination
             @QueryParam("limit") String limit,
             @QueryParam("marker") String marker,
@@ -217,7 +230,7 @@ public class NeutronLoadBalancerPoolNorthbound {
                 NeutronLoadBalancerPool test = i.next();
 
                 /*
-                 *  Verify that the firewall doesn't already exist
+                 *  Verify that the loadBalancerPool doesn't already exist
                  */
 
                 if (loadBalancerPoolInterface.neutronLoadBalancerPoolExists(test.getLoadBalancerPoolID())) {
@@ -328,4 +341,73 @@ public class NeutronLoadBalancerPoolNorthbound {
         }
         return Response.status(200).entity(new NeutronLoadBalancerPoolRequest(loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID))).build();
     }
+
+    /**
+     * Deletes a LoadBalancerPool
+     */
+
+    @Path("{loadBalancerPoolUUID}")
+    @DELETE
+    @StatusCodes({
+            @ResponseCode(code = 204, condition = "No Content"),
+            @ResponseCode(code = 401, condition = "Unauthorized"),
+            @ResponseCode(code = 404, condition = "Not Found"),
+            @ResponseCode(code = 409, condition = "Conflict"),
+            @ResponseCode(code = 501, condition = "Not Implemented") })
+    public Response deleteLoadBalancerPool(
+            @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID) {
+        INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolCRUD(this);
+        if (loadBalancerPoolInterface == null) {
+            throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface "
+                    + RestMessages.SERVICEUNAVAILABLE.toString());
+        }
+
+        /*
+         * verify the LoadBalancerPool exists and it isn't currently in use
+         */
+        if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+            throw new ResourceNotFoundException("LoadBalancerPool UUID does not exist.");
+        }
+        if (loadBalancerPoolInterface.neutronLoadBalancerPoolInUse(loadBalancerPoolUUID)) {
+            return Response.status(409).build();
+        }
+        NeutronLoadBalancerPool singleton = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
+        Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolAware.class, this, null);
+        if (instances != null) {
+            for (Object instance : instances) {
+                INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
+                int status = service.canDeleteNeutronLoadBalancerPool(singleton);
+                if (status < 200 || status > 299) {
+                    return Response.status(status).build();
+                }
+            }
+        }
+
+        /*
+         * remove it and return 204 status
+         */
+        loadBalancerPoolInterface.removeNeutronLoadBalancerPool(loadBalancerPoolUUID);
+        if (instances != null) {
+            for (Object instance : instances) {
+                INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
+                service.neutronLoadBalancerPoolDeleted(singleton);
+            }
+        }
+
+        /*
+         * remove corresponding members from the member cache too
+         */
+        INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolMemberCRUD(this);
+        if (loadBalancerPoolMemberInterface != null) {
+            List<NeutronLoadBalancerPoolMember> allLoadBalancerPoolMembers = new
+                ArrayList<NeutronLoadBalancerPoolMember>(loadBalancerPoolMemberInterface.getAllNeutronLoadBalancerPoolMembers());
+            Iterator<NeutronLoadBalancerPoolMember> i = allLoadBalancerPoolMembers.iterator();
+            while (i.hasNext()) {
+                NeutronLoadBalancerPoolMember member = i.next();
+                if (member.getPoolID() == loadBalancerPoolUUID)
+                    loadBalancerPoolMemberInterface.removeNeutronLoadBalancerPoolMember(member.getPoolMemberID());
+            }
+        }
+        return Response.status(204).build();
+    }
 }