f3ef39f7ba40022e77689a3cd7cc47aa333d09b3
[controller.git] / opendaylight / networkconfiguration / neutron / northbound / src / main / java / org / opendaylight / controller / networkconfig / neutron / northbound / 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.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.INeutronLoadBalancerListenerAware;
15 import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerListenerCRUD;
16 import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces;
17 import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerListener;
18 import org.opendaylight.controller.northbound.commons.RestMessages;
19 import org.opendaylight.controller.northbound.commons.exception.BadRequestException;
20 import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
21 import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException;
22 import org.opendaylight.controller.sal.utils.ServiceHelper;
23
24 import javax.ws.rs.Consumes;
25 import javax.ws.rs.DELETE;
26 import javax.ws.rs.GET;
27 import javax.ws.rs.POST;
28 import javax.ws.rs.PUT;
29 import javax.ws.rs.Path;
30 import javax.ws.rs.PathParam;
31 import javax.ws.rs.Produces;
32 import javax.ws.rs.QueryParam;
33 import javax.ws.rs.core.MediaType;
34 import javax.ws.rs.core.Response;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.Iterator;
38 import java.util.List;
39
40 /**
41  * Neutron Northbound REST APIs for LoadBalancerListener Policies.<br>
42  * This class provides REST APIs for managing neutron LoadBalancerListener Policies
43  *
44  * <br>
45  * <br>
46  * Authentication scheme : <b>HTTP Basic</b><br>
47  * Authentication realm : <b>opendaylight</b><br>
48  * Transport : <b>HTTP and HTTPS</b><br>
49  * <br>
50  * HTTPS Authentication is disabled by default. Administrator can enable it in
51  * tomcat-server.xml after adding a proper keystore / SSL certificate from a
52  * trusted authority.<br>
53  * More info :
54  * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
55  *
56  */
57 @Path("/listeners")
58 public class NeutronLoadBalancerListenerNorthbound {
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 = 200, condition = "Operation successful"),
70             @ResponseCode(code = 401, condition = "Unauthorized"),
71             @ResponseCode(code = 501, condition = "Not Implemented") })
72
73     public Response listGroups(
74             // return fields
75             @QueryParam("fields") List<String> fields,
76             // OpenStack LoadBalancerListener attributes
77             @QueryParam("id") String queryLoadBalancerListenerID,
78             @QueryParam("default_pool_id") String queryLoadBalancerListenerDefaultPoolID,
79             @QueryParam("tenant_id") String queryLoadBalancerListenerTenantID,
80             @QueryParam("name") String queryLoadBalancerListenerName,
81             @QueryParam("description") String queryLoadBalancerListenerDescription,
82             @QueryParam("shared") String queryLoadBalancerListenerIsShared,
83             @QueryParam("protocol") String queryLoadBalancerListenerProtocol,
84             @QueryParam("protocol_port") String queryLoadBalancerListenerProtocolPort,
85             @QueryParam("load_balancer_id") String queryLoadBalancerListenerLoadBalancerID,
86             @QueryParam("admin_state_up") String queryLoadBalancerListenerAdminIsUp,
87             @QueryParam("status") String queryLoadBalancerListenerStatus,
88             // pagination
89             @QueryParam("limit") String limit,
90             @QueryParam("marker") String marker,
91             @QueryParam("page_reverse") String pageReverse
92             // sorting not supported
93     ) {
94         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
95         //        INeutronLoadBalancerListenerRuleCRUD firewallRuleInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerRuleCRUD(this);
96
97         if (loadBalancerListenerInterface == null) {
98             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
99                     + RestMessages.SERVICEUNAVAILABLE.toString());
100         }
101         List<NeutronLoadBalancerListener> allLoadBalancerListeners = loadBalancerListenerInterface.getAllNeutronLoadBalancerListeners();
102         //        List<NeutronLoadBalancerListenerRule> allLoadBalancerListenerRules = firewallRuleInterface.getAllNeutronLoadBalancerListenerRules();
103         List<NeutronLoadBalancerListener> ans = new ArrayList<NeutronLoadBalancerListener>();
104         //        List<NeutronLoadBalancerListenerRule> rules = new ArrayList<NeutronLoadBalancerListenerRule>();
105         Iterator<NeutronLoadBalancerListener> i = allLoadBalancerListeners.iterator();
106         while (i.hasNext()) {
107             NeutronLoadBalancerListener nsg = i.next();
108             if ((queryLoadBalancerListenerID == null ||
109                     queryLoadBalancerListenerID.equals(nsg.getLoadBalancerListenerID())) &&
110                     (queryLoadBalancerListenerDefaultPoolID == null ||
111                             queryLoadBalancerListenerDefaultPoolID.equals(nsg.getNeutronLoadBalancerListenerDefaultPoolID())) &&
112                     (queryLoadBalancerListenerTenantID == null ||
113                             queryLoadBalancerListenerTenantID.equals(nsg.getLoadBalancerListenerTenantID())) &&
114                     (queryLoadBalancerListenerName == null ||
115                             queryLoadBalancerListenerName.equals(nsg.getLoadBalancerListenerName())) &&
116                     (queryLoadBalancerListenerDescription == null ||
117                             queryLoadBalancerListenerDescription.equals(nsg.getLoadBalancerListenerDescription())) &&
118                     (queryLoadBalancerListenerIsShared == null ||
119                             queryLoadBalancerListenerIsShared.equals(nsg.getLoadBalancerListenerIsShared())) &&
120                     (queryLoadBalancerListenerProtocol == null ||
121                             queryLoadBalancerListenerProtocol.equals(nsg.getNeutronLoadBalancerListenerProtocol())) &&
122                     (queryLoadBalancerListenerProtocolPort == null ||
123                             queryLoadBalancerListenerProtocolPort.equals(nsg.getNeutronLoadBalancerListenerProtocolPort())) &&
124                     (queryLoadBalancerListenerLoadBalancerID == null ||
125                             queryLoadBalancerListenerLoadBalancerID.equals(nsg.getNeutronLoadBalancerListenerLoadBalancerID())) &&
126                     (queryLoadBalancerListenerAdminIsUp == null ||
127                             queryLoadBalancerListenerAdminIsUp.equals(nsg.getLoadBalancerListenerAdminStateIsUp())) &&
128                     (queryLoadBalancerListenerStatus == null ||
129                             queryLoadBalancerListenerStatus.equals(nsg.getLoadBalancerListenerStatus()))) {
130                 if (fields.size() > 0) {
131                     ans.add(extractFields(nsg,fields));
132                 } else {
133                     ans.add(nsg);
134                 }
135             }
136         }
137         return Response.status(200).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 = 200, condition = "Operation successful"),
149             @ResponseCode(code = 401, condition = "Unauthorized"),
150             @ResponseCode(code = 404, condition = "Not Found"),
151             @ResponseCode(code = 501, condition = "Not Implemented") })
152     public Response showLoadBalancerListener(@PathParam("loadBalancerListenerID") String loadBalancerListenerID,
153             // return fields
154             @QueryParam("fields") List<String> fields) {
155         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
156         if (loadBalancerListenerInterface == null) {
157             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
158                     + RestMessages.SERVICEUNAVAILABLE.toString());
159         }
160         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
161             throw new ResourceNotFoundException("LoadBalancerListener UUID does not exist.");
162         }
163         if (fields.size() > 0) {
164             NeutronLoadBalancerListener ans = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
165             return Response.status(200).entity(
166                     new NeutronLoadBalancerListenerRequest(extractFields(ans, fields))).build();
167         } else {
168             return Response.status(200).entity(new NeutronLoadBalancerListenerRequest(loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID))).build();
169         }
170     }
171
172     /**
173      * Creates new LoadBalancerListener */
174
175     @POST
176     @Produces({ MediaType.APPLICATION_JSON })
177     @Consumes({ MediaType.APPLICATION_JSON })
178     @StatusCodes({
179             @ResponseCode(code = 201, condition = "Created"),
180             @ResponseCode(code = 400, condition = "Bad Request"),
181             @ResponseCode(code = 401, condition = "Unauthorized"),
182             @ResponseCode(code = 403, condition = "Forbidden"),
183             @ResponseCode(code = 404, condition = "Not Found"),
184             @ResponseCode(code = 409, condition = "Conflict"),
185             @ResponseCode(code = 501, condition = "Not Implemented") })
186     public Response createLoadBalancerListeners(final NeutronLoadBalancerListenerRequest input) {
187         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
188         if (loadBalancerListenerInterface == null) {
189             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
190                     + RestMessages.SERVICEUNAVAILABLE.toString());
191         }
192         if (input.isSingleton()) {
193             NeutronLoadBalancerListener singleton = input.getSingleton();
194
195             /*
196              *  Verify that the LoadBalancerListener doesn't already exist.
197              */
198             if (loadBalancerListenerInterface.neutronLoadBalancerListenerExists(singleton.getLoadBalancerListenerID())) {
199                 throw new BadRequestException("LoadBalancerListener UUID already exists");
200             }
201             loadBalancerListenerInterface.addNeutronLoadBalancerListener(singleton);
202
203             Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerListenerAware.class, this, null);
204             if (instances != null) {
205                 for (Object instance : instances) {
206                     INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
207                     int status = service.canCreateNeutronLoadBalancerListener(singleton);
208                     if (status < 200 || status > 299) {
209                         return Response.status(status).build();
210                     }
211                 }
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 = ServiceHelper.getGlobalInstances(INeutronLoadBalancerListenerAware.class, this, null);
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                     for (Object instance : instances) {
240                         INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
241                         int status = service.canCreateNeutronLoadBalancerListener(test);
242                         if (status < 200 || status > 299) {
243                             return Response.status(status).build();
244                         }
245                     }
246                 }
247             }
248             /*
249              * now, each element of the bulk request can be added to the cache
250              */
251             i = bulk.iterator();
252             while (i.hasNext()) {
253                 NeutronLoadBalancerListener test = i.next();
254                 loadBalancerListenerInterface.addNeutronLoadBalancerListener(test);
255                 if (instances != null) {
256                     for (Object instance : instances) {
257                         INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
258                         service.neutronLoadBalancerListenerCreated(test);
259                     }
260                 }
261             }
262         }
263         return Response.status(201).entity(input).build();
264     }
265
266     /**
267      * Updates a LoadBalancerListener Policy
268      */
269     @Path("{loadBalancerListenerID}")
270     @PUT
271     @Produces({ MediaType.APPLICATION_JSON })
272     @Consumes({ MediaType.APPLICATION_JSON })
273     @StatusCodes({
274             @ResponseCode(code = 200, condition = "Operation successful"),
275             @ResponseCode(code = 400, condition = "Bad Request"),
276             @ResponseCode(code = 401, condition = "Unauthorized"),
277             @ResponseCode(code = 403, condition = "Forbidden"),
278             @ResponseCode(code = 404, condition = "Not Found"),
279             @ResponseCode(code = 501, condition = "Not Implemented") })
280     public Response updateLoadBalancerListener(
281             @PathParam("loadBalancerListenerID") String loadBalancerListenerID, final NeutronLoadBalancerListenerRequest input) {
282         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
283         if (loadBalancerListenerInterface == null) {
284             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
285                     + RestMessages.SERVICEUNAVAILABLE.toString());
286         }
287
288         /*
289          * verify the LoadBalancerListener exists and there is only one delta provided
290          */
291         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
292             throw new ResourceNotFoundException("LoadBalancerListener UUID does not exist.");
293         }
294         if (!input.isSingleton()) {
295             throw new BadRequestException("Only singleton edit supported");
296         }
297         NeutronLoadBalancerListener delta = input.getSingleton();
298         NeutronLoadBalancerListener original = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
299
300         /*
301          * updates restricted by Neutron
302          */
303         if (delta.getLoadBalancerListenerID() != null ||
304                 delta.getNeutronLoadBalancerListenerDefaultPoolID() != null ||
305                 delta.getLoadBalancerListenerTenantID() != null ||
306                 delta.getLoadBalancerListenerName() != null ||
307                 delta.getLoadBalancerListenerDescription() != null ||
308                 delta.getLoadBalancerListenerIsShared() != null ||
309                 delta.getNeutronLoadBalancerListenerProtocol() != null ||
310                 delta.getNeutronLoadBalancerListenerProtocolPort() != null ||
311                 delta.getNeutronLoadBalancerListenerLoadBalancerID() != null ||
312                 delta.getLoadBalancerListenerAdminStateIsUp() != null ||
313                 delta.getLoadBalancerListenerStatus() != null) {
314             throw new BadRequestException("Attribute edit blocked by Neutron");
315         }
316
317         Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerListenerAware.class, this, null);
318         if (instances != null) {
319             for (Object instance : instances) {
320                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
321                 int status = service.canUpdateNeutronLoadBalancerListener(delta, original);
322                 if (status < 200 || status > 299) {
323                     return Response.status(status).build();
324                 }
325             }
326         }
327
328         /*
329          * update the object and return it
330          */
331         loadBalancerListenerInterface.updateNeutronLoadBalancerListener(loadBalancerListenerID, delta);
332         NeutronLoadBalancerListener updatedLoadBalancerListener = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
333         if (instances != null) {
334             for (Object instance : instances) {
335                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
336                 service.neutronLoadBalancerListenerUpdated(updatedLoadBalancerListener);
337             }
338         }
339         return Response.status(200).entity(new NeutronLoadBalancerListenerRequest(loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID))).build();
340     }
341
342     /**
343      * Deletes a LoadBalancerListener */
344
345     @Path("{loadBalancerListenerID}")
346     @DELETE
347     @StatusCodes({
348             @ResponseCode(code = 204, condition = "No Content"),
349             @ResponseCode(code = 401, condition = "Unauthorized"),
350             @ResponseCode(code = 404, condition = "Not Found"),
351             @ResponseCode(code = 409, condition = "Conflict"),
352             @ResponseCode(code = 501, condition = "Not Implemented") })
353     public Response deleteLoadBalancerListener(
354             @PathParam("loadBalancerListenerID") String loadBalancerListenerID) {
355         INeutronLoadBalancerListenerCRUD loadBalancerListenerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerListenerCRUD(this);
356         if (loadBalancerListenerInterface == null) {
357             throw new ServiceUnavailableException("LoadBalancerListener CRUD Interface "
358                     + RestMessages.SERVICEUNAVAILABLE.toString());
359         }
360
361         /*
362          * verify the LoadBalancerListener exists and it isn't currently in use
363          */
364         if (!loadBalancerListenerInterface.neutronLoadBalancerListenerExists(loadBalancerListenerID)) {
365             throw new ResourceNotFoundException("LoadBalancerListener UUID does not exist.");
366         }
367         if (loadBalancerListenerInterface.neutronLoadBalancerListenerInUse(loadBalancerListenerID)) {
368             return Response.status(409).build();
369         }
370         NeutronLoadBalancerListener singleton = loadBalancerListenerInterface.getNeutronLoadBalancerListener(loadBalancerListenerID);
371         Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerListenerAware.class, this, null);
372         if (instances != null) {
373             for (Object instance : instances) {
374                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
375                 int status = service.canDeleteNeutronLoadBalancerListener(singleton);
376                 if (status < 200 || status > 299) {
377                     return Response.status(status).build();
378                 }
379             }
380         }
381
382         loadBalancerListenerInterface.removeNeutronLoadBalancerListener(loadBalancerListenerID);
383         if (instances != null) {
384             for (Object instance : instances) {
385                 INeutronLoadBalancerListenerAware service = (INeutronLoadBalancerListenerAware) instance;
386                 service.neutronLoadBalancerListenerDeleted(singleton);
387             }
388         }
389         return Response.status(204).build();
390     }
391 }