Change NeutronCRUDInterfaces class from static
[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<NeutronLoadBalancerListenerRule> allLoadBalancerListenerRules = firewallRuleInterface.getAllNeutronLoadBalancerListenerRules();
109         List<NeutronLoadBalancerListener> ans = new ArrayList<NeutronLoadBalancerListener>();
110         //        List<NeutronLoadBalancerListenerRule> rules = new ArrayList<NeutronLoadBalancerListenerRule>();
111         Iterator<NeutronLoadBalancerListener> i = allLoadBalancerListeners.iterator();
112         while (i.hasNext()) {
113             NeutronLoadBalancerListener nsg = i.next();
114             if ((queryLoadBalancerListenerID == null ||
115                     queryLoadBalancerListenerID.equals(nsg.getLoadBalancerListenerID())) &&
116                     (queryLoadBalancerListenerDefaultPoolID == null ||
117                             queryLoadBalancerListenerDefaultPoolID.equals(nsg.getNeutronLoadBalancerListenerDefaultPoolID())) &&
118                     (queryLoadBalancerListenerTenantID == null ||
119                             queryLoadBalancerListenerTenantID.equals(nsg.getLoadBalancerListenerTenantID())) &&
120                     (queryLoadBalancerListenerName == null ||
121                             queryLoadBalancerListenerName.equals(nsg.getLoadBalancerListenerName())) &&
122                     (queryLoadBalancerListenerDescription == null ||
123                             queryLoadBalancerListenerDescription.equals(nsg.getLoadBalancerListenerDescription())) &&
124                     (queryLoadBalancerListenerProtocol == null ||
125                             queryLoadBalancerListenerProtocol.equals(nsg.getNeutronLoadBalancerListenerProtocol())) &&
126                     (queryLoadBalancerListenerProtocolPort == null ||
127                             queryLoadBalancerListenerProtocolPort.equals(nsg.getNeutronLoadBalancerListenerProtocolPort())) &&
128                     (queryLoadBalancerListenerAdminIsUp == null ||
129                             queryLoadBalancerListenerAdminIsUp.equals(nsg.getLoadBalancerListenerAdminStateIsUp()))) {
130                 if (fields.size() > 0) {
131                     ans.add(extractFields(nsg,fields));
132                 } else {
133                     ans.add(nsg);
134                 }
135             }
136         }
137         return Response.status(HttpURLConnection.HTTP_OK).entity(
138                 new NeutronLoadBalancerListenerRequest(ans)).build();
139     }
140
141     /**
142      * Returns a specific LoadBalancerListener */
143
144     @Path("{loadBalancerListenerID}")
145     @GET
146     @Produces({ MediaType.APPLICATION_JSON })
147     @StatusCodes({
148             @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"),
149             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
150             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
151             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
152             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
153     public Response showLoadBalancerListener(@PathParam("loadBalancerListenerID") String loadBalancerListenerID,
154             // return fields
155             @QueryParam("fields") List<String> fields) {
156         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = getNeutronInterfaces().getLoadBalancerListenerInterface();
157         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
158             throw new ResourceNotFoundException(UUID_NO_EXIST);
159         }
160         if (fields.size() > 0) {
161             NeutronLoadBalancerListener ans = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
162             return Response.status(HttpURLConnection.HTTP_OK).entity(
163                     new NeutronLoadBalancerListenerRequest(extractFields(ans, fields))).build();
164         } else {
165             return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerListenerRequest(loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID))).build();
166         }
167     }
168
169     /**
170      * Creates new LoadBalancerListener */
171
172     @POST
173     @Produces({ MediaType.APPLICATION_JSON })
174     @Consumes({ MediaType.APPLICATION_JSON })
175     @StatusCodes({
176             @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"),
177             @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"),
178             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
179             @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"),
180             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
181             @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
182             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
183             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
184     public Response createLoadBalancerListeners(final NeutronLoadBalancerListenerRequest input) {
185         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = getNeutronInterfaces().getLoadBalancerListenerInterface();
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);
209                 }
210             } else {
211                 throw new ServiceUnavailableException(NO_PROVIDER_LIST);
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);
249                     }
250                 } else {
251                     throw new ServiceUnavailableException(NO_PROVIDER_LIST);
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 = getNeutronInterfaces().getLoadBalancerListenerInterface();
290
291         /*
292          * verify the LoadBalancerListener exists and there is only one delta provided
293          */
294         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
295             throw new ResourceNotFoundException(UUID_NO_EXIST);
296         }
297         if (!input.isSingleton()) {
298             throw new BadRequestException("Only singleton edit supported");
299         }
300         NeutronLoadBalancerListener delta = input.getSingleton();
301         NeutronLoadBalancerListener original = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
302
303         /*
304          * updates restricted by Neutron
305          */
306         if (delta.getLoadBalancerListenerID() != null ||
307                 delta.getNeutronLoadBalancerListenerDefaultPoolID() != null ||
308                 delta.getLoadBalancerListenerTenantID() != null ||
309                 delta.getLoadBalancerListenerName() != null ||
310                 delta.getLoadBalancerListenerDescription() != null ||
311                 delta.getNeutronLoadBalancerListenerProtocol() != null ||
312                 delta.getNeutronLoadBalancerListenerProtocolPort() != null ||
313                 delta.getLoadBalancerListenerAdminStateIsUp() != null) {
314             throw new BadRequestException("Attribute edit blocked by Neutron");
315         }
316
317         Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerListenerAware.class, this);
318         if (instances != null) {
319             if (instances.length > 0) {
320                 for (Object instance : instances) {
321                     INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
322                     int status = service.canUpdateNeutronLoadBalancerListener(delta, original);
323                     if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
324                         return Response.status(status).build();
325                     }
326                 }
327             } else {
328                 throw new ServiceUnavailableException(NO_PROVIDERS);
329             }
330         } else {
331             throw new ServiceUnavailableException(NO_PROVIDER_LIST);
332         }
333
334         /*
335          * update the object and return it
336          */
337         loadBalancerListenerInterface.updateNeutronLoadBalancerListener(loadBalancerListenerID, delta);
338         NeutronLoadBalancerListener updatedLoadBalancerListener = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
339         if (instances != null) {
340             for (Object instance : instances) {
341                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
342                 service.neutronLoadBalancerListenerUpdated(updatedLoadBalancerListener);
343             }
344         }
345         return Response.status(HttpURLConnection.HTTP_OK).entity(new NeutronLoadBalancerListenerRequest(loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID))).build();
346     }
347
348     /**
349      * Deletes a LoadBalancerListener */
350
351     @Path("{loadBalancerListenerID}")
352     @DELETE
353     @StatusCodes({
354             @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"),
355             @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"),
356             @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"),
357             @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"),
358             @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"),
359             @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") })
360     public Response deleteLoadBalancerListener(
361             @PathParam("loadBalancerListenerID") String loadBalancerListenerID) {
362         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = getNeutronInterfaces().getLoadBalancerListenerInterface();
363
364         /*
365          * verify the LoadBalancerListener exists and it isn't currently in use
366          */
367         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
368             throw new ResourceNotFoundException(UUID_NO_EXIST);
369         }
370         if (loadBalancerListenerInterface.neutronLoadBalancerListenerInUse(loadBalancerListenerID)) {
371             return Response.status(HttpURLConnection.HTTP_CONFLICT).build();
372         }
373         NeutronLoadBalancerListener singleton = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
374         Object[] instances = NeutronUtil.getInstances(INeutronLoadBalancerListenerAware.class, this);
375         if (instances != null) {
376             if (instances.length > 0) {
377                 for (Object instance : instances) {
378                     INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
379                     int status = service.canDeleteNeutronLoadBalancerListener(singleton);
380                     if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) {
381                         return Response.status(status).build();
382                     }
383                 }
384             } else {
385                 throw new ServiceUnavailableException(NO_PROVIDERS);
386             }
387         } else {
388             throw new ServiceUnavailableException(NO_PROVIDER_LIST);
389         }
390
391         loadBalancerListenerInterface.removeNeutronLoadBalancerListener(loadBalancerListenerID);
392         if (instances != null) {
393             for (Object instance : instances) {
394                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
395                 service.neutronLoadBalancerListenerDeleted(singleton);
396             }
397         }
398         return Response.status(HttpURLConnection.HTTP_NO_CONTENT).build();
399     }
400 }