2 * Copyright (c) 2014, 2015 SDN Hub, LLC. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.neutron.northbound.api;
11 import java.net.HttpURLConnection;
13 import java.util.ArrayList;
14 import java.util.Iterator;
15 import java.util.List;
17 import javax.ws.rs.Consumes;
18 import javax.ws.rs.DELETE;
19 import javax.ws.rs.GET;
20 import javax.ws.rs.POST;
21 import javax.ws.rs.PUT;
22 import javax.ws.rs.Path;
23 import javax.ws.rs.PathParam;
24 import javax.ws.rs.Produces;
25 import javax.ws.rs.QueryParam;
26 import javax.ws.rs.core.MediaType;
27 import javax.ws.rs.core.Response;
29 import org.codehaus.enunciate.jaxrs.ResponseCode;
30 import org.codehaus.enunciate.jaxrs.StatusCodes;
31 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolAware;
32 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
33 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberAware;
34 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
35 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
36 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
39 * Neutron Northbound REST APIs for LoadBalancerPool Policies.<br>
40 * This class provides REST APIs for managing neutron LoadBalancerPool Policies
44 * Authentication scheme : <b>HTTP Basic</b><br>
45 * Authentication realm : <b>opendaylight</b><br>
46 * Transport : <b>HTTP and HTTPS</b><br>
48 * HTTPS Authentication is disabled by default. Administrator can enable it in
49 * tomcat-server.xml after adding a proper keystore / SSL certificate from a
50 * trusted authority.<br>
52 * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
57 * For now, the LB pool member data is maintained with the INeutronLoadBalancerPoolCRUD,
58 * and not duplicated within the INeutronLoadBalancerPoolMemberCRUD's cache.
62 public class NeutronLoadBalancerPoolNorthbound extends AbstractNeutronNorthbound {
64 private static final String RESOURCE_NAME = "LoadBalancerPool";
66 private NeutronLoadBalancerPool extractFields(NeutronLoadBalancerPool o, List<String> fields) {
67 return o.extractFields(fields);
70 private NeutronCRUDInterfaces getNeutronInterfaces() {
71 NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().
72 fetchINeutronLoadBalancerPoolCRUD(this);
73 if (answer.getLoadBalancerPoolInterface() == null) {
74 throw new ServiceUnavailableException(serviceUnavailable(RESOURCE_NAME));
81 * Returns a list of all LoadBalancerPool
84 @Produces({ MediaType.APPLICATION_JSON })
86 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
87 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
88 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
89 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
91 public Response listGroups(
93 @QueryParam("fields") List<String> fields,
94 // OpenStack LoadBalancerPool attributes
95 @QueryParam("id") String queryLoadBalancerPoolID,
96 @QueryParam("tenant_id") String queryLoadBalancerPoolTenantID,
97 @QueryParam("name") String queryLoadBalancerPoolName,
98 @QueryParam("description") String queryLoadBalancerDescription,
99 @QueryParam("protocol") String queryLoadBalancerProtocol,
100 @QueryParam("lb_algorithm") String queryLoadBalancerPoolLbAlgorithm,
101 @QueryParam("healthmonitor_id") String queryLoadBalancerPoolHealthMonitorID,
102 @QueryParam("admin_state_up") String queryLoadBalancerIsAdminStateUp,
103 @QueryParam("members") List<NeutronLoadBalancerPoolMember> queryLoadBalancerPoolMembers,
105 @QueryParam("limit") String limit,
106 @QueryParam("marker") String marker,
107 @QueryParam("page_reverse") String pageReverse
108 // sorting not supported
110 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
111 List<NeutronLoadBalancerPool> allLoadBalancerPools = loadBalancerPoolInterface.getAllNeutronLoadBalancerPools();
112 List<NeutronLoadBalancerPool> ans = new ArrayList<NeutronLoadBalancerPool>();
113 Iterator<NeutronLoadBalancerPool> i = allLoadBalancerPools.iterator();
114 while (i.hasNext()) {
115 NeutronLoadBalancerPool nsg = i.next();
116 if ((queryLoadBalancerPoolID == null ||
117 queryLoadBalancerPoolID.equals(nsg.getID())) &&
118 (queryLoadBalancerPoolTenantID == null ||
119 queryLoadBalancerPoolTenantID.equals(nsg.getLoadBalancerPoolTenantID())) &&
120 (queryLoadBalancerPoolName == null ||
121 queryLoadBalancerPoolName.equals(nsg.getLoadBalancerPoolName())) &&
122 (queryLoadBalancerDescription == null ||
123 queryLoadBalancerDescription.equals(nsg.getLoadBalancerPoolDescription())) &&
124 (queryLoadBalancerPoolLbAlgorithm == null ||
125 queryLoadBalancerPoolLbAlgorithm.equals(nsg.getLoadBalancerPoolLbAlgorithm())) &&
126 (queryLoadBalancerPoolHealthMonitorID == null ||
127 queryLoadBalancerPoolHealthMonitorID.equals(nsg.getNeutronLoadBalancerPoolHealthMonitorID())) &&
128 (queryLoadBalancerIsAdminStateUp == null ||
129 queryLoadBalancerIsAdminStateUp.equals(nsg.getLoadBalancerPoolAdminIsStateIsUp())) &&
130 (queryLoadBalancerPoolMembers.size() == 0 ||
131 queryLoadBalancerPoolMembers.equals(nsg.getLoadBalancerPoolMembers()))) {
132 if (fields.size() > 0) {
133 ans.add(extractFields(nsg,fields));
139 return Response.status(HttpURLConnection.HTTP_OK).entity(
140 new NeutronLoadBalancerPoolRequest(ans)).build();
144 * Returns a specific LoadBalancerPool */
146 @Path("{loadBalancerPoolID}")
148 @Produces({ MediaType.APPLICATION_JSON })
150 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
151 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
152 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
153 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
154 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
155 public Response showLoadBalancerPool(@PathParam("loadBalancerPoolID") String loadBalancerPoolID,
157 @QueryParam("fields") List<String> fields) {
158 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
159 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolID)) {
160 throw new ResourceNotFoundException(uuidNoExist(RESOURCE_NAME));
162 if (fields.size() > 0) {
163 NeutronLoadBalancerPool ans = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID);
164 return Response.status(HttpURLConnection.HTTP_OK).entity(
165 new NeutronLoadBalancerPoolRequest(extractFields(ans, fields))).build();
167 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerPoolRequest(loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID))).build();
172 * Creates new LoadBalancerPool */
175 @Produces({ MediaType.APPLICATION_JSON })
176 @Consumes({ MediaType.APPLICATION_JSON })
178 @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
179 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
180 public Response createLoadBalancerPools(final NeutronLoadBalancerPoolRequest input) {
181 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
182 if (input.isSingleton()) {
183 NeutronLoadBalancerPool singleton = input.getSingleton();
185 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolAware.class, this);
186 if (instances != null) {
187 if (instances.length > 0) {
188 for (Object instance : instances) {
189 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
190 int status = service.canCreateNeutronLoadBalancerPool(singleton);
191 if (status < HttpURLConnection.HTTP_OK || status > HTTP_OK_TOP) {
192 return Response.status(status).build();
196 throw new ServiceUnavailableException(NO_PROVIDERS);
199 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
201 loadBalancerPoolInterface.addNeutronLoadBalancerPool(singleton);
202 if (instances != null) {
203 for (Object instance : instances) {
204 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
205 service.neutronLoadBalancerPoolCreated(singleton);
209 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolAware.class, this);
210 for (NeutronLoadBalancerPool test : input.getBulk()) {
212 if (instances != null) {
213 if (instances.length > 0) {
214 for (Object instance : instances) {
215 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
216 int status = service.canCreateNeutronLoadBalancerPool(test);
217 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
218 return Response.status(status).build();
222 throw new ServiceUnavailableException(NO_PROVIDERS);
225 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
229 * now, each element of the bulk request can be added to the cache
231 for (NeutronLoadBalancerPool test : input.getBulk()) {
232 loadBalancerPoolInterface.addNeutronLoadBalancerPool(test);
233 if (instances != null) {
234 for (Object instance : instances) {
235 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
236 service.neutronLoadBalancerPoolCreated(test);
241 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
245 * Updates a LoadBalancerPool Policy
247 @Path("{loadBalancerPoolID}")
249 @Produces({ MediaType.APPLICATION_JSON })
250 @Consumes({ MediaType.APPLICATION_JSON })
252 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
253 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
254 public Response updateLoadBalancerPool(
255 @PathParam("loadBalancerPoolID") String loadBalancerPoolID, final NeutronLoadBalancerPoolRequest input) {
256 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
258 NeutronLoadBalancerPool delta = input.getSingleton();
259 NeutronLoadBalancerPool original = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID);
261 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolAware.class, this);
262 if (instances != null) {
263 if (instances.length > 0) {
264 for (Object instance : instances) {
265 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
266 int status = service.canUpdateNeutronLoadBalancerPool(delta, original);
267 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
268 return Response.status(status).build();
272 throw new ServiceUnavailableException(NO_PROVIDERS);
275 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
279 * update the object and return it
281 loadBalancerPoolInterface.updateNeutronLoadBalancerPool(loadBalancerPoolID, delta);
282 NeutronLoadBalancerPool updatedLoadBalancerPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID);
283 if (instances != null) {
284 for (Object instance : instances) {
285 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
286 service.neutronLoadBalancerPoolUpdated(updatedLoadBalancerPool);
289 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerPoolRequest(loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID))).build();
293 * Deletes a LoadBalancerPool
296 @Path("{loadBalancerPoolUUID}")
299 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
300 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
301 public Response deleteLoadBalancerPool(
302 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID) {
303 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
305 NeutronLoadBalancerPool singleton = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
306 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolAware.class, this);
307 if (instances != null) {
308 if (instances.length > 0) {
309 for (Object instance : instances) {
310 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
311 int status = service.canDeleteNeutronLoadBalancerPool(singleton);
312 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
313 return Response.status(status).build();
317 throw new ServiceUnavailableException(NO_PROVIDERS);
320 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
324 * remove it and return 204 status
326 loadBalancerPoolInterface.removeNeutronLoadBalancerPool(loadBalancerPoolUUID);
327 if (instances != null) {
328 for (Object instance : instances) {
329 INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance;
330 service.neutronLoadBalancerPoolDeleted(singleton);
333 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();
336 private NeutronLoadBalancerPoolMember extractFields(NeutronLoadBalancerPoolMember o, List<String> fields) {
337 return o.extractFields(fields);
341 * Returns a list of all LoadBalancerPoolMembers in specified pool
343 @Path("{loadBalancerPoolUUID}/members")
345 @Produces({MediaType.APPLICATION_JSON})
347 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
348 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
349 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
350 public Response listMembers(
352 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
355 @QueryParam("fields") List<String> fields,
357 // OpenStack LoadBalancerPool attributes
358 @QueryParam("id") String queryLoadBalancerPoolMemberID,
359 @QueryParam("tenant_id") String queryLoadBalancerPoolMemberTenantID,
360 @QueryParam("address") String queryLoadBalancerPoolMemberAddress,
361 @QueryParam("protocol_port") String queryLoadBalancerPoolMemberProtoPort,
362 @QueryParam("admin_state_up") String queryLoadBalancerPoolMemberAdminStateUp,
363 @QueryParam("weight") String queryLoadBalancerPoolMemberWeight,
364 @QueryParam("subnet_id") String queryLoadBalancerPoolMemberSubnetID,
367 @QueryParam("limit") String limit,
368 @QueryParam("marker") String marker,
369 @QueryParam("page_reverse") String pageReverse
370 // sorting not supported
372 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
373 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
374 throw new ResourceNotFoundException(uuidNoExist(RESOURCE_NAME));
376 List<NeutronLoadBalancerPoolMember> members =
377 loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
378 List<NeutronLoadBalancerPoolMember> ans = new ArrayList<NeutronLoadBalancerPoolMember>();
379 Iterator<NeutronLoadBalancerPoolMember> i = members.iterator();
380 while (i.hasNext()) {
381 NeutronLoadBalancerPoolMember nsg = i.next();
382 if ((queryLoadBalancerPoolMemberID == null ||
383 queryLoadBalancerPoolMemberID.equals(nsg.getID())) &&
384 loadBalancerPoolUUID.equals(nsg.getPoolID()) &&
385 (queryLoadBalancerPoolMemberTenantID == null ||
386 queryLoadBalancerPoolMemberTenantID.equals(nsg.getPoolMemberTenantID())) &&
387 (queryLoadBalancerPoolMemberAddress == null ||
388 queryLoadBalancerPoolMemberAddress.equals(nsg.getPoolMemberAddress())) &&
389 (queryLoadBalancerPoolMemberAdminStateUp == null ||
390 queryLoadBalancerPoolMemberAdminStateUp.equals(nsg.getPoolMemberAdminStateIsUp())) &&
391 (queryLoadBalancerPoolMemberWeight == null ||
392 queryLoadBalancerPoolMemberWeight.equals(nsg.getPoolMemberWeight())) &&
393 (queryLoadBalancerPoolMemberSubnetID == null ||
394 queryLoadBalancerPoolMemberSubnetID.equals(nsg.getPoolMemberSubnetID()))) {
395 if (fields.size() > 0) {
396 ans.add(extractFields(nsg, fields));
402 return Response.status(HttpURLConnection.HTTP_OK).entity(
403 new NeutronLoadBalancerPoolMemberRequest(ans)).build();
407 * Returns a specific LoadBalancerPoolMember
409 @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
411 @Produces({ MediaType.APPLICATION_JSON })
412 //@TypeHint(OpenStackLoadBalancerPoolMembers.class)
414 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
415 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
416 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
417 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
418 public Response showLoadBalancerPoolMember(
419 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
420 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
422 @QueryParam("fields") List<String> fields ) {
424 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
425 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
426 throw new ResourceNotFoundException(uuidNoExist(RESOURCE_NAME));
428 List<NeutronLoadBalancerPoolMember> members =
429 loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
430 for (NeutronLoadBalancerPoolMember ans: members) {
431 if (!ans.getID().equals(loadBalancerPoolMemberUUID)) {
435 if (fields.size() > 0) {
436 return Response.status(HttpURLConnection.HTTP_OK).entity(
437 new NeutronLoadBalancerPoolMemberRequest(extractFields(ans, fields))).build();
439 return Response.status(HttpURLConnection.HTTP_OK).entity(
440 new NeutronLoadBalancerPoolMemberRequest(ans)).build();
443 throw new ResourceNotFoundException(uuidNoExist(RESOURCE_NAME));
447 * Adds a Member to an LBaaS Pool member
449 @Path("{loadBalancerPoolUUID}/members")
451 @Produces({MediaType.APPLICATION_JSON})
452 @Consumes({MediaType.APPLICATION_JSON})
454 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
455 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
456 public Response createLoadBalancerPoolMember(
457 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
458 final NeutronLoadBalancerPoolMemberRequest input) {
460 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
461 NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
463 if (input.isSingleton()) {
464 NeutronLoadBalancerPoolMember singleton = input.getSingleton();
465 singleton.setPoolID(loadBalancerPoolUUID);
467 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
468 if (instances != null) {
469 if (instances.length > 0) {
470 for (Object instance : instances) {
471 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
472 int status = service.canCreateNeutronLoadBalancerPoolMember(singleton);
473 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
474 return Response.status(status).build();
478 throw new ServiceUnavailableException(NO_PROVIDERS);
481 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
484 if (instances != null) {
485 for (Object instance : instances) {
486 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
487 service.neutronLoadBalancerPoolMemberCreated(singleton);
492 * Add the member from the neutron load balancer pool as well
495 loadBalancerPoolInterface.addNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, singleton);
497 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
498 for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
500 if (instances != null) {
501 if (instances.length > 0) {
502 for (Object instance : instances) {
503 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
504 int status = service.canCreateNeutronLoadBalancerPoolMember(test);
505 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
506 return Response.status(status).build();
510 throw new ServiceUnavailableException(NO_PROVIDERS);
513 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
517 * now, each element of the bulk request can be added to the cache
519 for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
520 if (instances != null) {
521 for (Object instance : instances) {
522 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
523 service.neutronLoadBalancerPoolMemberCreated(test);
526 loadBalancerPoolInterface.addNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, test);
529 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
533 * Updates a LB member pool
536 @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
538 @Produces({ MediaType.APPLICATION_JSON })
539 @Consumes({ MediaType.APPLICATION_JSON })
541 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful") })
542 public Response updateLoadBalancerPoolMember(
543 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
544 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
545 final NeutronLoadBalancerPoolMemberRequest input) {
546 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
547 NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
548 NeutronLoadBalancerPoolMember singleton = input.getSingleton();
549 singleton.setPoolID(loadBalancerPoolUUID);
551 if (singletonPool == null) {
552 throw new ResourceNotFoundException("Pool doesn't Exist");
554 NeutronLoadBalancerPoolMember original = singletonPool.getNeutronLoadBalancerPoolMember(loadBalancerPoolMemberUUID);
556 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
557 if (instances != null) {
558 if (instances.length > 0) {
559 for (Object instance : instances) {
560 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
561 int status = service.canUpdateNeutronLoadBalancerPoolMember(singleton, original);
562 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
563 return Response.status(status).build();
567 throw new ServiceUnavailableException(NO_PROVIDERS);
570 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
573 loadBalancerPoolInterface.updateNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, loadBalancerPoolMemberUUID, singleton);
575 if (instances != null) {
576 for (Object instance : instances) {
577 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
578 service.neutronLoadBalancerPoolMemberUpdated(singleton);
581 return Response.status(HttpURLConnection.HTTP_OK).entity(input).build();
585 * Deletes a LoadBalancerPoolMember
588 @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
591 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
592 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
593 public Response deleteLoadBalancerPoolMember(
594 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
595 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) {
596 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
598 //Verify that the LB pool member exists
599 NeutronLoadBalancerPoolMember singleton = null;
600 List<NeutronLoadBalancerPoolMember> members =
601 loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
602 for (NeutronLoadBalancerPoolMember member: members) {
603 if (member.getID().equals(loadBalancerPoolMemberUUID)) {
608 if (singleton == null) {
609 throw new BadRequestException("LoadBalancerPoolMember UUID does not exist.");
612 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
613 if (instances != null) {
614 if (instances.length > 0) {
615 for (Object instance : instances) {
616 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
617 int status = service.canDeleteNeutronLoadBalancerPoolMember(singleton);
618 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
619 return Response.status(status).build();
623 throw new ServiceUnavailableException(NO_PROVIDERS);
626 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
629 if (instances != null) {
630 for (Object instance : instances) {
631 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
632 service.neutronLoadBalancerPoolMemberDeleted(singleton);
637 * Remove the member from the neutron load balancer pool
639 loadBalancerPoolInterface.removeNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, loadBalancerPoolMemberUUID);
641 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();