Remove magic numbers from northbound-api
[neutron.git] / northbound-api / src / main / java / org / opendaylight / neutron / northbound / api / NeutronLoadBalancerListenerNorthbound.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.neutron.northbound.api;
10
11 import java.net.HttpURLConnection;
12
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.Iterator;
16 import java.util.List;
17
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;
29
30 import org.codehaus.enunciate.jaxrs.ResponseCode;
31 import org.codehaus.enunciate.jaxrs.StatusCodes;
32 import org.opendaylight.neutron.spi.INeutronLoadBalancerListenerAware;
33 import org.opendaylight.neutron.spi.INeutronLoadBalancerListenerCRUD;
34 import org.opendaylight.neutron.spi.NeutronCRUDInterfaces;
35 import org.opendaylight.neutron.spi.NeutronLoadBalancerListener;
36
37 /**
38  * Neutron Northbound REST APIs for LoadBalancerListener Policies.<br>
39  * This class provides REST APIs for managing neutron LoadBalancerListener Policies
40  *
41  * <br>
42  * <br>
43  * Authentication scheme : <b>HTTP Basic</b><br>
44  * Authentication realm : <b>opendaylight</b><br>
45  * Transport : <b>HTTP and HTTPS</b><br>
46  * <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>
50  * More info :
51  * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
52  *
53  */
54 @Path("/lbaas/listeners")
55 public class NeutronLoadBalancerListenerNorthbound {
56
57     private static final int HTTP_OK_BOTTOM = 200;
58     private static final int HTTP_OK_TOP = 299;
59
60     private NeutronLoadBalancerListener extractFields(NeutronLoadBalancerListener o, List<String> fields) {
61         return o.extractFields(fields);
62     }
63
64     /**
65      * Returns a list of all LoadBalancerListener */
66     @GET
67     @Produces({ MediaType.APPLICATION_JSON })
68     @StatusCodes({
69             @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
70             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
71             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
72             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
73
74     public Response listGroups(
75             // return fields
76             @QueryParam("fields") List<String> fields,
77             // OpenStack LoadBalancerListener attributes
78             @QueryParam("id") String queryLoadBalancerListenerID,
79             @QueryParam("default_pool_id") String queryLoadBalancerListenerDefaultPoolID,
80             @QueryParam("tenant_id") String queryLoadBalancerListenerTenantID,
81             @QueryParam("name") String queryLoadBalancerListenerName,
82             @QueryParam("description") String queryLoadBalancerListenerDescription,
83             @QueryParam("protocol") String queryLoadBalancerListenerProtocol,
84             @QueryParam("protocol_port") String queryLoadBalancerListenerProtocolPort,
85             @QueryParam("admin_state_up") String queryLoadBalancerListenerAdminIsUp,
86             // pagination
87             @QueryParam("limit") String limit,
88             @QueryParam("marker") String marker,
89             @QueryParam("page_reverse") String pageReverse
90             // sorting not supported
91     ) {
92         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
93         //        INeutronLoadBalancerListenerRuleCRUD firewallRuleInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerRuleCRUD(this);
94
95         if (loadBalancerListenerInterface == null) {
96             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
97                     + RestMessages.SERVICEUNAVAILABLE.toString());
98         }
99         List<NeutronLoadBalancerListener> allLoadBalancerListeners = loadBalancerListenerInterface.getAllNeutronLoadBalancerListeners();
100         //        List<NeutronLoadBalancerListenerRule> allLoadBalancerListenerRules = firewallRuleInterface.getAllNeutronLoadBalancerListenerRules();
101         List<NeutronLoadBalancerListener> ans = new ArrayList<NeutronLoadBalancerListener>();
102         //        List<NeutronLoadBalancerListenerRule> rules = new ArrayList<NeutronLoadBalancerListenerRule>();
103         Iterator<NeutronLoadBalancerListener> i = allLoadBalancerListeners.iterator();
104         while (i.hasNext()) {
105             NeutronLoadBalancerListener nsg = i.next();
106             if ((queryLoadBalancerListenerID == null ||
107                     queryLoadBalancerListenerID.equals(nsg.getLoadBalancerListenerID())) &&
108                     (queryLoadBalancerListenerDefaultPoolID == null ||
109                             queryLoadBalancerListenerDefaultPoolID.equals(nsg.getNeutronLoadBalancerListenerDefaultPoolID())) &&
110                     (queryLoadBalancerListenerTenantID == null ||
111                             queryLoadBalancerListenerTenantID.equals(nsg.getLoadBalancerListenerTenantID())) &&
112                     (queryLoadBalancerListenerName == null ||
113                             queryLoadBalancerListenerName.equals(nsg.getLoadBalancerListenerName())) &&
114                     (queryLoadBalancerListenerDescription == null ||
115                             queryLoadBalancerListenerDescription.equals(nsg.getLoadBalancerListenerDescription())) &&
116                     (queryLoadBalancerListenerProtocol == null ||
117                             queryLoadBalancerListenerProtocol.equals(nsg.getNeutronLoadBalancerListenerProtocol())) &&
118                     (queryLoadBalancerListenerProtocolPort == null ||
119                             queryLoadBalancerListenerProtocolPort.equals(nsg.getNeutronLoadBalancerListenerProtocolPort())) &&
120                     (queryLoadBalancerListenerAdminIsUp == null ||
121                             queryLoadBalancerListenerAdminIsUp.equals(nsg.getLoadBalancerListenerAdminStateIsUp()))) {
122                 if (fields.size() > 0) {
123                     ans.add(extractFields(nsg,fields));
124                 } else {
125                     ans.add(nsg);
126                 }
127             }
128         }
129         return Response.status(HttpURLConnection.HTTP_OK).entity(
130                 new NeutronLoadBalancerListenerRequest(ans)).build();
131     }
132
133     /**
134      * Returns a specific LoadBalancerListener */
135
136     @Path("{loadBalancerListenerID}")
137     @GET
138     @Produces({ MediaType.APPLICATION_JSON })
139     @StatusCodes({
140             @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
141             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
142             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
143             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
144             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
145     public Response showLoadBalancerListener(@PathParam("loadBalancerListenerID") String loadBalancerListenerID,
146             // return fields
147             @QueryParam("fields") List<String> fields) {
148         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
149         if (loadBalancerListenerInterface == null) {
150             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
151                     + RestMessages.SERVICEUNAVAILABLE.toString());
152         }
153         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
154             throw new ResourceNotFoundException("LoadBalancerListener UUID does not exist.");
155         }
156         if (fields.size() > 0) {
157             NeutronLoadBalancerListener ans = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
158             return Response.status(HttpURLConnection.HTTP_OK).entity(
159                     new NeutronLoadBalancerListenerRequest(extractFields(ans, fields))).build();
160         } else {
161             return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerListenerRequest(loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID))).build();
162         }
163     }
164
165     /**
166      * Creates new LoadBalancerListener */
167
168     @POST
169     @Produces({ MediaType.APPLICATION_JSON })
170     @Consumes({ MediaType.APPLICATION_JSON })
171     @StatusCodes({
172             @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
173             @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
174             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
175             @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
176             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
177             @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
178             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
179             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
180     public Response createLoadBalancerListeners(final NeutronLoadBalancerListenerRequest input) {
181         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
182         if (loadBalancerListenerInterface == null) {
183             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
184                     + RestMessages.SERVICEUNAVAILABLE.toString());
185         }
186         if (input.isSingleton()) {
187             NeutronLoadBalancerListener singleton = input.getSingleton();
188
189             /*
190              *  Verify that the LoadBalancerListener doesn't already exist.
191              */
192             if (loadBalancerListenerInterface.neutronLoadBalancerListenerExists(singleton.getLoadBalancerListenerID())) {
193                 throw new BadRequestException("LoadBalancerListener UUID already exists");
194             }
195             loadBalancerListenerInterface.addNeutronLoadBalancerListener(singleton);
196
197             Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerListenerAware.class, this);
198             if (instances != null) {
199                 if (instances.length > 0) {
200                     for (Object instance : instances) {
201                         INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
202                         int status = service.canCreateNeutronLoadBalancerListener(singleton);
203                         if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
204                             return Response.status(status).build();
205                         }
206                     }
207                 } else {
208                     throw new ServiceUnavailableException("No providers registered.  Please try again later");
209                 }
210             } else {
211                 throw new ServiceUnavailableException("Couldn't get providers list.  Please try again later");
212             }
213             loadBalancerListenerInterface.addNeutronLoadBalancerListener(singleton);
214             if (instances != null) {
215                 for (Object instance : instances) {
216                     INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
217                     service.neutronLoadBalancerListenerCreated(singleton);
218                 }
219             }
220         } else {
221             List<NeutronLoadBalancerListener> bulk = input.getBulk();
222             Iterator<NeutronLoadBalancerListener> i = bulk.iterator();
223             HashMap<String, NeutronLoadBalancerListener> testMap = new HashMap<String, NeutronLoadBalancerListener>();
224             Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerListenerAware.class, this);
225             while (i.hasNext()) {
226                 NeutronLoadBalancerListener test = i.next();
227
228                 /*
229                  *  Verify that the firewall policy doesn't already exist
230                  */
231
232                 if (loadBalancerListenerInterface.neutronLoadBalancerListenerExists(test.getLoadBalancerListenerID())) {
233                     throw new BadRequestException("LoadBalancerListener UUID already is already created");
234                 }
235                 if (testMap.containsKey(test.getLoadBalancerListenerID())) {
236                     throw new BadRequestException("LoadBalancerListener UUID already exists");
237                 }
238                 if (instances != null) {
239                     if (instances.length > 0) {
240                         for (Object instance : instances) {
241                             INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
242                             int status = service.canCreateNeutronLoadBalancerListener(test);
243                             if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
244                                 return Response.status(status).build();
245                             }
246                         }
247                     } else {
248                         throw new ServiceUnavailableException("No providers registered.  Please try again later");
249                     }
250                 } else {
251                     throw new ServiceUnavailableException("Couldn't get providers list.  Please try again later");
252                 }
253             }
254             /*
255              * now, each element of the bulk request can be added to the cache
256              */
257             i = bulk.iterator();
258             while (i.hasNext()) {
259                 NeutronLoadBalancerListener test = i.next();
260                 loadBalancerListenerInterface.addNeutronLoadBalancerListener(test);
261                 if (instances != null) {
262                     for (Object instance : instances) {
263                         INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
264                         service.neutronLoadBalancerListenerCreated(test);
265                     }
266                 }
267             }
268         }
269         return Response.status(HttpURLConnection.HTTP_CREATED).entity(input).build();
270     }
271
272     /**
273      * Updates a LoadBalancerListener Policy
274      */
275     @Path("{loadBalancerListenerID}")
276     @PUT
277     @Produces({ MediaType.APPLICATION_JSON })
278     @Consumes({ MediaType.APPLICATION_JSON })
279     @StatusCodes({
280             @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
281             @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
282             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
283             @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
284             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
285             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
286             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
287     public Response updateLoadBalancerListener(
288             @PathParam("loadBalancerListenerID") String loadBalancerListenerID, final NeutronLoadBalancerListenerRequest input) {
289         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
290         if (loadBalancerListenerInterface == null) {
291             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
292                     + RestMessages.SERVICEUNAVAILABLE.toString());
293         }
294
295         /*
296          * verify the LoadBalancerListener exists and there is only one delta provided
297          */
298         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
299             throw new ResourceNotFoundException("LoadBalancerListener UUID does not exist.");
300         }
301         if (!input.isSingleton()) {
302             throw new BadRequestException("Only singleton edit supported");
303         }
304         NeutronLoadBalancerListener delta = input.getSingleton();
305         NeutronLoadBalancerListener original = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
306
307         /*
308          * updates restricted by Neutron
309          */
310         if (delta.getLoadBalancerListenerID() != null ||
311                 delta.getNeutronLoadBalancerListenerDefaultPoolID() != null ||
312                 delta.getLoadBalancerListenerTenantID() != null ||
313                 delta.getLoadBalancerListenerName() != null ||
314                 delta.getLoadBalancerListenerDescription() != null ||
315                 delta.getNeutronLoadBalancerListenerProtocol() != null ||
316                 delta.getNeutronLoadBalancerListenerProtocolPort() != null ||
317                 delta.getLoadBalancerListenerAdminStateIsUp() != null) {
318             throw new BadRequestException("Attribute edit blocked by Neutron");
319         }
320
321         Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerListenerAware.class, this);
322         if (instances != null) {
323             if (instances.length > 0) {
324                 for (Object instance : instances) {
325                     INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
326                     int status = service.canUpdateNeutronLoadBalancerListener(delta, original);
327                     if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
328                         return Response.status(status).build();
329                     }
330                 }
331             } else {
332                 throw new ServiceUnavailableException("No providers registered.  Please try again later");
333             }
334         } else {
335             throw new ServiceUnavailableException("Couldn't get providers list.  Please try again later");
336         }
337
338         /*
339          * update the object and return it
340          */
341         loadBalancerListenerInterface.updateNeutronLoadBalancerListener(loadBalancerListenerID, delta);
342         NeutronLoadBalancerListener updatedLoadBalancerListener = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
343         if (instances != null) {
344             for (Object instance : instances) {
345                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
346                 service.neutronLoadBalancerListenerUpdated(updatedLoadBalancerListener);
347             }
348         }
349         return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerListenerRequest(loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID))).build();
350     }
351
352     /**
353      * Deletes a LoadBalancerListener */
354
355     @Path("{loadBalancerListenerID}")
356     @DELETE
357     @StatusCodes({
358             @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
359             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
360             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
361             @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
362             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
363             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
364     public Response deleteLoadBalancerListener(
365             @PathParam("loadBalancerListenerID") String loadBalancerListenerID) {
366         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
367         if (loadBalancerListenerInterface == null) {
368             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
369                     + RestMessages.SERVICEUNAVAILABLE.toString());
370         }
371
372         /*
373          * verify the LoadBalancerListener exists and it isn't currently in use
374          */
375         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
376             throw new ResourceNotFoundException("LoadBalancerListener UUID does not exist.");
377         }
378         if (loadBalancerListenerInterface.neutronLoadBalancerListenerInUse(loadBalancerListenerID)) {
379             return Response.status(HttpURLConnection.HTTP_CONFLICT).build();
380         }
381         NeutronLoadBalancerListener singleton = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
382         Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerListenerAware.class, this);
383         if (instances != null) {
384             if (instances.length > 0) {
385                 for (Object instance : instances) {
386                     INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
387                     int status = service.canDeleteNeutronLoadBalancerListener(singleton);
388                     if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
389                         return Response.status(status).build();
390                     }
391                 }
392             } else {
393                 throw new ServiceUnavailableException("No providers registered.  Please try again later");
394             }
395         } else {
396             throw new ServiceUnavailableException("Couldn't get providers list.  Please try again later");
397         }
398
399         loadBalancerListenerInterface.removeNeutronLoadBalancerListener(loadBalancerListenerID);
400         if (instances != null) {
401             for (Object instance : instances) {
402                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
403                 service.neutronLoadBalancerListenerDeleted(singleton);
404             }
405         }
406         return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();
407     }
408 }