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.controller.networkconfig.neutron.northbound;
12 import org.codehaus.enunciate.jaxrs.ResponseCode;
13 import org.codehaus.enunciate.jaxrs.StatusCodes;
14 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerHealthMonitorAware;
15 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerHealthMonitorCRUD;
16 import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces;
17 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancer;
18 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerHealthMonitor;
19 import org.opendaylight.controller.northbound.commons.RestMessages;
20 import org.opendaylight.controller.northbound.commons.exception.BadRequestException;
21 import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
22 import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException;
23 import org.opendaylight.controller.sal.utils.ServiceHelper;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
27 import javax.ws.rs.Consumes;
28 import javax.ws.rs.DELETE;
29 import javax.ws.rs.GET;
30 import javax.ws.rs.POST;
31 import javax.ws.rs.PUT;
32 import javax.ws.rs.Path;
33 import javax.ws.rs.PathParam;
34 import javax.ws.rs.Produces;
35 import javax.ws.rs.QueryParam;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.Response;
38 import java.util.ArrayList;
39 import java.util.HashMap;
40 import java.util.Iterator;
41 import java.util.List;
44 * Neutron Northbound REST APIs for Load Balancer HealthMonitor.<br>
45 * This class provides REST APIs for managing neutron LoadBalancerHealthMonitor
49 * Authentication scheme : <b>HTTP Basic</b><br>
50 * Authentication realm : <b>opendaylight</b><br>
51 * Transport : <b>HTTP and HTTPS</b><br>
53 * HTTPS Authentication is disabled by default. Administrator can enable it in
54 * tomcat-server.xml after adding a proper keystore / SSL certificate from a
55 * trusted authority.<br>
57 * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
60 @Path("/healthmonitors")
61 public class NeutronLoadBalancerHealthMonitorNorthbound {
62 private static final Logger logger = LoggerFactory.getLogger(NeutronLoadBalancer.class);
64 private NeutronLoadBalancerHealthMonitor extractFields(NeutronLoadBalancerHealthMonitor o, List<String> fields) {
65 return o.extractFields(fields);
69 * Returns a list of all LoadBalancerHealthMonitor */
71 @Produces({ MediaType.APPLICATION_JSON })
73 @ResponseCode(code = 200, condition = "Operation successful"),
74 @ResponseCode(code = 401, condition = "Unauthorized"),
75 @ResponseCode(code = 501, condition = "Not Implemented") })
77 public Response listGroups(
79 @QueryParam("fields") List<String> fields,
80 // OpenStack LoadBalancerHealthMonitor attributes
81 @QueryParam("id") String queryLoadBalancerHealthMonitorID,
82 @QueryParam("tenant_id") String queryLoadBalancerHealthMonitorTenantID,
83 // TODO "type" is being a property by the JSON parser.
84 @QueryParam("type") String queryLoadBalancerHealthMonitorType,
85 @QueryParam("delay") Integer queryLoadBalancerHealthMonitorDelay,
86 @QueryParam("timeout") Integer queryLoadBalancerHealthMonitorTimeout,
87 @QueryParam("max_retries") Integer queryLoadBalancerHealthMonitorMaxRetries,
88 @QueryParam("http_method") String queryLoadBalancerHealthMonitorHttpMethod,
89 @QueryParam("url_path") String queryLoadBalancerHealthMonitorUrlPath,
90 @QueryParam("expected_codes") String queryLoadBalancerHealthMonitorExpectedCodes,
91 @QueryParam("admin_state_up") Boolean queryLoadBalancerHealthMonitorIsAdminStateUp,
92 @QueryParam("status") String queryLoadBalancerHealthMonitorStatus,
94 @QueryParam("limit") String limit,
95 @QueryParam("marker") String marker,
96 @QueryParam("page_reverse") String pageReverse
97 // sorting not supported
99 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
100 .getINeutronLoadBalancerHealthMonitorCRUD(this);
101 if (loadBalancerHealthMonitorInterface == null) {
102 throw new ServiceUnavailableException("LoadBalancerHealthMonitor CRUD Interface "
103 + RestMessages.SERVICEUNAVAILABLE.toString());
105 List<NeutronLoadBalancerHealthMonitor> allLoadBalancerHealthMonitors = loadBalancerHealthMonitorInterface.getAllNeutronLoadBalancerHealthMonitors();
106 List<NeutronLoadBalancerHealthMonitor> ans = new ArrayList<NeutronLoadBalancerHealthMonitor>();
107 Iterator<NeutronLoadBalancerHealthMonitor> i = allLoadBalancerHealthMonitors.iterator();
108 while (i.hasNext()) {
109 NeutronLoadBalancerHealthMonitor nsg = i.next();
110 if ((queryLoadBalancerHealthMonitorID == null ||
111 queryLoadBalancerHealthMonitorID.equals(nsg.getLoadBalancerHealthMonitorID())) &&
112 (queryLoadBalancerHealthMonitorTenantID == null ||
113 queryLoadBalancerHealthMonitorTenantID.equals
114 (nsg.getLoadBalancerHealthMonitorTenantID())) &&
115 (queryLoadBalancerHealthMonitorType == null ||
116 queryLoadBalancerHealthMonitorType.equals
117 (nsg.getLoadBalancerHealthMonitorType())) &&
118 (queryLoadBalancerHealthMonitorDelay == null ||
119 queryLoadBalancerHealthMonitorDelay.equals
120 (nsg.getLoadBalancerHealthMonitorDelay())) &&
121 (queryLoadBalancerHealthMonitorTimeout == null ||
122 queryLoadBalancerHealthMonitorTimeout.equals
123 (nsg.getLoadBalancerHealthMonitorTimeout())) &&
124 (queryLoadBalancerHealthMonitorMaxRetries == null ||
125 queryLoadBalancerHealthMonitorMaxRetries.equals
126 (nsg.getLoadBalancerHealthMonitorMaxRetries())) &&
127 (queryLoadBalancerHealthMonitorHttpMethod == null ||
128 queryLoadBalancerHealthMonitorHttpMethod.equals
129 (nsg.getLoadBalancerHealthMonitorHttpMethod())) &&
130 (queryLoadBalancerHealthMonitorUrlPath == null ||
131 queryLoadBalancerHealthMonitorUrlPath.equals
132 (nsg.getLoadBalancerHealthMonitorUrlPath())) &&
133 (queryLoadBalancerHealthMonitorExpectedCodes == null ||
134 queryLoadBalancerHealthMonitorExpectedCodes.equals
135 (nsg.getLoadBalancerHealthMonitorExpectedCodes())) &&
136 (queryLoadBalancerHealthMonitorIsAdminStateUp == null ||
137 queryLoadBalancerHealthMonitorIsAdminStateUp.equals
138 (nsg.getLoadBalancerHealthMonitorAdminStateIsUp())) &&
139 (queryLoadBalancerHealthMonitorStatus == null ||
140 queryLoadBalancerHealthMonitorStatus.equals
141 (nsg.getLoadBalancerHealthMonitorStatus()))) {
142 if (fields.size() > 0) {
143 ans.add(extractFields(nsg,fields));
149 return Response.status(200).entity(
150 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
154 * Returns a specific LoadBalancerHealthMonitor */
156 @Path("{loadBalancerHealthMonitorID}")
158 @Produces({ MediaType.APPLICATION_JSON })
160 @ResponseCode(code = 200, condition = "Operation successful"),
161 @ResponseCode(code = 401, condition = "Unauthorized"),
162 @ResponseCode(code = 404, condition = "Not Found"),
163 @ResponseCode(code = 501, condition = "Not Implemented") })
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("LoadBalancerHealthMonitor CRUD Interface "
170 + RestMessages.SERVICEUNAVAILABLE.toString());
172 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
173 throw new ResourceNotFoundException("LoadBalancerHealthMonitor UUID does not exist.");
175 if (fields.size() > 0) {
176 NeutronLoadBalancerHealthMonitor ans = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
177 return Response.status(200).entity(
178 new NeutronLoadBalancerHealthMonitorRequest(extractFields(ans, fields))).build();
180 return Response.status(200).entity(new NeutronLoadBalancerHealthMonitorRequest(loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID))).build();
185 * Creates new LoadBalancerHealthMonitor */
188 @Produces({ MediaType.APPLICATION_JSON })
189 @Consumes({ MediaType.APPLICATION_JSON })
191 @ResponseCode(code = 201, condition = "Created"),
192 @ResponseCode(code = 400, condition = "Bad Request"),
193 @ResponseCode(code = 401, condition = "Unauthorized"),
194 @ResponseCode(code = 403, condition = "Forbidden"),
195 @ResponseCode(code = 404, condition = "Not Found"),
196 @ResponseCode(code = 409, condition = "Conflict"),
197 @ResponseCode(code = 501, condition = "Not Implemented") })
198 public Response createLoadBalancerHealthMonitors(final NeutronLoadBalancerHealthMonitorRequest input) {
199 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
200 if (loadBalancerHealthMonitorInterface == null) {
201 throw new ServiceUnavailableException("LoadBalancerHealthMonitor CRUD Interface "
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");
213 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
215 Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerHealthMonitorAware.class, this, null);
216 if (instances != null) {
217 for (Object instance : instances) {
218 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
219 int status = service.canCreateNeutronLoadBalancerHealthMonitor(singleton);
220 if (status < 200 || status > 299) {
221 return Response.status(status).build();
225 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
226 if (instances != null) {
227 for (Object instance : instances) {
228 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
229 service.neutronLoadBalancerHealthMonitorCreated(singleton);
233 List<NeutronLoadBalancerHealthMonitor> bulk = input.getBulk();
234 Iterator<NeutronLoadBalancerHealthMonitor> i = bulk.iterator();
235 HashMap<String, NeutronLoadBalancerHealthMonitor> testMap = new HashMap<String, NeutronLoadBalancerHealthMonitor>();
236 Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerHealthMonitorAware.class, this, null);
237 while (i.hasNext()) {
238 NeutronLoadBalancerHealthMonitor test = i.next();
241 * Verify that the firewall policy doesn't already exist
244 if (loadBalancerHealthMonitorInterface
245 .neutronLoadBalancerHealthMonitorExists(test.getLoadBalancerHealthMonitorID())) {
246 throw new BadRequestException("LoadBalancerHealthMonitor UUID already is already created");
248 if (testMap.containsKey(test.getLoadBalancerHealthMonitorID())) {
249 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
251 if (instances != null) {
252 for (Object instance : instances) {
253 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
254 int status = service.canCreateNeutronLoadBalancerHealthMonitor(test);
255 if (status < 200 || status > 299) {
256 return Response.status(status).build();
262 * now, each element of the bulk request can be added to the cache
265 while (i.hasNext()) {
266 NeutronLoadBalancerHealthMonitor test = i.next();
267 loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(test);
268 if (instances != null) {
269 for (Object instance : instances) {
270 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
271 service.neutronLoadBalancerHealthMonitorCreated(test);
276 return Response.status(201).entity(input).build();
280 * Updates a LoadBalancerHealthMonitor Policy
282 @Path("{loadBalancerHealthMonitorID}")
284 @Produces({ MediaType.APPLICATION_JSON })
285 @Consumes({ MediaType.APPLICATION_JSON })
287 @ResponseCode(code = 200, condition = "Operation successful"),
288 @ResponseCode(code = 400, condition = "Bad Request"),
289 @ResponseCode(code = 401, condition = "Unauthorized"),
290 @ResponseCode(code = 403, condition = "Forbidden"),
291 @ResponseCode(code = 404, condition = "Not Found"),
292 @ResponseCode(code = 501, condition = "Not Implemented") })
293 public Response updateLoadBalancerHealthMonitor(
294 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID,
295 final NeutronLoadBalancerHealthMonitorRequest input) {
296 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
297 .getINeutronLoadBalancerHealthMonitorCRUD(this);
298 if (loadBalancerHealthMonitorInterface == null) {
299 throw new ServiceUnavailableException("LoadBalancerHealthMonitor CRUD Interface "
300 + RestMessages.SERVICEUNAVAILABLE.toString());
304 * verify the LoadBalancerHealthMonitor exists and there is only one delta provided
306 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
307 throw new ResourceNotFoundException("LoadBalancerHealthMonitor UUID does not exist.");
309 if (!input.isSingleton()) {
310 throw new BadRequestException("Only singleton edit supported");
312 NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
313 NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
314 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
317 * updates restricted by Neutron
319 if (delta.getLoadBalancerHealthMonitorID() != null ||
320 delta.getLoadBalancerHealthMonitorTenantID() != null ||
321 delta.getLoadBalancerHealthMonitorType() != null ||
322 delta.getLoadBalancerHealthMonitorDelay() != null ||
323 delta.getLoadBalancerHealthMonitorTimeout() != null ||
324 delta.getLoadBalancerHealthMonitorMaxRetries() != null ||
325 delta.getLoadBalancerHealthMonitorHttpMethod() != null ||
326 delta.getLoadBalancerHealthMonitorUrlPath() != null ||
327 delta.getLoadBalancerHealthMonitorExpectedCodes() != null ||
328 delta.getLoadBalancerHealthMonitorAdminStateIsUp() != null ||
329 delta.getLoadBalancerHealthMonitorStatus() != null) {
330 throw new BadRequestException("Attribute edit blocked by Neutron");
333 Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerHealthMonitorAware.class, this, null);
334 if (instances != null) {
335 for (Object instance : instances) {
336 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
337 int status = service.canUpdateNeutronLoadBalancerHealthMonitor(delta, original);
338 if (status < 200 || status > 299) {
339 return Response.status(status).build();
345 * update the object and return it
347 loadBalancerHealthMonitorInterface.updateNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID, delta);
348 NeutronLoadBalancerHealthMonitor updatedLoadBalancerHealthMonitor = loadBalancerHealthMonitorInterface
349 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
350 if (instances != null) {
351 for (Object instance : instances) {
352 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
353 service.neutronLoadBalancerHealthMonitorUpdated(updatedLoadBalancerHealthMonitor);
356 return Response.status(200).entity(new NeutronLoadBalancerHealthMonitorRequest
357 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
358 (loadBalancerHealthMonitorID))).build();
364 * Deletes a LoadBalancerHealthMonitor
366 @Path("{loadBalancerHealthMonitorID}")
369 @ResponseCode(code = 204, condition = "No Content"),
370 @ResponseCode(code = 401, condition = "Unauthorized"),
371 @ResponseCode(code = 404, condition = "Not Found"),
372 @ResponseCode(code = 409, condition = "Conflict"),
373 @ResponseCode(code = 501, condition = "Not Implemented") })
374 public Response deleteLoadBalancerHealthMonitor(
375 @PathParam("loadBalancerHealthMonitorID") String loadBalancerHealthMonitorID) {
376 INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerHealthMonitorCRUD(this);
377 if (loadBalancerHealthMonitorInterface == null) {
378 throw new ServiceUnavailableException("LoadBalancerHealthMonitor CRUD Interface "
379 + RestMessages.SERVICEUNAVAILABLE.toString());
382 * verify the LoadBalancerHealthMonitor exists and it isn't currently in use
384 if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
385 throw new ResourceNotFoundException("LoadBalancerHealthMonitor UUID does not exist.");
387 if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorInUse(loadBalancerHealthMonitorID)) {
388 return Response.status(409).build();
390 NeutronLoadBalancerHealthMonitor singleton = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
391 Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerHealthMonitorAware.class, this, null);
392 if (instances != null) {
393 for (Object instance : instances) {
394 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
395 int status = service.canDeleteNeutronLoadBalancerHealthMonitor(singleton);
396 if (status < 200 || status > 299) {
397 return Response.status(status).build();
401 loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
402 if (instances != null) {
403 for (Object instance : instances) {
404 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
405 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
408 return Response.status(204).build();