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