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.Iterator;
15 import java.util.List;
17 import javax.ws.rs.Consumes;
18 import javax.ws.rs.DELETE;
19 import javax.ws.rs.GET;
20 import javax.ws.rs.POST;
21 import javax.ws.rs.PUT;
22 import javax.ws.rs.Path;
23 import javax.ws.rs.PathParam;
24 import javax.ws.rs.Produces;
25 import javax.ws.rs.QueryParam;
26 import javax.ws.rs.core.MediaType;
27 import javax.ws.rs.core.Response;
29 import org.codehaus.enunciate.jaxrs.ResponseCode;
30 import org.codehaus.enunciate.jaxrs.StatusCodes;
31 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorAware;
32 import org.opendaylight.neutron.spi.INeutronLoadBalancerHealthMonitorCRUD;
33 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
34 import org.opendaylight.neutron.spi.NeutronLoadBalancerHealthMonitor;
37 * Neutron Northbound REST APIs for Load Balancer HealthMonitor.<br>
38 * This class provides REST APIs for managing neutron LoadBalancerHealthMonitor
42 * Authentication scheme : <b>HTTP Basic</b><br>
43 * Authentication realm : <b>opendaylight</b><br>
44 * Transport : <b>HTTP and HTTPS</b><br>
46 * HTTPS Authentication is disabled by default. Administrator can enable it in
47 * tomcat-server.xml after adding a proper keystore / SSL certificate from a
48 * trusted authority.<br>
50 * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
53 @Path("/lbaas/healthmonitors")
54 public class NeutronLoadBalancerHealthMonitorNorthbound {
56 private static final int HTTP_OK_BOTTOM = 200;
57 private static final int HTTP_OK_TOP = 299;
58 private static final String INTERFACE_NAME = "LoadBalancerHealthMonitor CRUD Interface";
59 private static final String UUID_NO_EXIST = "LoadBalancerHealthMonitor UUID does not exist.";
60 private static final String NO_PROVIDERS = "No providers registered. Please try again later";
61 private static final String NO_PROVIDER_LIST = "Couldn't get providers list. Please try again later";
64 private NeutronLoadBalancerHealthMonitor extractFields(NeutronLoadBalancerHealthMonitor o, List<String> fields) {
65 return o.extractFields(fields);
68 private NeutronCRUDInterfaces getNeutronInterfaces() {
69 NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronLoadBalancerHealthMonitorCRUD(this);
70 if (answer.getLoadBalancerHealthMonitorInterface() == null) {
71 throw new ServiceUnavailableException(INTERFACE_NAME
72 + RestMessages.SERVICEUNAVAILABLE.toString());
78 * Returns a list of all LoadBalancerHealthMonitor */
80 @Produces({ MediaType.APPLICATION_JSON })
82 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
83 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
84 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
85 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
87 public Response listGroups(
89 @QueryParam("fields") List<String> fields,
90 // OpenStack LoadBalancerHealthMonitor attributes
91 @QueryParam("id") String queryLoadBalancerHealthMonitorID,
92 @QueryParam("tenant_id") String queryLoadBalancerHealthMonitorTenantID,
93 // TODO "type" is being a property by the JSON parser.
94 @QueryParam("type") String queryLoadBalancerHealthMonitorType,
95 @QueryParam("delay") Integer queryLoadBalancerHealthMonitorDelay,
96 @QueryParam("timeout") Integer queryLoadBalancerHealthMonitorTimeout,
97 @QueryParam("max_retries") Integer queryLoadBalancerHealthMonitorMaxRetries,
98 @QueryParam("http_method") String queryLoadBalancerHealthMonitorHttpMethod,
99 @QueryParam("url_path") String queryLoadBalancerHealthMonitorUrlPath,
100 @QueryParam("expected_codes") String queryLoadBalancerHealthMonitorExpectedCodes,
101 @QueryParam("admin_state_up") Boolean queryLoadBalancerHealthMonitorIsAdminStateUp,
103 @QueryParam("limit") String limit,
104 @QueryParam("marker") String marker,
105 @QueryParam("page_reverse") String pageReverse
106 // sorting not supported
108 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
109 List<NeutronLoadBalancerHealthMonitor> allLoadBalancerHealthMonitors = loadBalancerHealthMonitorInterface.getAllNeutronLoadBalancerHealthMonitors();
110 List<NeutronLoadBalancerHealthMonitor> ans = new ArrayList<NeutronLoadBalancerHealthMonitor>();
111 Iterator<NeutronLoadBalancerHealthMonitor> i = allLoadBalancerHealthMonitors.iterator();
112 while (i.hasNext()) {
113 NeutronLoadBalancerHealthMonitor nsg = i.next();
114 if ((queryLoadBalancerHealthMonitorID == null ||
115 queryLoadBalancerHealthMonitorID.equals(nsg.getID())) &&
116 (queryLoadBalancerHealthMonitorTenantID == null ||
117 queryLoadBalancerHealthMonitorTenantID.equals
118 (nsg.getLoadBalancerHealthMonitorTenantID())) &&
119 (queryLoadBalancerHealthMonitorType == null ||
120 queryLoadBalancerHealthMonitorType.equals
121 (nsg.getLoadBalancerHealthMonitorType())) &&
122 (queryLoadBalancerHealthMonitorDelay == null ||
123 queryLoadBalancerHealthMonitorDelay.equals
124 (nsg.getLoadBalancerHealthMonitorDelay())) &&
125 (queryLoadBalancerHealthMonitorTimeout == null ||
126 queryLoadBalancerHealthMonitorTimeout.equals
127 (nsg.getLoadBalancerHealthMonitorTimeout())) &&
128 (queryLoadBalancerHealthMonitorMaxRetries == null ||
129 queryLoadBalancerHealthMonitorMaxRetries.equals
130 (nsg.getLoadBalancerHealthMonitorMaxRetries())) &&
131 (queryLoadBalancerHealthMonitorHttpMethod == null ||
132 queryLoadBalancerHealthMonitorHttpMethod.equals
133 (nsg.getLoadBalancerHealthMonitorHttpMethod())) &&
134 (queryLoadBalancerHealthMonitorUrlPath == null ||
135 queryLoadBalancerHealthMonitorUrlPath.equals
136 (nsg.getLoadBalancerHealthMonitorUrlPath())) &&
137 (queryLoadBalancerHealthMonitorExpectedCodes == null ||
138 queryLoadBalancerHealthMonitorExpectedCodes.equals
139 (nsg.getLoadBalancerHealthMonitorExpectedCodes())) &&
140 (queryLoadBalancerHealthMonitorIsAdminStateUp == null ||
141 queryLoadBalancerHealthMonitorIsAdminStateUp.equals
142 (nsg.getLoadBalancerHealthMonitorAdminStateIsUp()))) {
143 if (fields.size() > 0) {
144 ans.add(extractFields(nsg,fields));
150 return Response.status(HttpURLConnection.HTTP_OK).entity(
151 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
155 * Returns a specific LoadBalancerHealthMonitor */
157 @Path("{loadBalancerHealthMonitorID}")
159 @Produces({ MediaType.APPLICATION_JSON })
161 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
162 @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
163 @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
164 @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
165 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
166 public Response showLoadBalancerHealthMonitor(@PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
168 @QueryParam("fields") List<String> fields) {
169 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
170 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
171 throw new ResourceNotFoundException(UUID_NO_EXIST);
173 if (fields.size() > 0) {
174 NeutronLoadBalancerHealthMonitor ans = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
175 return Response.status(HttpURLConnection.HTTP_OK).entity(
176 new NeutronLoadBalancerHealthMonitorRequest(extractFields(ans, fields))).build();
178 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest(loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID))).build();
183 * Creates new LoadBalancerHealthMonitor */
186 @Produces({ MediaType.APPLICATION_JSON })
187 @Consumes({ MediaType.APPLICATION_JSON })
189 @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
190 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
191 public Response createLoadBalancerHealthMonitors(final NeutronLoadBalancerHealthMonitorRequest input) {
192 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
193 if (input.isSingleton()) {
194 NeutronLoadBalancerHealthMonitor singleton = input.getSingleton();
196 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
197 if (instances != null) {
198 if (instances.length > 0) {
199 for (Object instance : instances) {
200 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
201 int status = service.canCreateNeutronLoadBalancerHealthMonitor(singleton);
202 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
203 return Response.status(status).build();
207 throw new ServiceUnavailableException(NO_PROVIDERS);
210 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
212 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
213 if (instances != null) {
214 for (Object instance : instances) {
215 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
216 service.neutronLoadBalancerHealthMonitorCreated(singleton);
220 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
221 for (NeutronLoadBalancerHealthMonitor test : input.getBulk()) {
222 if (instances != null) {
223 if (instances.length > 0) {
224 for (Object instance : instances) {
225 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
226 int status = service.canCreateNeutronLoadBalancerHealthMonitor(test);
227 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
228 return Response.status(status).build();
232 throw new ServiceUnavailableException(NO_PROVIDERS);
235 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
239 * now, each element of the bulk request can be added to the cache
241 for (NeutronLoadBalancerHealthMonitor test : input.getBulk()) {
242 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(test);
243 if (instances != null) {
244 for (Object instance : instances) {
245 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
246 service.neutronLoadBalancerHealthMonitorCreated(test);
251 return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
255 * Updates a LoadBalancerHealthMonitor Policy
257 @Path("{loadBalancerHealthMonitorID}")
259 @Produces({ MediaType.APPLICATION_JSON })
260 @Consumes({ MediaType.APPLICATION_JSON })
262 @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
263 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
264 public Response updateLoadBalancerHealthMonitor(
265 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
266 final NeutronLoadBalancerHealthMonitorRequest input) {
267 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
269 NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
270 NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
271 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
273 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
274 if (instances != null) {
275 if (instances.length > 0) {
276 for (Object instance : instances) {
277 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
278 int status = service.canUpdateNeutronLoadBalancerHealthMonitor(delta, original);
279 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
280 return Response.status(status).build();
284 throw new ServiceUnavailableException(NO_PROVIDERS);
287 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
291 * update the object and return it
293 loadBalancerHealthMonitorInterface.updateNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID, delta);
294 NeutronLoadBalancerHealthMonitor updatedLoadBalancerHealthMonitor = loadBalancerHealthMonitorInterface
295 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
296 if (instances != null) {
297 for (Object instance : instances) {
298 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
299 service.neutronLoadBalancerHealthMonitorUpdated(updatedLoadBalancerHealthMonitor);
302 return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerHealthMonitorRequest
303 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
304 (loadBalancerHealthMonitorID))).build();
310 * Deletes a LoadBalancerHealthMonitor
312 @Path("{loadBalancerHealthMonitorID}")
315 @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
316 @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
317 public Response deleteLoadBalancerHealthMonitor(
318 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID) {
319 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = getNeutronInterfaces().getLoadBalancerHealthMonitorInterface();
320 NeutronLoadBalancerHealthMonitor singleton = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
322 Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerHealthMonitorAware.class, this);
323 if (instances != null) {
324 if (instances.length > 0) {
325 for (Object instance : instances) {
326 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
327 int status = service.canDeleteNeutronLoadBalancerHealthMonitor(singleton);
328 if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
329 return Response.status(status).build();
333 throw new ServiceUnavailableException(NO_PROVIDERS);
336 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
338 loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
339 if (instances != null) {
340 for (Object instance : instances) {
341 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
342 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
345 return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();