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);
69 private NeutronCRUDInterfaces getNeutronInterfaces() {
70 NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronLoadBalancerHealthMonitorCRUD(this);
71 if (answer.getLoadBalancerHealthMonitorInterface() == null) {
72 throw new ServiceUnavailableException(INTERFACE_NAME
73 + RestMessages.SERVICEUNAVAILABLE.toString());
79 * Returns a list of all LoadBalancerHealthMonitor */
81 @Produces({ MediaType.APPLICATION_JSON })
83 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
84 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
85 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
86 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
88 public Response listGroups(
90 @QueryParam("fields") List<String> fields,
91 // OpenStack LoadBalancerHealthMonitor attributes
92 @QueryParam("id") String queryLoadBalancerHealthMonitorID,
93 @QueryParam("tenant_id") String queryLoadBalancerHealthMonitorTenantID,
94 // TODO "type" is being a property by the JSON parser.
95 @QueryParam("type") String queryLoadBalancerHealthMonitorType,
96 @QueryParam("delay") Integer queryLoadBalancerHealthMonitorDelay,
97 @QueryParam("timeout") Integer queryLoadBalancerHealthMonitorTimeout,
98 @QueryParam("max_retries") Integer queryLoadBalancerHealthMonitorMaxRetries,
99 @QueryParam("http_method") String queryLoadBalancerHealthMonitorHttpMethod,
100 @QueryParam("url_path") String queryLoadBalancerHealthMonitorUrlPath,
101 @QueryParam("expected_codes") String queryLoadBalancerHealthMonitorExpectedCodes,
102 @QueryParam("admin_state_up") Boolean queryLoadBalancerHealthMonitorIsAdminStateUp,
104 @QueryParam("limit") String limit,
105 @QueryParam("marker") String marker,
106 @QueryParam("page_reverse") String pageReverse
107 // sorting not supported
109 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
110 List<NeutronLoadBalancerHealthMonitor> allLoadBalancerHealthMonitors = loadBalancerHealthMonitorInterface.getAllNeutronLoadBalancerHealthMonitors();
111 List<NeutronLoadBalancerHealthMonitor> ans = new ArrayList<NeutronLoadBalancerHealthMonitor>();
112 Iterator<NeutronLoadBalancerHealthMonitor> i = allLoadBalancerHealthMonitors.iterator();
113 while (i.hasNext()) {
114 NeutronLoadBalancerHealthMonitor nsg = i.next();
115 if ((queryLoadBalancerHealthMonitorID == null ||
116 queryLoadBalancerHealthMonitorID.equals(nsg.getLoadBalancerHealthMonitorID())) &&
117 (queryLoadBalancerHealthMonitorTenantID == null ||
118 queryLoadBalancerHealthMonitorTenantID.equals
119 (nsg.getLoadBalancerHealthMonitorTenantID())) &&
120 (queryLoadBalancerHealthMonitorType == null ||
121 queryLoadBalancerHealthMonitorType.equals
122 (nsg.getLoadBalancerHealthMonitorType())) &&
123 (queryLoadBalancerHealthMonitorDelay == null ||
124 queryLoadBalancerHealthMonitorDelay.equals
125 (nsg.getLoadBalancerHealthMonitorDelay())) &&
126 (queryLoadBalancerHealthMonitorTimeout == null ||
127 queryLoadBalancerHealthMonitorTimeout.equals
128 (nsg.getLoadBalancerHealthMonitorTimeout())) &&
129 (queryLoadBalancerHealthMonitorMaxRetries == null ||
130 queryLoadBalancerHealthMonitorMaxRetries.equals
131 (nsg.getLoadBalancerHealthMonitorMaxRetries())) &&
132 (queryLoadBalancerHealthMonitorHttpMethod == null ||
133 queryLoadBalancerHealthMonitorHttpMethod.equals
134 (nsg.getLoadBalancerHealthMonitorHttpMethod())) &&
135 (queryLoadBalancerHealthMonitorUrlPath == null ||
136 queryLoadBalancerHealthMonitorUrlPath.equals
137 (nsg.getLoadBalancerHealthMonitorUrlPath())) &&
138 (queryLoadBalancerHealthMonitorExpectedCodes == null ||
139 queryLoadBalancerHealthMonitorExpectedCodes.equals
140 (nsg.getLoadBalancerHealthMonitorExpectedCodes())) &&
141 (queryLoadBalancerHealthMonitorIsAdminStateUp == null ||
142 queryLoadBalancerHealthMonitorIsAdminStateUp.equals
143 (nsg.getLoadBalancerHealthMonitorAdminStateIsUp()))) {
144 if (fields.size() > 0) {
145 ans.add(extractFields(nsg,fields));
151 return Response.status(HttpURLConnection.HTTP_OK).entity(
152 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
156 * Returns a specific LoadBalancerHealthMonitor */
158 @Path("{loadBalancerHealthMonitorID}")
160 @Produces({ MediaType.APPLICATION_JSON })
162 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
163 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
164 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
165 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
166 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
167 public Response showLoadBalancerHealthMonitor(@PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
169 @QueryParam("fields") List<String> fields) {
170 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
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 = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
200 if (input.isSingleton()) {
201 NeutronLoadBalancerHealthMonitor singleton = input.getSingleton();
204 * Verify that the LoadBalancerHealthMonitor doesn't already exist.
206 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(singleton.getLoadBalancerHealthMonitorID())) {
207 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
210 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
211 if (instances != null) {
212 if (instances.length > 0) {
213 for (Object instance : instances) {
214 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
215 int status = service.canCreateNeutronLoadBalancerHealthMonitor(singleton);
216 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
217 return Response.status(status).build();
221 throw new ServiceUnavailableException(NO_PROVIDERS);
224 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
226 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
227 if (instances != null) {
228 for (Object instance : instances) {
229 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
230 service.neutronLoadBalancerHealthMonitorCreated(singleton);
234 List<NeutronLoadBalancerHealthMonitor> bulk = input.getBulk();
235 Iterator<NeutronLoadBalancerHealthMonitor> i = bulk.iterator();
236 HashMap<String, NeutronLoadBalancerHealthMonitor> testMap = new HashMap<String, NeutronLoadBalancerHealthMonitor>();
237 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
238 while (i.hasNext()) {
239 NeutronLoadBalancerHealthMonitor test = i.next();
242 * Verify that the firewall policy doesn't already exist
245 if (loadBalancerHealthMonitorInterface
246 .neutronLoadBalancerHealthMonitorExists(test.getLoadBalancerHealthMonitorID())) {
247 throw new BadRequestException("LoadBalancerHealthMonitor UUID already is already created");
249 if (testMap.containsKey(test.getLoadBalancerHealthMonitorID())) {
250 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
252 if (instances != null) {
253 if (instances.length > 0) {
254 for (Object instance : instances) {
255 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
256 int status = service.canCreateNeutronLoadBalancerHealthMonitor(test);
257 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
258 return Response.status(status).build();
262 throw new ServiceUnavailableException(NO_PROVIDERS);
265 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
269 * now, each element of the bulk request can be added to the cache
272 while (i.hasNext()) {
273 NeutronLoadBalancerHealthMonitor test = i.next();
274 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(test);
275 if (instances != null) {
276 for (Object instance : instances) {
277 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
278 service.neutronLoadBalancerHealthMonitorCreated(test);
283 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
287 * Updates a LoadBalancerHealthMonitor Policy
289 @Path("{loadBalancerHealthMonitorID}")
291 @Produces({ MediaType.APPLICATION_JSON })
292 @Consumes({ MediaType.APPLICATION_JSON })
294 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
295 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
296 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
297 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
298 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
299 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
300 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
301 public Response updateLoadBalancerHealthMonitor(
302 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
303 final NeutronLoadBalancerHealthMonitorRequest input) {
304 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
307 * verify the LoadBalancerHealthMonitor exists and there is only one delta provided
309 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
310 throw new ResourceNotFoundException(UUID_NO_EXIST);
312 if (!input.isSingleton()) {
313 throw new BadRequestException("Only singleton edit supported");
315 NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
316 NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
317 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
320 * updates restricted by Neutron
322 if (delta.getLoadBalancerHealthMonitorID() != null ||
323 delta.getLoadBalancerHealthMonitorTenantID() != null ||
324 delta.getLoadBalancerHealthMonitorType() != null ||
325 delta.getLoadBalancerHealthMonitorDelay() != null ||
326 delta.getLoadBalancerHealthMonitorTimeout() != null ||
327 delta.getLoadBalancerHealthMonitorMaxRetries() != null ||
328 delta.getLoadBalancerHealthMonitorHttpMethod() != null ||
329 delta.getLoadBalancerHealthMonitorUrlPath() != null ||
330 delta.getLoadBalancerHealthMonitorExpectedCodes() != null ||
331 delta.getLoadBalancerHealthMonitorAdminStateIsUp() != null) {
332 throw new BadRequestException("Attribute edit blocked by Neutron");
335 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
336 if (instances != null) {
337 if (instances.length > 0) {
338 for (Object instance : instances) {
339 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
340 int status = service.canUpdateNeutronLoadBalancerHealthMonitor(delta, original);
341 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
342 return Response.status(status).build();
346 throw new ServiceUnavailableException(NO_PROVIDERS);
349 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
353 * update the object and return it
355 loadBalancerHealthMonitorInterface.updateNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID, delta);
356 NeutronLoadBalancerHealthMonitor updatedLoadBalancerHealthMonitor = loadBalancerHealthMonitorInterface
357 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
358 if (instances != null) {
359 for (Object instance : instances) {
360 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
361 service.neutronLoadBalancerHealthMonitorUpdated(updatedLoadBalancerHealthMonitor);
364 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest
365 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
366 (loadBalancerHealthMonitorID))).build();
372 * Deletes a LoadBalancerHealthMonitor
374 @Path("{loadBalancerHealthMonitorID}")
377 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
378 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
379 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
380 @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
381 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
382 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
383 public Response deleteLoadBalancerHealthMonitor(
384 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID) {
385 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
387 * verify the LoadBalancerHealthMonitor exists and it isn't currently in use
389 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
390 throw new ResourceNotFoundException(UUID_NO_EXIST);
392 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorInUse(loadBalancerHealthMonitorID)) {
393 return Response.status(HttpURLConnection.HTTP_CONFLICT).build();
395 NeutronLoadBalancerHealthMonitor singleton = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
396 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
397 if (instances != null) {
398 if (instances.length > 0) {
399 for (Object instance : instances) {
400 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
401 int status = service.canDeleteNeutronLoadBalancerHealthMonitor(singleton);
402 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
403 return Response.status(status).build();
407 throw new ServiceUnavailableException(NO_PROVIDERS);
410 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
412 loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
413 if (instances != null) {
414 for (Object instance : instances) {
415 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
416 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
419 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();