2 * Copyright (C) 2014 SDN Hub, LLC.
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
8 * Authors : Srini Seetharaman
11 package org.opendaylight.neutron.northbound.api;
13 import java.net.HttpURLConnection;
15 import java.util.ArrayList;
16 import java.util.HashMap;
17 import java.util.Iterator;
18 import java.util.List;
21 import javax.ws.rs.Consumes;
22 import javax.ws.rs.DELETE;
23 import javax.ws.rs.GET;
24 import javax.ws.rs.POST;
25 import javax.ws.rs.PUT;
26 import javax.ws.rs.Path;
27 import javax.ws.rs.PathParam;
28 import javax.ws.rs.Produces;
29 import javax.ws.rs.QueryParam;
30 import javax.ws.rs.core.MediaType;
31 import javax.ws.rs.core.Response;
33 import org.codehaus.enunciate.jaxrs.ResponseCode;
34 import org.codehaus.enunciate.jaxrs.StatusCodes;
35 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
36 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolMemberAware;
37 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
38 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
39 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
41 @Path("/lbaas/pools/{loadBalancerPoolUUID}/members")
42 public class NeutronLoadBalancerPoolMembersNorthbound {
43 private static final int HTTP_OK_BOTTOM = 200;
44 private static final int HTTP_OK_TOP = 299;
45 private static final String INTERFACE_NAME = "LoadBalancerPool CRUD Interface";
46 private static final String UUID_NO_EXIST = "LoadBalancerPool UUID does not exist.";
47 private static final String NO_PROVIDERS = "No providers registered. Please try again later";
48 private static final String NO_PROVIDER_LIST = "Couldn't get providers list. Please try again later";
50 private NeutronLoadBalancerPoolMember extractFields(NeutronLoadBalancerPoolMember o, List<String> fields) {
51 return o.extractFields(fields);
54 private NeutronCRUDInterfaces getNeutronInterfaces() {
55 NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronLoadBalancerPoolCRUD(this);
56 if (answer.getLoadBalancerPoolInterface() == null) {
57 throw new ServiceUnavailableException(INTERFACE_NAME
58 + RestMessages.SERVICEUNAVAILABLE.toString());
64 * Returns a list of all LoadBalancerPoolMembers in specified pool
67 @Produces({MediaType.APPLICATION_JSON})
69 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
70 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
71 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
72 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
74 public Response listMembers(
76 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
79 @QueryParam("fields") List<String> fields,
81 // OpenStack LoadBalancerPool attributes
82 @QueryParam("id") String queryLoadBalancerPoolMemberID,
83 @QueryParam("tenant_id") String queryLoadBalancerPoolMemberTenantID,
84 @QueryParam("address") String queryLoadBalancerPoolMemberAddress,
85 @QueryParam("protocol_port") String queryLoadBalancerPoolMemberProtoPort,
86 @QueryParam("admin_state_up") String queryLoadBalancerPoolMemberAdminStateUp,
87 @QueryParam("weight") String queryLoadBalancerPoolMemberWeight,
88 @QueryParam("subnet_id") String queryLoadBalancerPoolMemberSubnetID,
91 @QueryParam("limit") String limit,
92 @QueryParam("marker") String marker,
93 @QueryParam("page_reverse") String pageReverse
94 // sorting not supported
96 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
97 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
98 throw new ResourceNotFoundException(UUID_NO_EXIST);
100 List<NeutronLoadBalancerPoolMember> members =
101 loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
102 List<NeutronLoadBalancerPoolMember> ans = new ArrayList<NeutronLoadBalancerPoolMember>();
103 Iterator<NeutronLoadBalancerPoolMember> i = members.iterator();
104 while (i.hasNext()) {
105 NeutronLoadBalancerPoolMember nsg = i.next();
106 if ((queryLoadBalancerPoolMemberID == null ||
107 queryLoadBalancerPoolMemberID.equals(nsg.getPoolMemberID())) &&
108 loadBalancerPoolUUID.equals(nsg.getPoolID()) &&
109 (queryLoadBalancerPoolMemberTenantID == null ||
110 queryLoadBalancerPoolMemberTenantID.equals(nsg.getPoolMemberTenantID())) &&
111 (queryLoadBalancerPoolMemberAddress == null ||
112 queryLoadBalancerPoolMemberAddress.equals(nsg.getPoolMemberAddress())) &&
113 (queryLoadBalancerPoolMemberAdminStateUp == null ||
114 queryLoadBalancerPoolMemberAdminStateUp.equals(nsg.getPoolMemberAdminStateIsUp())) &&
115 (queryLoadBalancerPoolMemberWeight == null ||
116 queryLoadBalancerPoolMemberWeight.equals(nsg.getPoolMemberWeight())) &&
117 (queryLoadBalancerPoolMemberSubnetID == null ||
118 queryLoadBalancerPoolMemberSubnetID.equals(nsg.getPoolMemberSubnetID()))) {
119 if (fields.size() > 0) {
120 ans.add(extractFields(nsg, fields));
126 return Response.status(HttpURLConnection.HTTP_OK).entity(
127 new NeutronLoadBalancerPoolMemberRequest(ans)).build();
131 * Returns a specific LoadBalancerPoolMember
134 @Path("{loadBalancerPoolMemberUUID}")
136 @Produces({ MediaType.APPLICATION_JSON })
137 //@TypeHint(OpenStackLoadBalancerPoolMembers.class)
139 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
140 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
141 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
142 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
143 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
144 public Response showLoadBalancerPoolMember(
145 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
146 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
148 @QueryParam("fields") List<String> fields ) {
150 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
151 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
152 throw new ResourceNotFoundException(UUID_NO_EXIST);
154 List<NeutronLoadBalancerPoolMember> members =
155 loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
156 for (NeutronLoadBalancerPoolMember ans: members) {
157 if (!ans.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) {
161 if (fields.size() > 0) {
162 return Response.status(HttpURLConnection.HTTP_OK).entity(
163 new NeutronLoadBalancerPoolMemberRequest(extractFields(ans, fields))).build();
165 return Response.status(HttpURLConnection.HTTP_OK).entity(
166 new NeutronLoadBalancerPoolMemberRequest(ans)).build();
169 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();
173 * Adds a Member to an LBaaS Pool member
176 @Produces({MediaType.APPLICATION_JSON})
177 @Consumes({MediaType.APPLICATION_JSON})
179 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
180 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
181 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
182 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
183 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
184 public Response createLoadBalancerPoolMember(
185 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
186 final NeutronLoadBalancerPoolMemberRequest input) {
188 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
189 // Verify that the loadBalancerPool exists, for the member to be added to its cache
190 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
191 throw new ResourceNotFoundException(UUID_NO_EXIST);
193 NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
195 if (input.isSingleton()) {
196 NeutronLoadBalancerPoolMember singleton = input.getSingleton();
197 singleton.setPoolID(loadBalancerPoolUUID);
198 String loadBalancerPoolMemberUUID = singleton.getPoolMemberID();
201 * Verify that the LoadBalancerPoolMember doesn't already exist.
203 if (singletonPool.getLoadBalancerPoolMembers() != null) {
204 List<NeutronLoadBalancerPoolMember> members = singletonPool.getLoadBalancerPoolMembers();
205 for (NeutronLoadBalancerPoolMember member: members) {
206 if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) {
207 throw new BadRequestException("LoadBalancerPoolMember UUID already exists");
212 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
213 if (instances != null) {
214 if (instances.length > 0) {
215 for (Object instance : instances) {
216 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
217 int status = service.canCreateNeutronLoadBalancerPoolMember(singleton);
218 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
219 return Response.status(status).build();
223 throw new ServiceUnavailableException(NO_PROVIDERS);
226 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
229 if (instances != null) {
230 for (Object instance : instances) {
231 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
232 service.neutronLoadBalancerPoolMemberCreated(singleton);
237 * Add the member from the neutron load balancer pool as well
239 singletonPool.addLoadBalancerPoolMember(singleton);
242 List<NeutronLoadBalancerPoolMember> bulk = input.getBulk();
243 Iterator<NeutronLoadBalancerPoolMember> i = bulk.iterator();
244 Map<String, NeutronLoadBalancerPoolMember> testMap = new HashMap<String, NeutronLoadBalancerPoolMember>();
245 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
246 while (i.hasNext()) {
247 NeutronLoadBalancerPoolMember test = i.next();
248 String loadBalancerPoolMemberUUID = test.getPoolMemberID();
251 * Verify that the LoadBalancerPoolMember doesn't already exist.
253 List<NeutronLoadBalancerPoolMember> members = singletonPool.getLoadBalancerPoolMembers();
254 for (NeutronLoadBalancerPoolMember member: members) {
255 if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) {
256 throw new BadRequestException("LoadBalancerPoolMember UUID already exists");
260 if (testMap.containsKey(test.getPoolMemberID())) {
261 throw new BadRequestException("Load Balancer PoolMember UUID already exists");
263 if (instances != null) {
264 if (instances.length > 0) {
265 for (Object instance : instances) {
266 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
267 int status = service.canCreateNeutronLoadBalancerPoolMember(test);
268 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
269 return Response.status(status).build();
273 throw new ServiceUnavailableException(NO_PROVIDERS);
276 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
280 * now, each element of the bulk request can be added to the cache
283 while (i.hasNext()) {
284 NeutronLoadBalancerPoolMember test = i.next();
285 if (instances != null) {
286 for (Object instance : instances) {
287 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
288 service.neutronLoadBalancerPoolMemberCreated(test);
291 singletonPool.addLoadBalancerPoolMember(test);
294 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
298 * Updates a LB member pool
301 @Path("{loadBalancerPoolMemberUUID}")
303 @Produces({ MediaType.APPLICATION_JSON })
304 @Consumes({ MediaType.APPLICATION_JSON })
306 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
307 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
308 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
309 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
310 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
311 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented") })
312 public Response updateLoadBalancerPoolMember(
313 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
314 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
315 final NeutronLoadBalancerPoolMemberRequest input) {
317 //TODO: Implement update LB member pool
318 return Response.status(HttpURLConnection.HTTP_NOT_IMPLEMENTED).entity(input).build();
322 * Deletes a LoadBalancerPoolMember
325 @Path("{loadBalancerPoolMemberUUID}")
328 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
329 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
330 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
331 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
332 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
333 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
334 public Response deleteLoadBalancerPoolMember(
335 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
336 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) {
337 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronInterfaces().getLoadBalancerPoolInterface();
339 // Verify that the loadBalancerPool exists, for the member to be removed from its cache
340 if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) {
341 throw new ResourceNotFoundException(UUID_NO_EXIST);
344 //Verify that the LB pool member exists
345 NeutronLoadBalancerPoolMember singleton = null;
346 List<NeutronLoadBalancerPoolMember> members =
347 loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers();
348 for (NeutronLoadBalancerPoolMember member: members) {
349 if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) {
354 if (singleton == null) {
355 throw new BadRequestException("LoadBalancerPoolMember UUID does not exist.");
358 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerPoolMemberAware.class, this);
359 if (instances != null) {
360 if (instances.length > 0) {
361 for (Object instance : instances) {
362 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
363 int status = service.canDeleteNeutronLoadBalancerPoolMember(singleton);
364 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
365 return Response.status(status).build();
369 throw new ServiceUnavailableException(NO_PROVIDERS);
372 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
375 if (instances != null) {
376 for (Object instance : instances) {
377 INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance;
378 service.neutronLoadBalancerPoolMemberDeleted(singleton);
383 * Remove the member from the neutron load balancer pool
385 NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID);
386 singletonPool.removeLoadBalancerPoolMember(singleton);
388 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();