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
8 package org.opendaylight.neutron.northbound.api;
10 import java.net.HttpURLConnection;
11 import java.util.ArrayList;
12 import java.util.List;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import javax.ws.rs.Consumes;
16 import javax.ws.rs.DELETE;
17 import javax.ws.rs.GET;
18 import javax.ws.rs.POST;
19 import javax.ws.rs.PUT;
20 import javax.ws.rs.Path;
21 import javax.ws.rs.PathParam;
22 import javax.ws.rs.Produces;
23 import javax.ws.rs.QueryParam;
24 import javax.ws.rs.core.MediaType;
25 import javax.ws.rs.core.Response;
26 import org.codehaus.enunciate.jaxrs.ResponseCode;
27 import org.codehaus.enunciate.jaxrs.StatusCodes;
28 import org.opendaylight.neutron.spi.INeutronLoadBalancerPoolCRUD;
29 import org.opendaylight.neutron.spi.NeutronLoadBalancerPool;
30 import org.opendaylight.neutron.spi.NeutronLoadBalancerPoolMember;
31 import org.ops4j.pax.cdi.api.OsgiService;
34 * Neutron Northbound REST APIs for LoadBalancerPool Policies.
36 * <p>For now, the LB pool member data is maintained with the INeutronLoadBalancerPoolCRUD,
37 * and not duplicated within the INeutronLoadBalancerPoolMemberCRUD's cache.
41 public final class NeutronLoadBalancerPoolNorthbound extends AbstractNeutronNorthbound<NeutronLoadBalancerPool,
42 NeutronLoadBalancerPoolRequest, INeutronLoadBalancerPoolCRUD> {
44 private static final String RESOURCE_NAME = "LoadBalancerPool";
47 public NeutronLoadBalancerPoolNorthbound(@OsgiService INeutronLoadBalancerPoolCRUD neutronCRUD) {
52 protected String getResourceName() {
57 * Returns a list of all LoadBalancerPool.
60 @Produces({ MediaType.APPLICATION_JSON })
61 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
62 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
63 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
64 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
65 public Response listGroups(
67 @QueryParam("fields") List<String> fields,
68 // OpenStack LoadBalancerPool attributes
69 @QueryParam("id") String queryLoadBalancerPoolID,
70 @QueryParam("tenant_id") String queryLoadBalancerPoolTenantID,
71 @QueryParam("name") String queryLoadBalancerPoolName,
72 @QueryParam("protocol") String queryLoadBalancerProtocol,
73 @QueryParam("lb_algorithm") String queryLoadBalancerPoolLbAlgorithm,
74 @QueryParam("healthmonitor_id") String queryLoadBalancerPoolHealthMonitorID,
75 @QueryParam("admin_state_up") Boolean queryLoadBalancerIsAdminStateUp,
76 @QueryParam("members") List<NeutronLoadBalancerPoolMember> queryLoadBalancerPoolMembers,
78 @QueryParam("limit") String limit,
79 @QueryParam("marker") String marker,
80 @QueryParam("page_reverse") String pageReverse
81 // sorting not supported
83 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronCRUD();
84 List<NeutronLoadBalancerPool> allLoadBalancerPools = loadBalancerPoolInterface.getAll();
85 List<NeutronLoadBalancerPool> ans = new ArrayList<>();
86 for (NeutronLoadBalancerPool nsg : allLoadBalancerPools) {
87 if ((queryLoadBalancerPoolID == null || queryLoadBalancerPoolID.equals(nsg.getID()))
88 && (queryLoadBalancerPoolTenantID == null
89 || queryLoadBalancerPoolTenantID.equals(nsg.getTenantID()))
90 && (queryLoadBalancerPoolName == null
91 || queryLoadBalancerPoolName.equals(nsg.getName()))
92 && (queryLoadBalancerPoolLbAlgorithm == null
93 || queryLoadBalancerPoolLbAlgorithm.equals(nsg.getLoadBalancerPoolLbAlgorithm()))
94 && (queryLoadBalancerPoolHealthMonitorID == null || queryLoadBalancerPoolHealthMonitorID
95 .equals(nsg.getLoadBalancerPoolHealthMonitorID()))
96 && (queryLoadBalancerIsAdminStateUp == null
97 || queryLoadBalancerIsAdminStateUp.equals(nsg.getLoadBalancerPoolAdminIsStateIsUp()))
98 && (queryLoadBalancerPoolMembers.size() == 0
99 || queryLoadBalancerPoolMembers.equals(nsg.getLoadBalancerPoolMembers()))) {
100 if (fields.size() > 0) {
101 ans.add(nsg.extractFields(fields));
107 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerPoolRequest(ans)).build();
111 * Returns a specific LoadBalancerPool.
113 @Path("{loadBalancerPoolID}")
115 @Produces({ MediaType.APPLICATION_JSON })
116 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
117 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
118 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
119 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
120 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
121 public Response showLoadBalancerPool(@PathParam("loadBalancerPoolID") String loadBalancerPoolID,
123 @QueryParam("fields") List<String> fields) {
124 return show(loadBalancerPoolID, fields);
128 * Creates new LoadBalancerPool.
131 @Produces({ MediaType.APPLICATION_JSON })
132 @Consumes({ MediaType.APPLICATION_JSON })
133 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
134 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
135 public Response createLoadBalancerPools(final NeutronLoadBalancerPoolRequest input) {
136 return create(input);
140 * Updates a LoadBalancerPool Policy.
142 @Path("{loadBalancerPoolID}")
144 @Produces({ MediaType.APPLICATION_JSON })
145 @Consumes({ MediaType.APPLICATION_JSON })
146 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
147 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
148 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
149 public Response updateLoadBalancerPool(@PathParam("loadBalancerPoolID") String loadBalancerPoolID,
150 final NeutronLoadBalancerPoolRequest input) {
151 return update(loadBalancerPoolID, input);
155 * Deletes a LoadBalancerPool.
157 @Path("{loadBalancerPoolUUID}")
159 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
160 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
161 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
162 public Response deleteLoadBalancerPool(@PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID) {
163 return delete(loadBalancerPoolUUID);
167 * Returns a list of all LoadBalancerPoolMembers in specified pool.
169 @Path("{loadBalancerPoolUUID}/members")
171 @Produces({ MediaType.APPLICATION_JSON })
172 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
173 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
174 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
175 public Response listMembers(
177 @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
180 @QueryParam("fields") List<String> fields,
182 // OpenStack LoadBalancerPool attributes
183 @QueryParam("id") String queryLoadBalancerPoolMemberID,
184 @QueryParam("tenant_id") String queryLoadBalancerPoolMemberTenantID,
185 @QueryParam("address") String queryLoadBalancerPoolMemberAddress,
186 @QueryParam("protocol_port") String queryLoadBalancerPoolMemberProtoPort,
187 @QueryParam("admin_state_up") Boolean queryLoadBalancerPoolMemberAdminStateUp,
188 @QueryParam("weight") Integer queryLoadBalancerPoolMemberWeight,
189 @QueryParam("subnet_id") String queryLoadBalancerPoolMemberSubnetID,
192 @QueryParam("limit") String limit,
193 @QueryParam("marker") String marker,
194 @QueryParam("page_reverse") String pageReverse
195 // sorting not supported
197 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronCRUD();
198 if (!loadBalancerPoolInterface.exists(loadBalancerPoolUUID)) {
199 throw new ResourceNotFoundException(uuidNoExist());
201 List<NeutronLoadBalancerPoolMember> members = loadBalancerPoolInterface.get(loadBalancerPoolUUID)
202 .getLoadBalancerPoolMembers();
203 List<NeutronLoadBalancerPoolMember> ans = new ArrayList<>();
204 for (NeutronLoadBalancerPoolMember nsg : members) {
205 if ((queryLoadBalancerPoolMemberID == null || queryLoadBalancerPoolMemberID.equals(nsg.getID()))
206 && loadBalancerPoolUUID.equals(nsg.getPoolID())
207 && (queryLoadBalancerPoolMemberTenantID == null
208 || queryLoadBalancerPoolMemberTenantID.equals(nsg.getTenantID()))
209 && (queryLoadBalancerPoolMemberAddress == null
210 || queryLoadBalancerPoolMemberAddress.equals(nsg.getPoolMemberAddress()))
211 && (queryLoadBalancerPoolMemberAdminStateUp == null
212 || queryLoadBalancerPoolMemberAdminStateUp.equals(nsg.getPoolMemberAdminStateIsUp()))
213 && (queryLoadBalancerPoolMemberWeight == null
214 || queryLoadBalancerPoolMemberWeight.equals(nsg.getPoolMemberWeight()))
215 && (queryLoadBalancerPoolMemberSubnetID == null
216 || queryLoadBalancerPoolMemberSubnetID.equals(nsg.getPoolMemberSubnetID()))) {
217 if (fields.size() > 0) {
218 ans.add(nsg.extractFields(fields));
224 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerPoolMemberRequest(ans)).build();
228 * Returns a specific LoadBalancerPoolMember.
230 @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
232 @Produces({ MediaType.APPLICATION_JSON })
233 //@TypeHint(OpenStackLoadBalancerPoolMembers.class)
234 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
235 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
236 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
237 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
238 public Response showLoadBalancerPoolMember(@PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
239 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
241 @QueryParam("fields") List<String> fields) {
243 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronCRUD();
244 if (!loadBalancerPoolInterface.exists(loadBalancerPoolUUID)) {
245 throw new ResourceNotFoundException(uuidNoExist());
247 List<NeutronLoadBalancerPoolMember> members = loadBalancerPoolInterface.get(loadBalancerPoolUUID)
248 .getLoadBalancerPoolMembers();
249 for (NeutronLoadBalancerPoolMember ans : members) {
250 if (!ans.getID().equals(loadBalancerPoolMemberUUID)) {
254 if (fields.size() > 0) {
255 return Response.status(HttpURLConnection.HTTP_OK)
256 .entity(new NeutronLoadBalancerPoolMemberRequest(ans.extractFields(fields))).build();
258 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerPoolMemberRequest(ans))
262 throw new ResourceNotFoundException(uuidNoExist());
266 * Adds a Member to an LBaaS Pool member.
268 @Path("{loadBalancerPoolUUID}/members")
270 @Produces({ MediaType.APPLICATION_JSON })
271 @Consumes({ MediaType.APPLICATION_JSON })
272 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
273 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
274 public Response createLoadBalancerPoolMember(@PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
275 final NeutronLoadBalancerPoolMemberRequest input) {
277 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronCRUD();
279 if (input.isSingleton()) {
280 NeutronLoadBalancerPoolMember singleton = input.getSingleton();
281 singleton.setPoolID(loadBalancerPoolUUID);
283 * Add the member from the neutron load balancer pool as well
286 loadBalancerPoolInterface.addNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, singleton);
289 * now, each element of the bulk request can be added to the cache
291 for (NeutronLoadBalancerPoolMember test : input.getBulk()) {
292 loadBalancerPoolInterface.addNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, test);
295 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
299 * Updates a LB member pool.
301 @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
303 @Produces({ MediaType.APPLICATION_JSON })
304 @Consumes({ MediaType.APPLICATION_JSON })
305 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
306 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found") })
307 public Response updateLoadBalancerPoolMember(@PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
308 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID,
309 final NeutronLoadBalancerPoolMemberRequest input) {
310 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronCRUD();
311 NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.get(loadBalancerPoolUUID);
312 NeutronLoadBalancerPoolMember singleton = input.getSingleton();
313 singleton.setPoolID(loadBalancerPoolUUID);
315 if (singletonPool == null) {
316 throw new ResourceNotFoundException("Pool doesn't Exist");
318 loadBalancerPoolInterface.updateNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, loadBalancerPoolMemberUUID,
320 return Response.status(HttpURLConnection.HTTP_OK).entity(input).build();
324 * Deletes a LoadBalancerPoolMember.
326 @Path("{loadBalancerPoolUUID}/members/{loadBalancerPoolMemberUUID}")
328 @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
329 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
330 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
331 public Response deleteLoadBalancerPoolMember(@PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID,
332 @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) {
333 INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = getNeutronCRUD();
335 //Verify that the LB pool member exists
336 NeutronLoadBalancerPoolMember singleton = null;
337 List<NeutronLoadBalancerPoolMember> members = loadBalancerPoolInterface.get(loadBalancerPoolUUID)
338 .getLoadBalancerPoolMembers();
339 for (NeutronLoadBalancerPoolMember member : members) {
340 if (member.getID().equals(loadBalancerPoolMemberUUID)) {
345 if (singleton == null) {
346 throw new BadRequestException("LoadBalancerPoolMember UUID does not exist.");
350 * Remove the member from the neutron load balancer pool
352 loadBalancerPoolInterface.removeNeutronLoadBalancerPoolMember(loadBalancerPoolUUID, loadBalancerPoolMemberUUID);
354 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();