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;
19 import javax.ws.rs.Consumes;
20 import javax.ws.rs.DELETE;
21 import javax.ws.rs.GET;
22 import javax.ws.rs.POST;
23 import javax.ws.rs.PUT;
24 import javax.ws.rs.Path;
25 import javax.ws.rs.PathParam;
26 import javax.ws.rs.Produces;
27 import javax.ws.rs.QueryParam;
28 import javax.ws.rs.core.MediaType;
29 import javax.ws.rs.core.Response;
31 import org.codehaus.enunciate.jaxrs.ResponseCode;
32 import org.codehaus.enunciate.jaxrs.StatusCodes;
33 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorAware;
34 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorCRUD;
35 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
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);
70 private NeutronCRUDInterfaces getNeutronInterfaces() {
71 NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronLoadBalancerHealthMonitorCRUD(this);
72 if (answer.getLoadBalancerHealthMonitorInterface() == null) {
73 throw new ServiceUnavailableException(INTERFACE_NAME
74 + RestMessages.SERVICEUNAVAILABLE.toString());
80 * Returns a list of all LoadBalancerHealthMonitor */
82 @Produces({ MediaType.APPLICATION_JSON })
84 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
85 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
86 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
87 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
89 public Response listGroups(
91 @QueryParam("fields") List<String> fields,
92 // OpenStack LoadBalancerHealthMonitor attributes
93 @QueryParam("id") String queryLoadBalancerHealthMonitorID,
94 @QueryParam("tenant_id") String queryLoadBalancerHealthMonitorTenantID,
95 // TODO "type" is being a property by the JSON parser.
96 @QueryParam("type") String queryLoadBalancerHealthMonitorType,
97 @QueryParam("delay") Integer queryLoadBalancerHealthMonitorDelay,
98 @QueryParam("timeout") Integer queryLoadBalancerHealthMonitorTimeout,
99 @QueryParam("max_retries") Integer queryLoadBalancerHealthMonitorMaxRetries,
100 @QueryParam("http_method") String queryLoadBalancerHealthMonitorHttpMethod,
101 @QueryParam("url_path") String queryLoadBalancerHealthMonitorUrlPath,
102 @QueryParam("expected_codes") String queryLoadBalancerHealthMonitorExpectedCodes,
103 @QueryParam("admin_state_up") Boolean queryLoadBalancerHealthMonitorIsAdminStateUp,
105 @QueryParam("limit") String limit,
106 @QueryParam("marker") String marker,
107 @QueryParam("page_reverse") String pageReverse
108 // sorting not supported
110 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
111 List<NeutronLoadBalancerHealthMonitor> allLoadBalancerHealthMonitors = loadBalancerHealthMonitorInterface.getAllNeutronLoadBalancerHealthMonitors();
112 List<NeutronLoadBalancerHealthMonitor> ans = new ArrayList<NeutronLoadBalancerHealthMonitor>();
113 Iterator<NeutronLoadBalancerHealthMonitor> i = allLoadBalancerHealthMonitors.iterator();
114 while (i.hasNext()) {
115 NeutronLoadBalancerHealthMonitor nsg = i.next();
116 if ((queryLoadBalancerHealthMonitorID == null ||
117 queryLoadBalancerHealthMonitorID.equals(nsg.getLoadBalancerHealthMonitorID())) &&
118 (queryLoadBalancerHealthMonitorTenantID == null ||
119 queryLoadBalancerHealthMonitorTenantID.equals
120 (nsg.getLoadBalancerHealthMonitorTenantID())) &&
121 (queryLoadBalancerHealthMonitorType == null ||
122 queryLoadBalancerHealthMonitorType.equals
123 (nsg.getLoadBalancerHealthMonitorType())) &&
124 (queryLoadBalancerHealthMonitorDelay == null ||
125 queryLoadBalancerHealthMonitorDelay.equals
126 (nsg.getLoadBalancerHealthMonitorDelay())) &&
127 (queryLoadBalancerHealthMonitorTimeout == null ||
128 queryLoadBalancerHealthMonitorTimeout.equals
129 (nsg.getLoadBalancerHealthMonitorTimeout())) &&
130 (queryLoadBalancerHealthMonitorMaxRetries == null ||
131 queryLoadBalancerHealthMonitorMaxRetries.equals
132 (nsg.getLoadBalancerHealthMonitorMaxRetries())) &&
133 (queryLoadBalancerHealthMonitorHttpMethod == null ||
134 queryLoadBalancerHealthMonitorHttpMethod.equals
135 (nsg.getLoadBalancerHealthMonitorHttpMethod())) &&
136 (queryLoadBalancerHealthMonitorUrlPath == null ||
137 queryLoadBalancerHealthMonitorUrlPath.equals
138 (nsg.getLoadBalancerHealthMonitorUrlPath())) &&
139 (queryLoadBalancerHealthMonitorExpectedCodes == null ||
140 queryLoadBalancerHealthMonitorExpectedCodes.equals
141 (nsg.getLoadBalancerHealthMonitorExpectedCodes())) &&
142 (queryLoadBalancerHealthMonitorIsAdminStateUp == null ||
143 queryLoadBalancerHealthMonitorIsAdminStateUp.equals
144 (nsg.getLoadBalancerHealthMonitorAdminStateIsUp()))) {
145 if (fields.size() > 0) {
146 ans.add(extractFields(nsg,fields));
152 return Response.status(HttpURLConnection.HTTP_OK).entity(
153 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
157 * Returns a specific LoadBalancerHealthMonitor */
159 @Path("{loadBalancerHealthMonitorID}")
161 @Produces({ MediaType.APPLICATION_JSON })
163 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
164 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
165 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
166 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
167 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
168 public Response showLoadBalancerHealthMonitor(@PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
170 @QueryParam("fields") List<String> fields) {
171 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
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 = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
201 if (input.isSingleton()) {
202 NeutronLoadBalancerHealthMonitor singleton = input.getSingleton();
204 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
205 if (instances != null) {
206 if (instances.length > 0) {
207 for (Object instance : instances) {
208 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
209 int status = service.canCreateNeutronLoadBalancerHealthMonitor(singleton);
210 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
211 return Response.status(status).build();
215 throw new ServiceUnavailableException(NO_PROVIDERS);
218 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
220 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
221 if (instances != null) {
222 for (Object instance : instances) {
223 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
224 service.neutronLoadBalancerHealthMonitorCreated(singleton);
228 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
229 for (NeutronLoadBalancerHealthMonitor test : input.getBulk()) {
230 if (instances != null) {
231 if (instances.length > 0) {
232 for (Object instance : instances) {
233 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
234 int status = service.canCreateNeutronLoadBalancerHealthMonitor(test);
235 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
236 return Response.status(status).build();
240 throw new ServiceUnavailableException(NO_PROVIDERS);
243 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
247 * now, each element of the bulk request can be added to the cache
249 for (NeutronLoadBalancerHealthMonitor test : input.getBulk()) {
250 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(test);
251 if (instances != null) {
252 for (Object instance : instances) {
253 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
254 service.neutronLoadBalancerHealthMonitorCreated(test);
259 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
263 * Updates a LoadBalancerHealthMonitor Policy
265 @Path("{loadBalancerHealthMonitorID}")
267 @Produces({ MediaType.APPLICATION_JSON })
268 @Consumes({ MediaType.APPLICATION_JSON })
270 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
271 @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
272 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
273 @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
274 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
275 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
276 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
277 public Response updateLoadBalancerHealthMonitor(
278 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
279 final NeutronLoadBalancerHealthMonitorRequest input) {
280 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
282 NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
283 NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
284 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
286 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
287 if (instances != null) {
288 if (instances.length > 0) {
289 for (Object instance : instances) {
290 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
291 int status = service.canUpdateNeutronLoadBalancerHealthMonitor(delta, original);
292 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
293 return Response.status(status).build();
297 throw new ServiceUnavailableException(NO_PROVIDERS);
300 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
304 * update the object and return it
306 loadBalancerHealthMonitorInterface.updateNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID, delta);
307 NeutronLoadBalancerHealthMonitor updatedLoadBalancerHealthMonitor = loadBalancerHealthMonitorInterface
308 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
309 if (instances != null) {
310 for (Object instance : instances) {
311 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
312 service.neutronLoadBalancerHealthMonitorUpdated(updatedLoadBalancerHealthMonitor);
315 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest
316 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
317 (loadBalancerHealthMonitorID))).build();
323 * Deletes a LoadBalancerHealthMonitor
325 @Path("{loadBalancerHealthMonitorID}")
328 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
329 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
330 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
331 @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
332 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
333 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
334 public Response deleteLoadBalancerHealthMonitor(
335 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID) {
336 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
337 NeutronLoadBalancerHealthMonitor singleton = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
339 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
340 if (instances != null) {
341 if (instances.length > 0) {
342 for (Object instance : instances) {
343 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
344 int status = service.canDeleteNeutronLoadBalancerHealthMonitor(singleton);
345 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
346 return Response.status(status).build();
350 throw new ServiceUnavailableException(NO_PROVIDERS);
353 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
355 loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
356 if (instances != null) {
357 for (Object instance : instances) {
358 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
359 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
362 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();