blob: 0341aea7edef0dd3c954842001b930494c45913f [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
musonous95c3ee52016-02-23 10:54:34 +090069 */
70 @POST
71 @Consumes(MediaType.APPLICATION_JSON)
72 @Produces(MediaType.APPLICATION_JSON)
73 public Response createFloatingIp(InputStream input) {
Hyunsun Moon44aac662017-02-18 02:07:01 +090074 log.trace(String.format(MESSAGE, "CREATE"));
musonous95c3ee52016-02-23 10:54:34 +090075
Hyunsun Moon44aac662017-02-18 02:07:01 +090076 final NeutronFloatingIP floatingIp = readFloatingIp(input);
77 adminService.createFloatingIp(floatingIp);
musonous95c3ee52016-02-23 10:54:34 +090078
Hyunsun Moon44aac662017-02-18 02:07:01 +090079 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
80 .path(FLOATING_IPS)
81 .path(floatingIp.getId());
musonous95c3ee52016-02-23 10:54:34 +090082
Hyunsun Moon44aac662017-02-18 02:07:01 +090083 return created(locationBuilder.build()).build();
musonous95c3ee52016-02-23 10:54:34 +090084 }
85
86 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +090087 * Updates the floating IP with the specified identifier.
musonous95c3ee52016-02-23 10:54:34 +090088 *
Hyunsun Moon44aac662017-02-18 02:07:01 +090089 * @param id floating ip identifier
90 * @param input floating ip JSON input stream
91 * @return 200 OK with the updated floating ip, 400 BAD_REQUEST if the requested
92 * floating ip does not exist
musonous95c3ee52016-02-23 10:54:34 +090093 */
94 @PUT
95 @Path("{id}")
96 @Consumes(MediaType.APPLICATION_JSON)
97 @Produces(MediaType.APPLICATION_JSON)
98 public Response updateFloatingIp(@PathParam("id") String id, InputStream input) {
Hyunsun Moon44aac662017-02-18 02:07:01 +090099 log.trace(String.format(MESSAGE, "UPDATE " + id));
musonous95c3ee52016-02-23 10:54:34 +0900100
Hyunsun Moon44aac662017-02-18 02:07:01 +0900101 final NeutronFloatingIP floatingIp = readFloatingIp(input);
102 adminService.updateFloatingIp(floatingIp);
musonous95c3ee52016-02-23 10:54:34 +0900103
Hyunsun Moon44aac662017-02-18 02:07:01 +0900104 return status(Response.Status.OK).build();
musonous95c3ee52016-02-23 10:54:34 +0900105 }
106
107 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +0900108 * Removes the floating IP.
musonous95c3ee52016-02-23 10:54:34 +0900109 *
Hyunsun Moon44aac662017-02-18 02:07:01 +0900110 * @param id floating ip identifier
111 * @return 204 NO_CONTENT, 400 BAD_REQUEST if the floating ip does not exist
musonous95c3ee52016-02-23 10:54:34 +0900112 */
113 @DELETE
114 @Path("{id}")
jskim7d881742016-09-13 09:39:02 +0900115 @Consumes(MediaType.APPLICATION_JSON)
musonous95c3ee52016-02-23 10:54:34 +0900116 public Response deleteFloatingIp(@PathParam("id") String id) {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900117 log.trace(String.format(MESSAGE, "DELETE " + id));
musonous95c3ee52016-02-23 10:54:34 +0900118
Hyunsun Moon44aac662017-02-18 02:07:01 +0900119 adminService.removeFloatingIp(id);
120 return noContent().build();
musonous95c3ee52016-02-23 10:54:34 +0900121 }
122
Hyunsun Moon44aac662017-02-18 02:07:01 +0900123 private NeutronFloatingIP readFloatingIp(InputStream input) {
124 try {
125 JsonNode jsonTree = mapper().enable(INDENT_OUTPUT).readTree(input);
126 log.trace(mapper().writeValueAsString(jsonTree));
127 return ObjectMapperSingleton.getContext(NeutronFloatingIP.class)
128 .readerFor(NeutronFloatingIP.class)
129 .readValue(jsonTree);
130 } catch (Exception e) {
131 throw new IllegalArgumentException();
132 }
133 }
musonous95c3ee52016-02-23 10:54:34 +0900134}