6cd2673ff80e09569284b61024e28906130a9a2b
[controller.git] / opendaylight / networkconfiguration / neutron / northbound / src / main / java / org / opendaylight / controller / networkconfig / neutron / northbound / NeutronLoadBalancerHealthMonitorNorthbound.java
1 /*
2  * Copyright (C) 2014 Red Hat, Inc.
3  *
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
7  */
8
9 package org.opendaylight.controller.networkconfig.neutron.northbound;
10
11
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;
26
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;
42
43 /**
44  * Neutron Northbound REST APIs for Load Balancer HealthMonitor.<br>
45  * This class provides REST APIs for managing neutron LoadBalancerHealthMonitor
46  *
47  * <br>
48  * <br>
49  * Authentication scheme : <b>HTTP Basic</b><br>
50  * Authentication realm : <b>opendaylight</b><br>
51  * Transport : <b>HTTP and HTTPS</b><br>
52  * <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>
56  * More info :
57  * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
58  *
59  */
60 @Path("/healthmonitors")
61 public class NeutronLoadBalancerHealthMonitorNorthbound {
62     private static final Logger logger = LoggerFactory.getLogger(NeutronLoadBalancer.class);
63
64     private NeutronLoadBalancerHealthMonitor extractFields(NeutronLoadBalancerHealthMonitor o, List<String> fields) {
65         return o.extractFields(fields);
66     }
67
68     /**
69      * Returns a list of all LoadBalancerHealthMonitor */
70     @GET
71     @Produces({ MediaType.APPLICATION_JSON })
72     @StatusCodes({
73             @ResponseCode(code = 200, condition = "Operation successful"),
74             @ResponseCode(code = 401, condition = "Unauthorized"),
75             @ResponseCode(code = 501, condition = "Not Implemented") })
76
77     public Response listGroups(
78             // return fields
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,
93             // pagination
94             @QueryParam("limit") String limit,
95             @QueryParam("marker") String marker,
96             @QueryParam("page_reverse") String pageReverse
97             // sorting not supported
98     ) {
99         INeutronLoadBalancerHealthMonitorCRUD loadBalancerHealthMonitorInterface = NeutronCRUDInterfaces
100                 .getINeutronLoadBalancerHealthMonitorCRUD(this);
101         if (loadBalancerHealthMonitorInterface == null) {
102             throw new ServiceUnavailableException("LoadBalancerHealthMonitor CRUD Interface "
103                     + RestMessages.SERVICEUNAVAILABLE.toString());
104         }
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));
144                 } else {
145                     ans.add(nsg);
146                 }
147             }
148         }
149         return Response.status(200).entity(
150                 new NeutronLoadBalancerHealthMonitorRequest(ans)).build();
151     }
152
153     /**
154      * Returns a specific LoadBalancerHealthMonitor */
155
156     @Path("{loadBalancerHealthMonitorID}")
157     @GET
158     @Produces({ MediaType.APPLICATION_JSON })
159     @StatusCodes({
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,
165             // return fields
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());
171         }
172         if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
173             throw new ResourceNotFoundException("LoadBalancerHealthMonitor UUID does not exist.");
174         }
175         if (fields.size() > 0) {
176             NeutronLoadBalancerHealthMonitor ans = loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
177             return Response.status(200).entity(
178                     new NeutronLoadBalancerHealthMonitorRequest(extractFields(ans, fields))).build();
179         } else {
180             return Response.status(200).entity(new NeutronLoadBalancerHealthMonitorRequest(loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID))).build();
181         }
182     }
183
184     /**
185      * Creates new LoadBalancerHealthMonitor */
186
187     @POST
188     @Produces({ MediaType.APPLICATION_JSON })
189     @Consumes({ MediaType.APPLICATION_JSON })
190     @StatusCodes({
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());
203         }
204         if (input.isSingleton()) {
205             NeutronLoadBalancerHealthMonitor singleton = input.getSingleton();
206
207             /*
208              *  Verify that the LoadBalancerHealthMonitor doesn't already exist.
209              */
210             if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(singleton.getLoadBalancerHealthMonitorID())) {
211                 throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
212             }
213             loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
214
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();
222                     }
223                 }
224             }
225             loadBalancerHealthMonitorInterface.addNeutronLoadBalancerHealthMonitor(singleton);
226             if (instances != null) {
227                 for (Object instance : instances) {
228                     INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
229                     service.neutronLoadBalancerHealthMonitorCreated(singleton);
230                 }
231             }
232         } else {
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();
239
240                 /*
241                  *  Verify that the firewall policy doesn't already exist
242                  */
243
244                 if (loadBalancerHealthMonitorInterface
245                         .neutronLoadBalancerHealthMonitorExists(test.getLoadBalancerHealthMonitorID())) {
246                     throw new BadRequestException("LoadBalancerHealthMonitor UUID already is already created");
247                 }
248                 if (testMap.containsKey(test.getLoadBalancerHealthMonitorID())) {
249                     throw new BadRequestException("LoadBalancerHealthMonitor UUID already exists");
250                 }
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();
257                         }
258                     }
259                 }
260             }
261             /*
262              * now, each element of the bulk request can be added to the cache
263              */
264             i = bulk.iterator();
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);
272                     }
273                 }
274             }
275         }
276         return Response.status(201).entity(input).build();
277     }
278
279     /**
280      * Updates a LoadBalancerHealthMonitor Policy
281      */
282     @Path("{loadBalancerHealthMonitorID}")
283     @PUT
284     @Produces({ MediaType.APPLICATION_JSON })
285     @Consumes({ MediaType.APPLICATION_JSON })
286     @StatusCodes({
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());
301         }
302
303         /*
304          * verify the LoadBalancerHealthMonitor exists and there is only one delta provided
305          */
306         if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
307             throw new ResourceNotFoundException("LoadBalancerHealthMonitor UUID does not exist.");
308         }
309         if (!input.isSingleton()) {
310             throw new BadRequestException("Only singleton edit supported");
311         }
312         NeutronLoadBalancerHealthMonitor delta = input.getSingleton();
313         NeutronLoadBalancerHealthMonitor original = loadBalancerHealthMonitorInterface
314                 .getNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
315
316         /*
317          * updates restricted by Neutron
318          */
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");
331         }
332
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();
340                 }
341             }
342         }
343
344         /*
345          * update the object and return it
346          */
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);
354             }
355         }
356         return Response.status(200).entity(new NeutronLoadBalancerHealthMonitorRequest
357                 (loadBalancerHealthMonitorInterface.getNeutronLoadBalancerHealthMonitor
358                         (loadBalancerHealthMonitorID))).build();
359     }
360
361
362
363     /**
364      * Deletes a LoadBalancerHealthMonitor
365      * */
366     @Path("{loadBalancerHealthMonitorID}")
367     @DELETE
368     @StatusCodes({
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());
380         }
381         /*
382          * verify the LoadBalancerHealthMonitor exists and it isn't currently in use
383          */
384         if (!loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorExists(loadBalancerHealthMonitorID)) {
385             throw new ResourceNotFoundException("LoadBalancerHealthMonitor UUID does not exist.");
386         }
387         if (loadBalancerHealthMonitorInterface.neutronLoadBalancerHealthMonitorInUse(loadBalancerHealthMonitorID)) {
388             return Response.status(409).build();
389         }
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();
398                 }
399             }
400         }
401         loadBalancerHealthMonitorInterface.removeNeutronLoadBalancerHealthMonitor(loadBalancerHealthMonitorID);
402         if (instances != null) {
403             for (Object instance : instances) {
404                 INeutronLoadBalancerHealthMonitorAware service = (INeutronLoadBalancerHealthMonitorAware) instance;
405                 service.neutronLoadBalancerHealthMonitorDeleted(singleton);
406             }
407         }
408         return Response.status(204).build();
409     }
410 }