blob: 0132d35b3c106599ba2a2c121e0312b272fe2966 [file] [log] [blame]
musonous95c3ee52016-02-23 10:54:34 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
musonous95c3ee52016-02-23 10:54:34 +09003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.openstacknetworking.web;
18
Hyunsun Moon44aac662017-02-18 02:07:01 +090019import com.fasterxml.jackson.databind.JsonNode;
20import org.onlab.osgi.DefaultServiceDirectory;
21import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
musonous95c3ee52016-02-23 10:54:34 +090022import org.onosproject.rest.AbstractWebResource;
Hyunsun Moon44aac662017-02-18 02:07:01 +090023import org.openstack4j.core.transport.ObjectMapperSingleton;
24import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
musonous95c3ee52016-02-23 10:54:34 +090025import org.slf4j.Logger;
26import org.slf4j.LoggerFactory;
27
28import javax.ws.rs.Consumes;
29import javax.ws.rs.DELETE;
30import javax.ws.rs.POST;
31import javax.ws.rs.PUT;
32import javax.ws.rs.Path;
33import javax.ws.rs.PathParam;
34import javax.ws.rs.Produces;
Hyunsun Moon44aac662017-02-18 02:07:01 +090035import javax.ws.rs.core.Context;
musonous95c3ee52016-02-23 10:54:34 +090036import javax.ws.rs.core.MediaType;
37import javax.ws.rs.core.Response;
Hyunsun Moon44aac662017-02-18 02:07:01 +090038import javax.ws.rs.core.UriBuilder;
39import javax.ws.rs.core.UriInfo;
musonous95c3ee52016-02-23 10:54:34 +090040import java.io.InputStream;
41
Hyunsun Moon44aac662017-02-18 02:07:01 +090042import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
43import static javax.ws.rs.core.Response.created;
44import static javax.ws.rs.core.Response.noContent;
45import static javax.ws.rs.core.Response.status;
musonous95c3ee52016-02-23 10:54:34 +090046
47/**
48 * Handles REST API call of Neutron L3 plugin.
49 */
50@Path("floatingips")
51public class OpenstackFloatingIpWebResource extends AbstractWebResource {
52 private final Logger log = LoggerFactory.getLogger(getClass());
53
Hyunsun Moon44aac662017-02-18 02:07:01 +090054 private static final String MESSAGE = "Received floating IP %s request";
55 private static final String FLOATING_IPS = "floatingips";
56
57 private final OpenstackRouterAdminService adminService =
58 DefaultServiceDirectory.getService(OpenstackRouterAdminService.class);
59
60 @Context
61 private UriInfo uriInfo;
musonous95c3ee52016-02-23 10:54:34 +090062
63 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +090064 * Creates a floating IP from the JSON input stream.
musonous95c3ee52016-02-23 10:54:34 +090065 *
Hyunsun Moon44aac662017-02-18 02:07:01 +090066 * @param input floating ip JSON input stream
67 * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
68 * is invalid or duplicated floating ip already exists
Jian Li2077f662018-02-12 14:01:35 +090069 * @onos.rsModel NeutronFloatingIp
musonous95c3ee52016-02-23 10:54:34 +090070 */
71 @POST
72 @Consumes(MediaType.APPLICATION_JSON)
73 @Produces(MediaType.APPLICATION_JSON)
74 public Response createFloatingIp(InputStream input) {
Hyunsun Moon44aac662017-02-18 02:07:01 +090075 log.trace(String.format(MESSAGE, "CREATE"));
musonous95c3ee52016-02-23 10:54:34 +090076
Hyunsun Moon44aac662017-02-18 02:07:01 +090077 final NeutronFloatingIP floatingIp = readFloatingIp(input);
78 adminService.createFloatingIp(floatingIp);
musonous95c3ee52016-02-23 10:54:34 +090079
Hyunsun Moon44aac662017-02-18 02:07:01 +090080 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
81 .path(FLOATING_IPS)
82 .path(floatingIp.getId());
musonous95c3ee52016-02-23 10:54:34 +090083
Hyunsun Moon44aac662017-02-18 02:07:01 +090084 return created(locationBuilder.build()).build();
musonous95c3ee52016-02-23 10:54:34 +090085 }
86
87 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +090088 * Updates the floating IP with the specified identifier.
musonous95c3ee52016-02-23 10:54:34 +090089 *
Hyunsun Moon44aac662017-02-18 02:07:01 +090090 * @param id floating ip identifier
91 * @param input floating ip JSON input stream
92 * @return 200 OK with the updated floating ip, 400 BAD_REQUEST if the requested
93 * floating ip does not exist
Jian Li2077f662018-02-12 14:01:35 +090094 * @onos.rsModel NeutronFloatingIp
musonous95c3ee52016-02-23 10:54:34 +090095 */
96 @PUT
97 @Path("{id}")
98 @Consumes(MediaType.APPLICATION_JSON)
99 @Produces(MediaType.APPLICATION_JSON)
100 public Response updateFloatingIp(@PathParam("id") String id, InputStream input) {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900101 log.trace(String.format(MESSAGE, "UPDATE " + id));
musonous95c3ee52016-02-23 10:54:34 +0900102
Hyunsun Moon44aac662017-02-18 02:07:01 +0900103 final NeutronFloatingIP floatingIp = readFloatingIp(input);
104 adminService.updateFloatingIp(floatingIp);
musonous95c3ee52016-02-23 10:54:34 +0900105
Hyunsun Moon44aac662017-02-18 02:07:01 +0900106 return status(Response.Status.OK).build();
musonous95c3ee52016-02-23 10:54:34 +0900107 }
108
109 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +0900110 * Removes the floating IP.
musonous95c3ee52016-02-23 10:54:34 +0900111 *
Hyunsun Moon44aac662017-02-18 02:07:01 +0900112 * @param id floating ip identifier
113 * @return 204 NO_CONTENT, 400 BAD_REQUEST if the floating ip does not exist
musonous95c3ee52016-02-23 10:54:34 +0900114 */
115 @DELETE
116 @Path("{id}")
jskim7d881742016-09-13 09:39:02 +0900117 @Consumes(MediaType.APPLICATION_JSON)
musonous95c3ee52016-02-23 10:54:34 +0900118 public Response deleteFloatingIp(@PathParam("id") String id) {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900119 log.trace(String.format(MESSAGE, "DELETE " + id));
musonous95c3ee52016-02-23 10:54:34 +0900120
Hyunsun Moon44aac662017-02-18 02:07:01 +0900121 adminService.removeFloatingIp(id);
122 return noContent().build();
musonous95c3ee52016-02-23 10:54:34 +0900123 }
124
Hyunsun Moon44aac662017-02-18 02:07:01 +0900125 private NeutronFloatingIP readFloatingIp(InputStream input) {
126 try {
127 JsonNode jsonTree = mapper().enable(INDENT_OUTPUT).readTree(input);
128 log.trace(mapper().writeValueAsString(jsonTree));
129 return ObjectMapperSingleton.getContext(NeutronFloatingIP.class)
130 .readerFor(NeutronFloatingIP.class)
131 .readValue(jsonTree);
132 } catch (Exception e) {
133 throw new IllegalArgumentException();
134 }
135 }
musonous95c3ee52016-02-23 10:54:34 +0900136}