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.NeutronLoadBalancerHealthMonitor;
38 * Neutron Northbound REST APIs for Load Balancer HealthMonitor.<br>
39 * This class provides REST APIs for managing neutron LoadBalancerHealthMonitor
43 * Authentication scheme : <b>HTTP Basic</b><br>
44 * Authentication realm : <b>opendaylight</b><br>
45 * Transport : <b>HTTP and HTTPS</b><br>
47 * HTTPS Authentication is disabled by default. Administrator can enable it in
48 * tomcat-server.xml after adding a proper keystore / SSL certificate from a
49 * trusted authority.<br>
51 * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
54 @Path("/lbaas/healthmonitors")
55 public class NeutronLoadBalancerHealthMonitorNorthbound {
57 private static final int HTTP_OK_BOTTOM = 200;
58 private static final int HTTP_OK_TOP = 299;
59 private static final String INTERFACE_NAME = "LoadBalancerHealthMonitor CRUD Interface";
60 private static final String UUID_NO_EXIST = "LoadBalancerHealthMonitor UUID does not exist.";
61 private static final String NO_PROVIDERS = "No providers registered. Please try again later";
62 private static final String NO_PROVIDER_LIST = "Couldn't get providers list. Please try again later";
65 private NeutronLoadBalancerHealthMonitor extractFields(NeutronLoadBalancerHealthMonitor o, List<String> fields) {
66 return o.extractFields(fields);
70 * Returns a list of all LoadBalancerHealthMonitor */
72 @Produces({ MediaType.APPLICATION_JSON })
74 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
75 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
76 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
77 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
79 public Response listGroups(
81 @QueryParam("fields") List<String> fields,
82 // OpenStack LoadBalancerHealthMonitor attributes
83 @QueryParam("id") String queryLoadBalancerHealthMonitorID,
84 @QueryParam("tenant_id") String queryLoadBalancerHealthMonitorTenantID,
85 // TODO "type" is being a property by the JSON parser.
86 @QueryParam("type") String queryLoadBalancerHealthMonitorType,
87 @QueryParam("delay") Integer queryLoadBalancerHealthMonitorDelay,
88 @QueryParam("timeout") Integer queryLoadBalancerHealthMonitorTimeout,
89 @QueryParam("max_retries") Integer queryLoadBalancerHealthMonitorMaxRetries,
90 @QueryParam("http_method") String queryLoadBalancerHealthMonitorHttpMethod,
91 @QueryParam("url_path") String queryLoadBalancerHealthMonitorUrlPath,
92 @QueryParam("expected_codes") String queryLoadBalancerHealthMonitorExpectedCodes,
93 @QueryParam("admin_state_up") Boolean queryLoadBalancerHealthMonitorIsAdminStateUp,
95 @QueryParam("limit") String limit,
96 @QueryParam("marker") String marker,
97 @QueryParam("page_reverse") String pageReverse
98 // sorting not supported
100 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
101 .getINeutronLoadBalancerHealthMonitorCRUD(this);
102 if (loadBalancerHealthMonitorInterface == null) {
103 throw new ServiceUnavailableException(INTERFACE_NAME
104 + RestMessages.SERVICEUNAVAILABLE.toString());
106 List<NeutronLoadBalancerHealthMonitor> allLoadBalancerHealthMonitors = loadBalancerHealthMonitorInterface.getAllNeutronLoadBalancerHealthMonitors();
107 List<NeutronLoadBalancerHealthMonitor> ans = new ArrayList<NeutronLoadBalancerHealthMonitor>();
108 Iterator<NeutronLoadBalancerHealthMonitor> i = allLoadBalancerHealthMonitors.iterator();
109 while (i.hasNext()) {
110 NeutronLoadBalancerHealthMonitor nsg = i.next();
111 if ((queryLoadBalancerHealthMonitorID == null ||
112 queryLoadBalancerHealthMonitorID.equals(nsg.getLoadBalancerHealthMonitorID())) &&
113 (queryLoadBalancerHealthMonitorTenantID == null ||
114 queryLoadBalancerHealthMonitorTenantID.equals
115 (nsg.getLoadBalancerHealthMonitorTenantID())) &&
116 (queryLoadBalancerHealthMonitorType == null ||
117 queryLoadBalancerHealthMonitorType.equals
118 (nsg.getLoadBalancerHealthMonitorType())) &&
119 (queryLoadBalancerHealthMonitorDelay == null ||
120 queryLoadBalancerHealthMonitorDelay.equals
121 (nsg.getLoadBalancerHealthMonitorDelay())) &&
122 (queryLoadBalancerHealthMonitorTimeout == null ||
123 queryLoadBalancerHealthMonitorTimeout.equals
124 (nsg.getLoadBalancerHealthMonitorTimeout())) &&
125 (queryLoadBalancerHealthMonitorMaxRetries == null ||
126 queryLoadBalancerHealthMonitorMaxRetries.equals
127 (nsg.getLoadBalancerHealthMonitorMaxRetries())) &&
128 (queryLoadBalancerHealthMonitorHttpMethod == null ||
129 queryLoadBalancerHealthMonitorHttpMethod.equals
130 (nsg.getLoadBalancerHealthMonitorHttpMethod())) &&
131 (queryLoadBalancerHealthMonitorUrlPath == null ||
132 queryLoadBalancerHealthMonitorUrlPath.equals
133 (nsg.getLoadBalancerHealthMonitorUrlPath())) &&
134 (queryLoadBalancerHealthMonitorExpectedCodes == null ||
135 queryLoadBalancerHealthMonitorExpectedCodes.equals
136 (nsg.getLoadBalancerHealthMonitorExpectedCodes())) &&
137 (queryLoadBalancerHealthMonitorIsAdminStateUp == null ||
138 queryLoadBalancerHealthMonitorIsAdminStateUp.equals
139 (nsg.getLoadBalancerHealthMonitorAdminStateIsUp()))) {
140 if (fields.size() > 0) {
141 ans.add(extractFields(nsg,fields));
147 return Response.status(HttpURLConnection.HTTP_OK).entity(
148 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
152 * Returns a specific LoadBalancerHealthMonitor */
154 @Path("{loadBalancerHealthMonitorID}")
156 @Produces({ MediaType.APPLICATION_JSON })
158 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
159 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
160 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
161 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
162 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
163 public Response showLoadBalancerHealthMonitor(@PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
165 @QueryParam("fields") List<String> fields) {
166 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
167 if (loadBalancerHealthMonitorInterface == null) {
168 throw new ServiceUnavailableException(INTERFACE_NAME
169 + RestMessages.SERVICEUNAVAILABLE.toString());
171 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
172 throw new ResourceNotFoundException(UUID_NO_EXIST);
174 if (fields.size() > 0) {
175 NeutronLoadBalancerHealthMonitor ans = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
176 return Response.status(HttpURLConnection.HTTP_OK).entity(
177 new NeutronLoadBalancerHealthMonitorRequest(extractFields(ans, fields))).build();
179 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest(loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID))).build();
184 * Creates new LoadBalancerHealthMonitor */
187 @Produces({ MediaType.APPLICATION_JSON })
188 @Consumes({ MediaType.APPLICATION_JSON })
190 @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
191 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
192 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
193 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
194 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
195 @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
196 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
197 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
198 public Response createLoadBalancerHealthMonitors(final NeutronLoadBalancerHealthMonitorRequest input) {
199 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
200 if (loadBalancerHealthMonitorInterface == null) {
201 throw new ServiceUnavailableException(INTERFACE_NAME
202 + RestMessages.SERVICEUNAVAILABLE.toString());
204 if (input.isSingleton()) {
205 NeutronLoadBalancerHealthMonitor singleton = input.getSingleton();
208 * Verify that the LoadBalancerHealthMonitor doesn't already exist.
210 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(singleton.getLoadBalancerHealthMonitorID())) {
211 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
214 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
215 if (instances != null) {
216 if (instances.length > 0) {
217 for (Object instance : instances) {
218 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
219 int status = service.canCreateNeutronLoadBalancerHealthMonitor(singleton);
220 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
221 return Response.status(status).build();
225 throw new ServiceUnavailableException(NO_PROVIDERS);
228 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
230 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
231 if (instances != null) {
232 for (Object instance : instances) {
233 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
234 service.neutronLoadBalancerHealthMonitorCreated(singleton);
238 List<NeutronLoadBalancerHealthMonitor> bulk = input.getBulk();
239 Iterator<NeutronLoadBalancerHealthMonitor> i = bulk.iterator();
240 HashMap<String, NeutronLoadBalancerHealthMonitor> testMap = new HashMap<String, NeutronLoadBalancerHealthMonitor>();
241 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
242 while (i.hasNext()) {
243 NeutronLoadBalancerHealthMonitor test = i.next();
246 * Verify that the firewall policy doesn't already exist
249 if (loadBalancerHealthMonitorInterface
250 .neutronLoadBalancerHealthMonitorExists(test.getLoadBalancerHealthMonitorID())) {
251 throw new BadRequestException("LoadBalancerHealthMonitor UUID already is already created");
253 if (testMap.containsKey(test.getLoadBalancerHealthMonitorID())) {
254 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
256 if (instances != null) {
257 if (instances.length > 0) {
258 for (Object instance : instances) {
259 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
260 int status = service.canCreateNeutronLoadBalancerHealthMonitor(test);
261 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
262 return Response.status(status).build();
266 throw new ServiceUnavailableException(NO_PROVIDERS);
269 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
273 * now, each element of the bulk request can be added to the cache
276 while (i.hasNext()) {
277 NeutronLoadBalancerHealthMonitor test = i.next();
278 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(test);
279 if (instances != null) {
280 for (Object instance : instances) {
281 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
282 service.neutronLoadBalancerHealthMonitorCreated(test);
287 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
291 * Updates a LoadBalancerHealthMonitor Policy
293 @Path("{loadBalancerHealthMonitorID}")
295 @Produces({ MediaType.APPLICATION_JSON })
296 @Consumes({ MediaType.APPLICATION_JSON })
298 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
299 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
300 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
301 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
302 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
303 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
304 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
305 public Response updateLoadBalancerHealthMonitor(
306 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
307 final NeutronLoadBalancerHealthMonitorRequest input) {
308 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
309 .getINeutronLoadBalancerHealthMonitorCRUD(this);
310 if (loadBalancerHealthMonitorInterface == null) {
311 throw new ServiceUnavailableException(INTERFACE_NAME
312 + RestMessages.SERVICEUNAVAILABLE.toString());
316 * verify the LoadBalancerHealthMonitor exists and there is only one delta provided
318 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
319 throw new ResourceNotFoundException(UUID_NO_EXIST);
321 if (!input.isSingleton()) {
322 throw new BadRequestException("Only singleton edit supported");
324 NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
325 NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
326 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
329 * updates restricted by Neutron
331 if (delta.getLoadBalancerHealthMonitorID() != null ||
332 delta.getLoadBalancerHealthMonitorTenantID() != null ||
333 delta.getLoadBalancerHealthMonitorType() != null ||
334 delta.getLoadBalancerHealthMonitorDelay() != null ||
335 delta.getLoadBalancerHealthMonitorTimeout() != null ||
336 delta.getLoadBalancerHealthMonitorMaxRetries() != null ||
337 delta.getLoadBalancerHealthMonitorHttpMethod() != null ||
338 delta.getLoadBalancerHealthMonitorUrlPath() != null ||
339 delta.getLoadBalancerHealthMonitorExpectedCodes() != null ||
340 delta.getLoadBalancerHealthMonitorAdminStateIsUp() != null) {
341 throw new BadRequestException("Attribute edit blocked by Neutron");
344 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
345 if (instances != null) {
346 if (instances.length > 0) {
347 for (Object instance : instances) {
348 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
349 int status = service.canUpdateNeutronLoadBalancerHealthMonitor(delta, original);
350 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
351 return Response.status(status).build();
355 throw new ServiceUnavailableException(NO_PROVIDERS);
358 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
362 * update the object and return it
364 loadBalancerHealthMonitorInterface.updateNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID, delta);
365 NeutronLoadBalancerHealthMonitor updatedLoadBalancerHealthMonitor = loadBalancerHealthMonitorInterface
366 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
367 if (instances != null) {
368 for (Object instance : instances) {
369 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
370 service.neutronLoadBalancerHealthMonitorUpdated(updatedLoadBalancerHealthMonitor);
373 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest
374 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
375 (loadBalancerHealthMonitorID))).build();
381 * Deletes a LoadBalancerHealthMonitor
383 @Path("{loadBalancerHealthMonitorID}")
386 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
387 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
388 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
389 @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
390 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
391 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
392 public Response deleteLoadBalancerHealthMonitor(
393 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID) {
394 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
395 if (loadBalancerHealthMonitorInterface == null) {
396 throw new ServiceUnavailableException(INTERFACE_NAME
397 + RestMessages.SERVICEUNAVAILABLE.toString());
400 * verify the LoadBalancerHealthMonitor exists and it isn't currently in use
402 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
403 throw new ResourceNotFoundException(UUID_NO_EXIST);
405 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorInUse(loadBalancerHealthMonitorID)) {
406 return Response.status(HttpURLConnection.HTTP_CONFLICT).build();
408 NeutronLoadBalancerHealthMonitor singleton = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
409 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
410 if (instances != null) {
411 if (instances.length > 0) {
412 for (Object instance : instances) {
413 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
414 int status = service.canDeleteNeutronLoadBalancerHealthMonitor(singleton);
415 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
416 return Response.status(status).build();
420 throw new ServiceUnavailableException(NO_PROVIDERS);
423 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
425 loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
426 if (instances != null) {
427 for (Object instance : instances) {
428 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
429 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
432 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();