2 * Copyright (C) 2014 Red Hat, Inc.
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.HashMap;
15 import java.util.Iterator;
16 import java.util.List;
18 import javax.ws.rs.Consumes;
19 import javax.ws.rs.DELETE;
20 import javax.ws.rs.GET;
21 import javax.ws.rs.POST;
22 import javax.ws.rs.PUT;
23 import javax.ws.rs.Path;
24 import javax.ws.rs.PathParam;
25 import javax.ws.rs.Produces;
26 import javax.ws.rs.QueryParam;
27 import javax.ws.rs.core.MediaType;
28 import javax.ws.rs.core.Response;
30 import org.codehaus.enunciate.jaxrs.ResponseCode;
31 import org.codehaus.enunciate.jaxrs.StatusCodes;
32 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorAware;
33 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorCRUD;
34 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
35 import org.opendaylight.neutron.spi.NeutronLoadBalancer;
36 import org.opendaylight.neutron.spi.NeutronLoadBalancerHealthMonitor;
39 * Neutron Northbound REST APIs for Load Balancer HealthMonitor.<br>
40 * This class provides REST APIs for managing neutron LoadBalancerHealthMonitor
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
55 @Path("/lbaas/healthmonitors")
56 public class NeutronLoadBalancerHealthMonitorNorthbound {
58 private static final int HTTP_OK_BOTTOM = 200;
59 private static final int HTTP_OK_TOP = 299;
60 private static final String INTERFACE_NAME = "LoadBalancerHealthMonitor CRUD Interface";
61 private static final String UUID_NO_EXIST = "LoadBalancerHealthMonitor UUID does not exist.";
62 private static final String NO_PROVIDERS = "No providers registered. Please try again later";
63 private static final String NO_PROVIDER_LIST = "Couldn't get providers list. Please try again later";
66 private NeutronLoadBalancerHealthMonitor extractFields(NeutronLoadBalancerHealthMonitor o, List<String> fields) {
67 return o.extractFields(fields);
71 * Returns a list of all LoadBalancerHealthMonitor */
73 @Produces({ MediaType.APPLICATION_JSON })
75 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
76 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
77 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
78 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
80 public Response listGroups(
82 @QueryParam("fields") List<String> fields,
83 // OpenStack LoadBalancerHealthMonitor attributes
84 @QueryParam("id") String queryLoadBalancerHealthMonitorID,
85 @QueryParam("tenant_id") String queryLoadBalancerHealthMonitorTenantID,
86 // TODO "type" is being a property by the JSON parser.
87 @QueryParam("type") String queryLoadBalancerHealthMonitorType,
88 @QueryParam("delay") Integer queryLoadBalancerHealthMonitorDelay,
89 @QueryParam("timeout") Integer queryLoadBalancerHealthMonitorTimeout,
90 @QueryParam("max_retries") Integer queryLoadBalancerHealthMonitorMaxRetries,
91 @QueryParam("http_method") String queryLoadBalancerHealthMonitorHttpMethod,
92 @QueryParam("url_path") String queryLoadBalancerHealthMonitorUrlPath,
93 @QueryParam("expected_codes") String queryLoadBalancerHealthMonitorExpectedCodes,
94 @QueryParam("admin_state_up") Boolean queryLoadBalancerHealthMonitorIsAdminStateUp,
96 @QueryParam("limit") String limit,
97 @QueryParam("marker") String marker,
98 @QueryParam("page_reverse") String pageReverse
99 // sorting not supported
101 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
102 .getINeutronLoadBalancerHealthMonitorCRUD(this);
103 if (loadBalancerHealthMonitorInterface == null) {
104 throw new ServiceUnavailableException(INTERFACE_NAME
105 + RestMessages.SERVICEUNAVAILABLE.toString());
107 List<NeutronLoadBalancerHealthMonitor> allLoadBalancerHealthMonitors = loadBalancerHealthMonitorInterface.getAllNeutronLoadBalancerHealthMonitors();
108 List<NeutronLoadBalancerHealthMonitor> ans = new ArrayList<NeutronLoadBalancerHealthMonitor>();
109 Iterator<NeutronLoadBalancerHealthMonitor> i = allLoadBalancerHealthMonitors.iterator();
110 while (i.hasNext()) {
111 NeutronLoadBalancerHealthMonitor nsg = i.next();
112 if ((queryLoadBalancerHealthMonitorID == null ||
113 queryLoadBalancerHealthMonitorID.equals(nsg.getLoadBalancerHealthMonitorID())) &&
114 (queryLoadBalancerHealthMonitorTenantID == null ||
115 queryLoadBalancerHealthMonitorTenantID.equals
116 (nsg.getLoadBalancerHealthMonitorTenantID())) &&
117 (queryLoadBalancerHealthMonitorType == null ||
118 queryLoadBalancerHealthMonitorType.equals
119 (nsg.getLoadBalancerHealthMonitorType())) &&
120 (queryLoadBalancerHealthMonitorDelay == null ||
121 queryLoadBalancerHealthMonitorDelay.equals
122 (nsg.getLoadBalancerHealthMonitorDelay())) &&
123 (queryLoadBalancerHealthMonitorTimeout == null ||
124 queryLoadBalancerHealthMonitorTimeout.equals
125 (nsg.getLoadBalancerHealthMonitorTimeout())) &&
126 (queryLoadBalancerHealthMonitorMaxRetries == null ||
127 queryLoadBalancerHealthMonitorMaxRetries.equals
128 (nsg.getLoadBalancerHealthMonitorMaxRetries())) &&
129 (queryLoadBalancerHealthMonitorHttpMethod == null ||
130 queryLoadBalancerHealthMonitorHttpMethod.equals
131 (nsg.getLoadBalancerHealthMonitorHttpMethod())) &&
132 (queryLoadBalancerHealthMonitorUrlPath == null ||
133 queryLoadBalancerHealthMonitorUrlPath.equals
134 (nsg.getLoadBalancerHealthMonitorUrlPath())) &&
135 (queryLoadBalancerHealthMonitorExpectedCodes == null ||
136 queryLoadBalancerHealthMonitorExpectedCodes.equals
137 (nsg.getLoadBalancerHealthMonitorExpectedCodes())) &&
138 (queryLoadBalancerHealthMonitorIsAdminStateUp == null ||
139 queryLoadBalancerHealthMonitorIsAdminStateUp.equals
140 (nsg.getLoadBalancerHealthMonitorAdminStateIsUp()))) {
141 if (fields.size() > 0) {
142 ans.add(extractFields(nsg,fields));
148 return Response.status(HttpURLConnection.HTTP_OK).entity(
149 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
153 * Returns a specific LoadBalancerHealthMonitor */
155 @Path("{loadBalancerHealthMonitorID}")
157 @Produces({ MediaType.APPLICATION_JSON })
159 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
160 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
161 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
162 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
163 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
164 public Response showLoadBalancerHealthMonitor(@PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
166 @QueryParam("fields") List<String> fields) {
167 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
168 if (loadBalancerHealthMonitorInterface == null) {
169 throw new ServiceUnavailableException(INTERFACE_NAME
170 + RestMessages.SERVICEUNAVAILABLE.toString());
172 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
173 throw new ResourceNotFoundException(UUID_NO_EXIST);
175 if (fields.size() > 0) {
176 NeutronLoadBalancerHealthMonitor ans = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
177 return Response.status(HttpURLConnection.HTTP_OK).entity(
178 new NeutronLoadBalancerHealthMonitorRequest(extractFields(ans, fields))).build();
180 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest(loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID))).build();
185 * Creates new LoadBalancerHealthMonitor */
188 @Produces({ MediaType.APPLICATION_JSON })
189 @Consumes({ MediaType.APPLICATION_JSON })
191 @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
192 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
193 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
194 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
195 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
196 @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
197 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
198 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
199 public Response createLoadBalancerHealthMonitors(final NeutronLoadBalancerHealthMonitorRequest input) {
200 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
201 if (loadBalancerHealthMonitorInterface == null) {
202 throw new ServiceUnavailableException(INTERFACE_NAME
203 + RestMessages.SERVICEUNAVAILABLE.toString());
205 if (input.isSingleton()) {
206 NeutronLoadBalancerHealthMonitor singleton = input.getSingleton();
209 * Verify that the LoadBalancerHealthMonitor doesn't already exist.
211 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(singleton.getLoadBalancerHealthMonitorID())) {
212 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
215 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
216 if (instances != null) {
217 if (instances.length > 0) {
218 for (Object instance : instances) {
219 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
220 int status = service.canCreateNeutronLoadBalancerHealthMonitor(singleton);
221 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
222 return Response.status(status).build();
226 throw new ServiceUnavailableException(NO_PROVIDERS);
229 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
231 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
232 if (instances != null) {
233 for (Object instance : instances) {
234 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
235 service.neutronLoadBalancerHealthMonitorCreated(singleton);
239 List<NeutronLoadBalancerHealthMonitor> bulk = input.getBulk();
240 Iterator<NeutronLoadBalancerHealthMonitor> i = bulk.iterator();
241 HashMap<String, NeutronLoadBalancerHealthMonitor> testMap = new HashMap<String, NeutronLoadBalancerHealthMonitor>();
242 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
243 while (i.hasNext()) {
244 NeutronLoadBalancerHealthMonitor test = i.next();
247 * Verify that the firewall policy doesn't already exist
250 if (loadBalancerHealthMonitorInterface
251 .neutronLoadBalancerHealthMonitorExists(test.getLoadBalancerHealthMonitorID())) {
252 throw new BadRequestException("LoadBalancerHealthMonitor UUID already is already created");
254 if (testMap.containsKey(test.getLoadBalancerHealthMonitorID())) {
255 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
257 if (instances != null) {
258 if (instances.length > 0) {
259 for (Object instance : instances) {
260 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
261 int status = service.canCreateNeutronLoadBalancerHealthMonitor(test);
262 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
263 return Response.status(status).build();
267 throw new ServiceUnavailableException(NO_PROVIDERS);
270 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
274 * now, each element of the bulk request can be added to the cache
277 while (i.hasNext()) {
278 NeutronLoadBalancerHealthMonitor test = i.next();
279 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(test);
280 if (instances != null) {
281 for (Object instance : instances) {
282 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
283 service.neutronLoadBalancerHealthMonitorCreated(test);
288 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
292 * Updates a LoadBalancerHealthMonitor Policy
294 @Path("{loadBalancerHealthMonitorID}")
296 @Produces({ MediaType.APPLICATION_JSON })
297 @Consumes({ MediaType.APPLICATION_JSON })
299 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
300 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
301 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
302 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
303 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
304 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
305 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
306 public Response updateLoadBalancerHealthMonitor(
307 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
308 final NeutronLoadBalancerHealthMonitorRequest input) {
309 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
310 .getINeutronLoadBalancerHealthMonitorCRUD(this);
311 if (loadBalancerHealthMonitorInterface == null) {
312 throw new ServiceUnavailableException(INTERFACE_NAME
313 + RestMessages.SERVICEUNAVAILABLE.toString());
317 * verify the LoadBalancerHealthMonitor exists and there is only one delta provided
319 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
320 throw new ResourceNotFoundException(UUID_NO_EXIST);
322 if (!input.isSingleton()) {
323 throw new BadRequestException("Only singleton edit supported");
325 NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
326 NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
327 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
330 * updates restricted by Neutron
332 if (delta.getLoadBalancerHealthMonitorID() != null ||
333 delta.getLoadBalancerHealthMonitorTenantID() != null ||
334 delta.getLoadBalancerHealthMonitorType() != null ||
335 delta.getLoadBalancerHealthMonitorDelay() != null ||
336 delta.getLoadBalancerHealthMonitorTimeout() != null ||
337 delta.getLoadBalancerHealthMonitorMaxRetries() != null ||
338 delta.getLoadBalancerHealthMonitorHttpMethod() != null ||
339 delta.getLoadBalancerHealthMonitorUrlPath() != null ||
340 delta.getLoadBalancerHealthMonitorExpectedCodes() != null ||
341 delta.getLoadBalancerHealthMonitorAdminStateIsUp() != null) {
342 throw new BadRequestException("Attribute edit blocked by Neutron");
345 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
346 if (instances != null) {
347 if (instances.length > 0) {
348 for (Object instance : instances) {
349 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
350 int status = service.canUpdateNeutronLoadBalancerHealthMonitor(delta, original);
351 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
352 return Response.status(status).build();
356 throw new ServiceUnavailableException(NO_PROVIDERS);
359 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
363 * update the object and return it
365 loadBalancerHealthMonitorInterface.updateNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID, delta);
366 NeutronLoadBalancerHealthMonitor updatedLoadBalancerHealthMonitor = loadBalancerHealthMonitorInterface
367 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
368 if (instances != null) {
369 for (Object instance : instances) {
370 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
371 service.neutronLoadBalancerHealthMonitorUpdated(updatedLoadBalancerHealthMonitor);
374 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest
375 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
376 (loadBalancerHealthMonitorID))).build();
382 * Deletes a LoadBalancerHealthMonitor
384 @Path("{loadBalancerHealthMonitorID}")
387 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
388 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
389 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
390 @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
391 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
392 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
393 public Response deleteLoadBalancerHealthMonitor(
394 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID) {
395 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
396 if (loadBalancerHealthMonitorInterface == null) {
397 throw new ServiceUnavailableException(INTERFACE_NAME
398 + RestMessages.SERVICEUNAVAILABLE.toString());
401 * verify the LoadBalancerHealthMonitor exists and it isn't currently in use
403 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
404 throw new ResourceNotFoundException(UUID_NO_EXIST);
406 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorInUse(loadBalancerHealthMonitorID)) {
407 return Response.status(HttpURLConnection.HTTP_CONFLICT).build();
409 NeutronLoadBalancerHealthMonitor singleton = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
410 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
411 if (instances != null) {
412 if (instances.length > 0) {
413 for (Object instance : instances) {
414 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
415 int status = service.canDeleteNeutronLoadBalancerHealthMonitor(singleton);
416 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
417 return Response.status(status).build();
421 throw new ServiceUnavailableException(NO_PROVIDERS);
424 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
426 loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
427 if (instances != null) {
428 for (Object instance : instances) {
429 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
430 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
433 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();