Add LBaaS CRUD cases to IT 95/25695/4
authorRyan Moats <rmoats@us.ibm.com>
Sat, 22 Aug 2015 16:59:43 +0000 (11:59 -0500)
committerRyan Moats <rmoats@us.ibm.com>
Sat, 22 Aug 2015 18:34:41 +0000 (13:34 -0500)
Side effects:
1. this patch implements Pool Member update semantics as
the first was unavailable
2. to make the PoolMembers northbound functions work properly,
it is necessary to collapse the PoolMemberNorthbound class into
the PoolNorthbound class so that they can use the same root URL.
3. Pool overwirte has been removed as it is causing issues
and will be removed anyway as part of the impending CHM removal.

Change-Id: I9c25f843465781baf343cfd6d764896567cf63cb
Signed-off-by: Ryan Moats <rmoats@us.ibm.com>
integration/test/src/test/java/org/opendaylight/neutron/e2etest/ITNeutronE2E.java
integration/test/src/test/java/org/opendaylight/neutron/e2etest/NeutronLBHealthMonitorTests.java
integration/test/src/test/java/org/opendaylight/neutron/e2etest/NeutronLBListenerTests.java
integration/test/src/test/java/org/opendaylight/neutron/e2etest/NeutronLBPoolMembersTests.java
integration/test/src/test/java/org/opendaylight/neutron/e2etest/NeutronLBPoolTests.java
integration/test/src/test/java/org/opendaylight/neutron/e2etest/NeutronLoadBalancerTests.java
northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronLoadBalancerPoolMembersNorthbound.java [deleted file]
northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronLoadBalancerPoolNorthbound.java
northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronNorthboundRSApplication.java
transcriber/src/main/java/org/opendaylight/neutron/transcriber/NeutronLoadBalancerPoolInterface.java

index 3900ee603d6b661c84d107f7eba8c0ec83b31041..0876f345403fb4d69296c606fa33c4d4f1aa5d56 100644 (file)
@@ -95,8 +95,8 @@ public class ITNeutronE2E {
         NeutronLoadBalancerTests.runTests(base);
         NeutronLBListenerTests.runTests(base);
         NeutronLBPoolTests.runTests(base);
+        NeutronLBPoolMembersTests.runTests(base);
         NeutronLBHealthMonitorTests.runTests(base);
-//  TODO: add LoadBalancerPoolMembers testing
         NeutronMeteringLabelTests.runTests(base);
         NeutronMeteringRuleTests.runTests(base);
         NeutronVPNServicesTests.runTests(base);
index df3fb099acb6af7647e9caaaa9d75b9abdfeddf5..b5816f54fe4b8e3c647c456374e80f16efc58424 100644 (file)
@@ -29,8 +29,56 @@ public class NeutronLBHealthMonitorTests {
         ITNeutronE2E.test_fetch(url, "LB Health Monitor Collection GET failed");
     }
 
+    public void singleton_lb_healthMonitor_create_test() {
+        String url = base + "/lbaas/healthmonitors";
+        String content = " { \"healthmonitor\": { \"admin_state_up\": true," +
+            "\"delay\": 1, \"expected_codes\": \"200,201,202\"," +
+            "\"http_method\": \"GET\"," +
+            "\"id\": \"0a9ac99d-0a09-4b18-8499-a0796850279a\"," +
+            "\"max_retries\": 5," +
+            "\"pools\": [ { \"id\": \"74aa2010-a59f-4d35-a436-60a6da882819\" } ]," +
+            "\"tenant_id\": \"6f3584d5754048a18e30685362b88411\"," +
+            "\"timeout\": 1, \"type\": \"HTTP\"," +
+            "\"url_path\": \"/index.html\" } }";
+        ITNeutronE2E.test_create(url, content, "Singleton LB Health Monitor Post Failed NB");
+    }
+
+    public void healthMonitor_update_test() {
+        String url = base + "/lbaas/healthmonitors/0a9ac99d-0a09-4b18-8499-a0796850279a";
+        String content = " { \"healthmonitor\": { \"admin_state_up\": false," +
+            "\"delay\": 2, \"expected_codes\": \"200\"," +
+            "\"http_method\": \"POST\"," +
+            "\"id\": \"0a9ac99d-0a09-4b18-8499-a0796850279a\"," +
+            "\"max_retries\": 2," +
+            "\"pools\": [ { \"id\": \"74aa2010-a59f-4d35-a436-60a6da882819\" } ]," +
+            "\"tenant_id\": \"6f3584d5754048a18e30685362b88411\"," +
+            "\"timeout\": 2, \"type\": \"HTTP\"," +
+            "\"url_path\": \"/page.html\" } }";
+        ITNeutronE2E.test_modify(url, content,"LB Health Monitor Put Failed");
+    }
+   
+    public void healthMonitor_element_get_test() {
+        String url = base + "/lbaas/healthmonitors/0a9ac99d-0a09-4b18-8499-a0796850279a";
+        ITNeutronE2E.test_fetch(url, true ,"LB Health Monitor Element Get Failed");
+    }
+
+    public void healthMonitor_element_negative_get_test() {
+        String url = base + "/lbaas/healthmonitors/0a9ac99d-0a09-4b18-8499-a0796850279a";
+        ITNeutronE2E.test_fetch(url, false ,"LB Health Monitor Element Negative Get Failed");
+    }
+
+    public void healthMonitor_delete_test() {
+        String url = base + "/lbaas/healthmonitors/0a9ac99d-0a09-4b18-8499-a0796850279a";
+        ITNeutronE2E.test_delete(url, "LB Health Monitor Element Delete Failed");
+    }
+
     public static void runTests(String base) {
         NeutronLBHealthMonitorTests healthMonitor_tester = new NeutronLBHealthMonitorTests(base);
         healthMonitor_tester.healthMonitor_collection_get_test();
+        healthMonitor_tester.singleton_lb_healthMonitor_create_test();
+        healthMonitor_tester.healthMonitor_update_test();
+        healthMonitor_tester.healthMonitor_element_get_test();
+        healthMonitor_tester.healthMonitor_delete_test();
+        healthMonitor_tester.healthMonitor_element_negative_get_test();
     }
 }
index 28daa42d5b7425b629a64f649c7cd5c41aa2e568..c597f839171283566ffc91ddaedef79fc2ab2119 100644 (file)
@@ -47,9 +47,44 @@ public class NeutronLBListenerTests {
         ITNeutronE2E.test_create(url, content, "Singleton LB Listener Post Failed NB");
     }
 
+    public void listener_update_test() {
+        String url = base + "/lbaas/listeners/39de4d56-d663-46e5-85a1-5b9d5fa17829";
+        String content = " { \"listener\": { \"admin_state_up\": false," +
+            "\"connection_limit\": 200," +
+            "\"default_pool_id\": null," +
+            "\"description\": \"listener two\"," +
+            "\"id\": \"39de4d56-d663-46e5-85a1-5b9d5fa17829\"," +
+            "\"loadbalancers\": [ {" +
+                    "\"id\": \"a36c20d0-18e9-42ce-88fd-82a35977ee8c\" } ]," +
+            "\"name\": \"listener2\"," +
+            "\"protocol\": \"HTTP\"," +
+            "\"protocol_port\": 80," +
+            "\"tenant_id\": \"1a3e005cf9ce40308c900bcb08e5320c\" } }";
+        ITNeutronE2E.test_modify(url, content,"LB Listener Put Failed");
+    }
+   
+    public void listener_element_get_test() {
+        String url = base + "/lbaas/listeners/39de4d56-d663-46e5-85a1-5b9d5fa17829";
+        ITNeutronE2E.test_fetch(url, true ,"LB Listener Element Get Failed");
+    }
+
+    public void listener_element_negative_get_test() {
+        String url = base + "/lbaas/listeners/39de4d56-d663-46e5-85a1-5b9d5fa17829";
+        ITNeutronE2E.test_fetch(url, false ,"LB Listener Element Negative Get Failed");
+    }
+
+    public void listener_delete_test() {
+        String url = base + "/lbaas/listeners/39de4d56-d663-46e5-85a1-5b9d5fa17829";
+        ITNeutronE2E.test_delete(url, "LB Listener Element Delete Failed");
+    }
+
     public static void runTests(String base) {
         NeutronLBListenerTests listener_tester = new NeutronLBListenerTests(base);
         listener_tester.listener_collection_get_test();
         listener_tester.singleton_lb_listener_create_test();
+        listener_tester.listener_update_test();
+        listener_tester.listener_element_get_test();
+        listener_tester.listener_delete_test();
+        listener_tester.listener_element_negative_get_test();
     }
 }
index 05af34b66f474878614fa848906cb01ebbaf1145..b2eb7c04997dae3738067033c6ebcab8eca8f1b9 100644 (file)
@@ -24,17 +24,58 @@ public class NeutronLBPoolMembersTests {
         this.base = base;
     }
 
-// TODO: have to be careful here as the pool id is included
-
-/*    public void pool_collection_get_test() {
-        String url_s = base + "/pools";
-        try {
-            URL url = new URL(url_s);
-            HttpURLConnection httpConn = ITNeutronE2E.HttpURLConnectionFactoryGet(url);
-            Assert.assertEquals("LB Pool Collection GET failed",
-                        200, httpConn.getResponseCode());
-        } catch (Exception e) {
-            Assert.assertFalse("E2E Tests Failed", true);
-        }
-    } */
+    public void pool_member_collection_get_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe/members";
+        ITNeutronE2E.test_fetch(url, "LB Pool Member Collection GET failed");
+    }
+
+    //TODO handle SB check
+    public void singleton_lb_pool_member_create_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe/members";
+        String content = " { \"member\": { \"address\": \"10.0.0.8\"," +
+            "\"admin_state_up\": true," +
+            "\"id\": \"9a7aff27-fd41-4ec1-ba4c-3eb92c629313\"," +
+            "\"protocol_port\": 80," +
+            "\"subnet_id\": \"013d3059-87a4-45a5-91e9-d721068ae0b2\"," +
+            "\"tenant_id\": \"1a3e005cf9ce40308c900bcb08e5320c\"," +
+            "\"weight\": 1 } }";
+        ITNeutronE2E.test_create(url, content, "Singleton LB Pool Member Post Failed NB");
+    }
+
+    public void pool_member_update_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe/members/9a7aff27-fd41-4ec1-ba4c-3eb92c629313";
+        String content = " { \"member\": { \"address\": \"10.0.0.8\"," +
+            "\"admin_state_up\": false," +
+            "\"id\": \"9a7aff27-fd41-4ec1-ba4c-3eb92c629313\"," +
+            "\"protocol_port\": 80," +
+            "\"subnet_id\": \"013d3059-87a4-45a5-91e9-d721068ae0b2\"," +
+            "\"tenant_id\": \"1a3e005cf9ce40308c900bcb08e5320c\"," +
+            "\"weight\": 5 } }";
+        ITNeutronE2E.test_modify(url, content,"LB Pool Member Put Failed");
+    }
+   
+    public void pool_member_element_get_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe/members/9a7aff27-fd41-4ec1-ba4c-3eb92c629313";
+        ITNeutronE2E.test_fetch(url, true ,"LB Pool Member Element Get Failed");
+    }
+
+    public void pool_member_element_negative_get_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe/members/9a7aff27-fd41-4ec1-ba4c-3eb92c629313";
+        ITNeutronE2E.test_fetch(url, false ,"LB Pool Member Element Negative Get Failed");
+    }
+
+    public void pool_member_delete_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe/members/9a7aff27-fd41-4ec1-ba4c-3eb92c629313";
+        ITNeutronE2E.test_delete(url, "LB Pool Member Element Delete Failed");
+    }
+
+    public static void runTests(String base) {
+        NeutronLBPoolMembersTests pool_member_tester = new NeutronLBPoolMembersTests(base);
+        pool_member_tester.pool_member_collection_get_test();
+        pool_member_tester.singleton_lb_pool_member_create_test();
+        pool_member_tester.pool_member_update_test();
+        pool_member_tester.pool_member_element_get_test();
+        pool_member_tester.pool_member_delete_test();
+        pool_member_tester.pool_member_element_negative_get_test();
+    }
 }
index ce2ea2cf35607999648aee1c296c9d19c8caebce..d2cffadcec495fbf67785429644b4c52680818a7 100644 (file)
@@ -50,9 +50,48 @@ public class NeutronLBPoolTests {
         ITNeutronE2E.test_create(url, content, "Singleton LB Pool Post Failed NB");
     }
 
+    public void pool_update_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe";
+        String content = " { \"pool\": { \"admin_state_up\": false," +
+            "\"description\": \"pool two\"," +
+            "\"healthmonitor_id\": null," +
+            "\"id\": \"12ff63af-4127-4074-a251-bcb2ecc53ebe\"," +
+            "\"lb_algorithm\": \"LEAST_CONNECTIONS\"," +
+            "\"listeners\": [ {" +
+                    "\"id\": \"39de4d56-d663-46e5-85a1-5b9d5fa17829\" } ]," +
+            "\"members\": []," +
+            "\"name\": \"pool2\"," +
+            "\"protocol\": \"HTTP\"," +
+            "\"session_persistence\": { \"cookie_name\": null," +
+                "\"type\": \"HTTP_COOKIE\" }," +
+            "\"tenant_id\": \"1a3e005cf9ce40308c900bcb08e5320c\" } }";
+        ITNeutronE2E.test_modify(url, content,"LB Pool Put Failed");
+    }
+   
+    public void pool_element_get_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe";
+        ITNeutronE2E.test_fetch(url, true ,"LB Pool Element Get Failed");
+    }
+
+    public void pool_element_negative_get_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe";
+        ITNeutronE2E.test_fetch(url, false ,"LB Pool Element Negative Get Failed");
+    }
+
+    public void pool_delete_test() {
+        String url = base + "/lbaas/pools/12ff63af-4127-4074-a251-bcb2ecc53ebe";
+        ITNeutronE2E.test_delete(url, "LB Pool Element Delete Failed");
+    }
+
     public static void runTests(String base) {
         NeutronLBPoolTests pool_tester = new NeutronLBPoolTests(base);
         pool_tester.pool_collection_get_test();
         pool_tester.singleton_lb_pool_create_test();
+        pool_tester.pool_update_test();
+        pool_tester.pool_element_get_test();
+        pool_tester.pool_delete_test();
+        pool_tester.pool_element_negative_get_test();
+        // needed for pool member testing
+        pool_tester.singleton_lb_pool_create_test();
     }
 }
index c9661aa74ce1c2de6c7916e617217a4c34aa977d..6f24f70bccd1faaa3fb1ab487eede942cf7f14da 100644 (file)
@@ -46,9 +46,43 @@ public class NeutronLoadBalancerTests {
         ITNeutronE2E.test_create(url, content, "Singleton Load Balancer Post Failed NB");
     }
 
+    public void loadBalancer_update_test() {
+        String url = base + "/lbaas/loadbalancers/a36c20d0-18e9-42ce-88fd-82a35977ee8c";
+        String content = " { \"loadbalancer\": { \"admin_state_up\": false," +
+            "\"description\": \"simple lb2\"," +
+            "\"id\": \"a36c20d0-18e9-42ce-88fd-82a35977ee8c\"," +
+            "\"listeners\": []," +
+            "\"name\": \"loadbalancer2\"," +
+            "\"operating_status\": \"ONLINE\"," +
+            "\"provisioning_status\": \"PENDING_UPDATE\"," +
+            "\"tenant_id\": \"b7c1a69e88bf4b21a8148f787aef2081\"," +
+            "\"vip_address\": \"10.0.0.4\"," +
+            "\"vip_subnet_id\": \"013d3059-87a4-45a5-91e9-d721068ae0b2\" } }";
+        ITNeutronE2E.test_modify(url, content,"Load Balancer Put Failed");
+    }
+   
+    public void loadBalancer_element_get_test() {
+        String url = base + "/lbaas/loadbalancers/a36c20d0-18e9-42ce-88fd-82a35977ee8c";
+        ITNeutronE2E.test_fetch(url, true ,"Load Balancer Element Get Failed");
+    }
+
+    public void loadBalancer_element_negative_get_test() {
+        String url = base + "/lbaas/loadbalancers/a36c20d0-18e9-42ce-88fd-82a35977ee8c";
+        ITNeutronE2E.test_fetch(url, false ,"Load Balancer Element Negative Get Failed");
+    }
+
+    public void loadBalancer_delete_test() {
+        String url = base + "/lbaas/loadbalancers/a36c20d0-18e9-42ce-88fd-82a35977ee8c";
+        ITNeutronE2E.test_delete(url, "Load Balancer Element Delete Failed");
+    }
+
     public static void runTests(String base) {
         NeutronLoadBalancerTests loadBalancer_tester = new NeutronLoadBalancerTests(base);
         loadBalancer_tester.loadBalancer_collection_get_test();
         loadBalancer_tester.singleton_loadbalancer_create_test();
+        loadBalancer_tester.loadBalancer_update_test();
+        loadBalancer_tester.loadBalancer_element_get_test();
+        loadBalancer_tester.loadBalancer_delete_test();
+        loadBalancer_tester.loadBalancer_element_negative_get_test();
     }
 }
diff --git a/northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronLoadBalancerPoolMembersNorthbound.java b/northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronLoadBalancerPoolMembersNorthbound.java
deleted file mode 100644 (file)
index 9653121..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (c) 2014, 2015 SDN Hub, LLC. and others.  All rights reserved.
- *
- * 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
- */
-
-package org.opendaylight.neutron.northbound.api;
-
-import java.net.HttpURLConnection;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.codehaus.enunciate.jaxrs.ResponseCode;
-import org.codehaus.enunciate.jaxrs.StatusCodes;
-import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
-import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberAware;
-import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
-import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
-import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
-
-@Path("/lbaas/pools/{loadBalancerPoolUUID}/members")
-public class NeutronLoadBalancerPoolMembersNorthbound {
-    private static final int HTTP_OK_BOTTOM = 200;
-    private static final int HTTP_OK_TOP = 299;
-    private static final String INTERFACE_NAME = "LoadBalancerPool CRUD Interface";
-    private static final String UUID_NO_EXIST = "LoadBalancerPool UUID does not exist.";
-    private static final String NO_PROVIDERS = "No providers registered.  Please try again later";
-    private static final String NO_PROVIDER_LIST = "Couldn't get providers list.  Please try again later";
-
-    private NeutronLoadBalancerPoolMember extractFields(NeutronLoadBalancerPoolMember o, List<String> fields) {
-        return o.extractFields(fields);
-    }
-
-    private NeutronCRUDInterfaces getNeutronInterfaces() {
-        NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronLoadBalancerPoolCRUD(this);
-        if (answer.getLoadBalancerPoolInterface() == null) {
-            throw new ServiceUnavailableException(INTERFACE_NAME
-                + RestMessages.SERVICEUNAVAILABLE.toString());
-        }
-        return answer;
-    }
-
-/**
- * Returns a list of all LoadBalancerPoolMembers in specified pool
- */
-@GET
-@Produces({MediaType.APPLICATION_JSON})
-@StatusCodes({
-        @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
-        @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
-        @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
-        @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
-
-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,
-        @QueryParam("address") String queryLoadBalancerPoolMemberAddress,
-        @QueryParam("protocol_port") String queryLoadBalancerPoolMemberProtoPort,
-        @QueryParam("admin_state_up") String queryLoadBalancerPoolMemberAdminStateUp,
-        @QueryParam("weight") String queryLoadBalancerPoolMemberWeight,
-        @QueryParam("subnet_id") String queryLoadBalancerPoolMemberSubnetID,
-
-        // pagination
-        @QueryParam("limit") String limit,
-        @QueryParam("marker") String marker,
-        @QueryParam("page_reverse") String pageReverse
-        // sorting not supported
-) {
-    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
-    if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
-        throw new ResourceNotFoundException(UUID_NO_EXIST);
-    }
-    List<NeutronLoadBalancerPoolMember> members =
-                loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
-    List<NeutronLoadBalancerPoolMember> ans = new ArrayList<NeutronLoadBalancerPoolMember>();
-    Iterator<NeutronLoadBalancerPoolMember> i = members.iterator();
-    while (i.hasNext()) {
-        NeutronLoadBalancerPoolMember nsg = i.next();
-        if ((queryLoadBalancerPoolMemberID == null ||
-                queryLoadBalancerPoolMemberID.equals(nsg.getID())) &&
-                loadBalancerPoolUUID.equals(nsg.getPoolID()) &&
-                (queryLoadBalancerPoolMemberTenantID == null ||
-                        queryLoadBalancerPoolMemberTenantID.equals(nsg.getPoolMemberTenantID())) &&
-                (queryLoadBalancerPoolMemberAddress == null ||
-                        queryLoadBalancerPoolMemberAddress.equals(nsg.getPoolMemberAddress())) &&
-                (queryLoadBalancerPoolMemberAdminStateUp == null ||
-                        queryLoadBalancerPoolMemberAdminStateUp.equals(nsg.getPoolMemberAdminStateIsUp())) &&
-                (queryLoadBalancerPoolMemberWeight == null ||
-                        queryLoadBalancerPoolMemberWeight.equals(nsg.getPoolMemberWeight())) &&
-                (queryLoadBalancerPoolMemberSubnetID == null ||
-                        queryLoadBalancerPoolMemberSubnetID.equals(nsg.getPoolMemberSubnetID()))) {
-            if (fields.size() > 0) {
-                ans.add(extractFields(nsg, fields));
-            } else {
-                ans.add(nsg);
-            }
-        }
-    }
-    return Response.status(HttpURLConnection.HTTP_OK).entity(
-            new NeutronLoadBalancerPoolMemberRequest(ans)).build();
-}
-
-/**
- * Returns a specific LoadBalancerPoolMember
- */
-
-@Path("{loadBalancerPoolMemberUUID}")
-@GET
-@Produces({ MediaType.APPLICATION_JSON })
-//@TypeHint(OpenStackLoadBalancerPoolMembers.class)
-@StatusCodes({
-    @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
-    @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
-    @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
-    @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
-    @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
-public Response showLoadBalancerPoolMember(
-        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
-        @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
-        // return fields
-        @QueryParam("fields") List<String> fields ) {
-
-    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
-    if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
-        throw new ResourceNotFoundException(UUID_NO_EXIST);
-    }
-    List<NeutronLoadBalancerPoolMember> members =
-                loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
-    for (NeutronLoadBalancerPoolMember ans: members) {
-        if (!ans.getID().equals(loadBalancerPoolMemberUUID)) {
-            continue;
-        }
-
-        if (fields.size() > 0) {
-            return Response.status(HttpURLConnection.HTTP_OK).entity(
-                new NeutronLoadBalancerPoolMemberRequest(extractFields(ans, fields))).build();
-        } else {
-            return Response.status(HttpURLConnection.HTTP_OK).entity(
-                new NeutronLoadBalancerPoolMemberRequest(ans)).build();
-        }
-    }
-    return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();
-}
-
-/**
- * Adds a Member to an LBaaS Pool member
- */
-@POST
-@Produces({MediaType.APPLICATION_JSON})
-@Consumes({MediaType.APPLICATION_JSON})
-@StatusCodes({
-        @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
-        @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
-public Response createLoadBalancerPoolMember(
-        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
-        final NeutronLoadBalancerPoolMemberRequest input) {
-
-    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
-    NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
-
-    if (input.isSingleton()) {
-        NeutronLoadBalancerPoolMember singleton = input.getSingleton();
-        singleton.setPoolID(loadBalancerPoolUUID);
-
-        Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
-        if (instances != null) {
-            if (instances.length > 0) {
-                for (Object instance : instances) {
-                    INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
-                    int status = service.canCreateNeutronLoadBalancerPoolMember(singleton);
-                    if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
-                        return Response.status(status).build();
-                    }
-                }
-            } else {
-                throw new ServiceUnavailableException(NO_PROVIDERS);
-            }
-        } else {
-            throw new ServiceUnavailableException(NO_PROVIDER_LIST);
-        }
-
-        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 {
-        Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
-        for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
-
-            if (instances != null) {
-                if (instances.length > 0) {
-                    for (Object instance : instances) {
-                        INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
-                        int status = service.canCreateNeutronLoadBalancerPoolMember(test);
-                        if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
-                            return Response.status(status).build();
-                        }
-                    }
-                } else {
-                    throw new ServiceUnavailableException(NO_PROVIDERS);
-                }
-            } else {
-                throw new ServiceUnavailableException(NO_PROVIDER_LIST);
-            }
-        }
-        /*
-         * now, each element of the bulk request can be added to the cache
-         */
-        for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
-            if (instances != null) {
-                for (Object instance : instances) {
-                    INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
-                    service.neutronLoadBalancerPoolMemberCreated(test);
-                }
-            }
-            singletonPool.addLoadBalancerPoolMember(test);
-        }
-    }
-    return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
-}
-
-/**
- * Updates a LB member pool
- */
-
-@Path("{loadBalancerPoolMemberUUID}")
-@PUT
-@Produces({ MediaType.APPLICATION_JSON })
-@Consumes({ MediaType.APPLICATION_JSON })
-@StatusCodes({
-        @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
-        @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, 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(HttpURLConnection.HTTP_NOT_IMPLEMENTED).entity(input).build();
-}
-
-/**
- * Deletes a LoadBalancerPoolMember
- */
-
-@Path("{loadBalancerPoolMemberUUID}")
-@DELETE
-@StatusCodes({
-    @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
-    @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
-public Response deleteLoadBalancerPoolMember(
-        @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
-        @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) {
-    INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
-
-    //Verify that the LB pool member exists
-    NeutronLoadBalancerPoolMember singleton = null;
-    List<NeutronLoadBalancerPoolMember> members =
-            loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
-    for (NeutronLoadBalancerPoolMember member: members) {
-        if (member.getID().equals(loadBalancerPoolMemberUUID)) {
-            singleton = member;
-            break;
-        }
-    }
-    if (singleton == null) {
-        throw new BadRequestException("LoadBalancerPoolMember UUID does not exist.");
-    }
-
-    Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
-    if (instances != null) {
-        if (instances.length > 0) {
-            for (Object instance : instances) {
-                INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
-                int status = service.canDeleteNeutronLoadBalancerPoolMember(singleton);
-                if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
-                    return Response.status(status).build();
-                }
-            }
-        } else {
-            throw new ServiceUnavailableException(NO_PROVIDERS);
-        }
-    } else {
-        throw new ServiceUnavailableException(NO_PROVIDER_LIST);
-    }
-
-    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(HttpURLConnection.HTTP_NO_CONTENT).build();
-}
-}
index a9b1a165d8f5a901097845a4b07dc01ef7f5fad9..9256ca0b7b61fdbb8a25fbba529348b671a589ef 100644 (file)
@@ -30,6 +30,8 @@ import org.codehaus.enunciate.jaxrs.ResponseCode;
 import org.codehaus.enunciate.jaxrs.StatusCodes;
 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolAware;
 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
+import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberAware;
+import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberCRUD;
 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
@@ -72,14 +74,21 @@ public class NeutronLoadBalancerPoolNorthbound {
     }
 
     private NeutronCRUDInterfaces getNeutronInterfaces() {
-        NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronLoadBalancerPoolCRUD(this);
+        NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().
+            fetchINeutronLoadBalancerPoolCRUD(this).
+            fetchINeutronLoadBalancerPoolMemberCRUD(this);
         if (answer.getLoadBalancerPoolInterface() == null) {
             throw new ServiceUnavailableException(INTERFACE_NAME
                     + RestMessages.SERVICEUNAVAILABLE.toString());
         }
+        if (answer.getLoadBalancerPoolMemberInterface() == null) {
+            throw new ServiceUnavailableException(INTERFACE_NAME
+                + RestMessages.SERVICEUNAVAILABLE.toString());
+        }
         return answer;
     }
 
+
     /**
      * Returns a list of all LoadBalancerPool
      * */
@@ -335,4 +344,311 @@ public class NeutronLoadBalancerPoolNorthbound {
         }
         return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();
     }
+
+    private NeutronLoadBalancerPoolMember extractFields(NeutronLoadBalancerPoolMember o, List<String> fields) {
+        return o.extractFields(fields);
+    }
+
+    /**
+     * Returns a list of all LoadBalancerPoolMembers in specified pool
+     */
+    @Path("{loadBalancerPoolUUID}/members")
+    @GET
+    @Produces({MediaType.APPLICATION_JSON})
+    @StatusCodes({
+            @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
+            @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
+            @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
+    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,
+            @QueryParam("address") String queryLoadBalancerPoolMemberAddress,
+            @QueryParam("protocol_port") String queryLoadBalancerPoolMemberProtoPort,
+            @QueryParam("admin_state_up") String queryLoadBalancerPoolMemberAdminStateUp,
+            @QueryParam("weight") String queryLoadBalancerPoolMemberWeight,
+            @QueryParam("subnet_id") String queryLoadBalancerPoolMemberSubnetID,
+
+            // pagination
+            @QueryParam("limit") String limit,
+            @QueryParam("marker") String marker,
+            @QueryParam("page_reverse") String pageReverse
+            // sorting not supported
+    ) {
+        INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
+        if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+            throw new ResourceNotFoundException(UUID_NO_EXIST);
+        }
+        List<NeutronLoadBalancerPoolMember> members =
+                    loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
+        List<NeutronLoadBalancerPoolMember> ans = new ArrayList<NeutronLoadBalancerPoolMember>();
+        Iterator<NeutronLoadBalancerPoolMember> i = members.iterator();
+        while (i.hasNext()) {
+            NeutronLoadBalancerPoolMember nsg = i.next();
+            if ((queryLoadBalancerPoolMemberID == null ||
+                queryLoadBalancerPoolMemberID.equals(nsg.getID())) &&
+                loadBalancerPoolUUID.equals(nsg.getPoolID()) &&
+                (queryLoadBalancerPoolMemberTenantID == null ||
+                        queryLoadBalancerPoolMemberTenantID.equals(nsg.getPoolMemberTenantID())) &&
+                (queryLoadBalancerPoolMemberAddress == null ||
+                        queryLoadBalancerPoolMemberAddress.equals(nsg.getPoolMemberAddress())) &&
+                (queryLoadBalancerPoolMemberAdminStateUp == null ||
+                        queryLoadBalancerPoolMemberAdminStateUp.equals(nsg.getPoolMemberAdminStateIsUp())) &&
+                (queryLoadBalancerPoolMemberWeight == null ||
+                        queryLoadBalancerPoolMemberWeight.equals(nsg.getPoolMemberWeight())) &&
+                (queryLoadBalancerPoolMemberSubnetID == null ||
+                        queryLoadBalancerPoolMemberSubnetID.equals(nsg.getPoolMemberSubnetID()))) {
+                if (fields.size() > 0) {
+                    ans.add(extractFields(nsg, fields));
+                } else {
+                    ans.add(nsg);
+                }
+            }
+        }
+        return Response.status(HttpURLConnection.HTTP_OK).entity(
+                new NeutronLoadBalancerPoolMemberRequest(ans)).build();
+    }
+
+    /**
+     * Returns a specific LoadBalancerPoolMember
+     */
+    @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
+    @GET
+    @Produces({ MediaType.APPLICATION_JSON })
+    //@TypeHint(OpenStackLoadBalancerPoolMembers.class)
+    @StatusCodes({
+        @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
+        @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
+        @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
+        @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
+    public Response showLoadBalancerPoolMember(
+            @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+            @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
+            // return fields
+            @QueryParam("fields") List<String> fields ) {
+
+        INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
+        if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
+            throw new ResourceNotFoundException(UUID_NO_EXIST);
+        }
+        List<NeutronLoadBalancerPoolMember> members =
+                    loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
+        for (NeutronLoadBalancerPoolMember ans: members) {
+            if (!ans.getID().equals(loadBalancerPoolMemberUUID)) {
+                continue;
+            }
+
+            if (fields.size() > 0) {
+                return Response.status(HttpURLConnection.HTTP_OK).entity(
+                    new NeutronLoadBalancerPoolMemberRequest(extractFields(ans, fields))).build();
+            } else {
+                return Response.status(HttpURLConnection.HTTP_OK).entity(
+                    new NeutronLoadBalancerPoolMemberRequest(ans)).build();
+            }
+        }
+        throw new ResourceNotFoundException(UUID_NO_EXIST);
+    }
+
+    /**
+     * Adds a Member to an LBaaS Pool member
+     */
+    @Path("{loadBalancerPoolUUID}/members")
+    @POST
+    @Produces({MediaType.APPLICATION_JSON})
+    @Consumes({MediaType.APPLICATION_JSON})
+    @StatusCodes({
+            @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
+            @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
+    public Response createLoadBalancerPoolMember(
+            @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+            final NeutronLoadBalancerPoolMemberRequest input) {
+
+        INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
+        NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
+
+        if (input.isSingleton()) {
+            NeutronLoadBalancerPoolMember singleton = input.getSingleton();
+            singleton.setPoolID(loadBalancerPoolUUID);
+
+            Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
+            if (instances != null) {
+                if (instances.length > 0) {
+                    for (Object instance : instances) {
+                        INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+                        int status = service.canCreateNeutronLoadBalancerPoolMember(singleton);
+                        if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
+                            return Response.status(status).build();
+                        }
+                    }
+                } else {
+                    throw new ServiceUnavailableException(NO_PROVIDERS);
+                }
+            } else {
+                throw new ServiceUnavailableException(NO_PROVIDER_LIST);
+            }
+
+            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 {
+            Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
+            for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
+
+                if (instances != null) {
+                    if (instances.length > 0) {
+                        for (Object instance : instances) {
+                            INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+                            int status = service.canCreateNeutronLoadBalancerPoolMember(test);
+                            if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
+                                return Response.status(status).build();
+                            }
+                        }
+                    } else {
+                        throw new ServiceUnavailableException(NO_PROVIDERS);
+                    }
+                } else {
+                    throw new ServiceUnavailableException(NO_PROVIDER_LIST);
+                }
+            }
+            /*
+             * now, each element of the bulk request can be added to the cache
+             */
+            for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
+                if (instances != null) {
+                    for (Object instance : instances) {
+                        INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+                        service.neutronLoadBalancerPoolMemberCreated(test);
+                    }
+                }
+                singletonPool.addLoadBalancerPoolMember(test);
+            }
+        }
+        return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
+    }
+
+    /**
+     * Updates a LB member pool
+     */
+
+    @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
+    @PUT
+    @Produces({ MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @StatusCodes({
+            @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful") })
+    public Response updateLoadBalancerPoolMember(
+            @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+            @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
+            final NeutronLoadBalancerPoolMemberRequest input) {
+        INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
+        INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = getNeutronInterfaces().getLoadBalancerPoolMemberInterface();
+        NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
+
+        NeutronLoadBalancerPoolMember singleton = input.getSingleton();
+        singleton.setPoolID(loadBalancerPoolUUID);
+        NeutronLoadBalancerPoolMember original = loadBalancerPoolMemberInterface.getNeutronLoadBalancerPoolMember(loadBalancerPoolMemberUUID);
+
+        Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
+        if (instances != null) {
+            if (instances.length > 0) {
+                for (Object instance : instances) {
+                    INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+                    int status = service.canUpdateNeutronLoadBalancerPoolMember(singleton, original);
+                    if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
+                        return Response.status(status).build();
+                    }
+                }
+            } else {
+                throw new ServiceUnavailableException(NO_PROVIDERS);
+            }
+        } else {
+            throw new ServiceUnavailableException(NO_PROVIDER_LIST);
+        }
+
+        loadBalancerPoolMemberInterface.updateNeutronLoadBalancerPoolMember(loadBalancerPoolMemberUUID, singleton);
+
+        if (instances != null) {
+            for (Object instance : instances) {
+                INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+                service.neutronLoadBalancerPoolMemberUpdated(singleton);
+            }
+        }
+        return Response.status(HttpURLConnection.HTTP_OK).entity(input).build();
+    }
+
+    /**
+     * Deletes a LoadBalancerPoolMember
+     */
+
+    @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
+    @DELETE
+    @StatusCodes({
+        @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
+        @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
+    public Response deleteLoadBalancerPoolMember(
+            @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
+            @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) {
+        INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
+
+        //Verify that the LB pool member exists
+        NeutronLoadBalancerPoolMember singleton = null;
+        List<NeutronLoadBalancerPoolMember> members =
+                loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
+        for (NeutronLoadBalancerPoolMember member: members) {
+            if (member.getID().equals(loadBalancerPoolMemberUUID)) {
+                singleton = member;
+                break;
+            }
+        }
+        if (singleton == null) {
+            throw new BadRequestException("LoadBalancerPoolMember UUID does not exist.");
+        }
+
+        Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
+        if (instances != null) {
+            if (instances.length > 0) {
+                for (Object instance : instances) {
+                    INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
+                    int status = service.canDeleteNeutronLoadBalancerPoolMember(singleton);
+                    if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
+                        return Response.status(status).build();
+                    }
+                }
+            } else {
+                throw new ServiceUnavailableException(NO_PROVIDERS);
+            }
+        } else {
+            throw new ServiceUnavailableException(NO_PROVIDER_LIST);
+        }
+
+        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(HttpURLConnection.HTTP_NO_CONTENT).build();
+    }
 }
index 1da23976ed19d4e54b423d162c8cdf28e63c9c42..c11ec7e070489d9b99a7dfef96b718e840b50955 100644 (file)
@@ -44,7 +44,6 @@ public class NeutronNorthboundRSApplication extends Application {
         classes.add(NeutronLoadBalancerListenerNorthbound.class);
         classes.add(NeutronLoadBalancerPoolNorthbound.class);
         classes.add(NeutronLoadBalancerHealthMonitorNorthbound.class);
-        classes.add(NeutronLoadBalancerPoolMembersNorthbound.class);
         classes.add(NeutronMeteringLabelsNorthbound.class);
         classes.add(NeutronMeteringLabelRulesNorthbound.class);
         classes.add(NeutronVPNServicesNorthbound.class);
index 435eb131d1cd72e83472fd8c9589b4502f4e6324..089d6b12a3d6b5ee549584afbc3ac3e960a4aa02 100644 (file)
@@ -98,7 +98,6 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
             return false;
         }
         loadBalancerPoolDB.remove(uuid);
-        //TODO: add code to find INeutronLoadBalancerPoolAware services and call newtorkDeleted on them
         return true;
     }
 
@@ -107,8 +106,8 @@ public class NeutronLoadBalancerPoolInterface extends AbstractNeutronInterface<P
         if (!neutronLoadBalancerPoolExists(uuid)) {
             return false;
         }
-        NeutronLoadBalancerPool target = loadBalancerPoolDB.get(uuid);
-        return overwrite(target, delta);
+        loadBalancerPoolDB.putIfAbsent(uuid, delta);
+        return true;
     }
 
     @Override