blob: 33a0fa6737a7803d4c61a58e60a45b819d60b478 [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
Jian Li7b8c3682019-05-12 13:57:15 +090019import org.apache.commons.io.IOUtils;
20import org.onosproject.openstacknetworking.api.OpenstackHaService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090021import 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.openstack.networking.domain.NeutronFloatingIP;
musonous95c3ee52016-02-23 10:54:34 +090024import org.slf4j.Logger;
25import org.slf4j.LoggerFactory;
26
27import javax.ws.rs.Consumes;
28import javax.ws.rs.DELETE;
29import javax.ws.rs.POST;
30import javax.ws.rs.PUT;
31import javax.ws.rs.Path;
32import javax.ws.rs.PathParam;
33import javax.ws.rs.Produces;
Hyunsun Moon44aac662017-02-18 02:07:01 +090034import javax.ws.rs.core.Context;
musonous95c3ee52016-02-23 10:54:34 +090035import javax.ws.rs.core.MediaType;
36import javax.ws.rs.core.Response;
Hyunsun Moon44aac662017-02-18 02:07:01 +090037import javax.ws.rs.core.UriBuilder;
38import javax.ws.rs.core.UriInfo;
Jian Li7b8c3682019-05-12 13:57:15 +090039import java.io.IOException;
musonous95c3ee52016-02-23 10:54:34 +090040import java.io.InputStream;
41
Hyunsun Moon44aac662017-02-18 02:07:01 +090042import static javax.ws.rs.core.Response.created;
43import static javax.ws.rs.core.Response.noContent;
44import static javax.ws.rs.core.Response.status;
Jian Li7b8c3682019-05-12 13:57:15 +090045import static org.onosproject.openstacknetworking.api.Constants.REST_UTF8;
Jian Lidea0fdb2018-04-02 19:02:48 +090046import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.jsonToModelEntity;
Jian Li7b8c3682019-05-12 13:57:15 +090047import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.syncDelete;
48import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.syncPost;
49import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.syncPut;
musonous95c3ee52016-02-23 10:54:34 +090050
51/**
Jian Li68efab42019-03-31 19:43:18 +090052 * Handles floating IP REST API call of Neutron L3 plugin.
musonous95c3ee52016-02-23 10:54:34 +090053 */
54@Path("floatingips")
55public class OpenstackFloatingIpWebResource extends AbstractWebResource {
56 private final Logger log = LoggerFactory.getLogger(getClass());
57
Hyunsun Moon44aac662017-02-18 02:07:01 +090058 private static final String MESSAGE = "Received floating IP %s request";
59 private static final String FLOATING_IPS = "floatingips";
60
61 private final OpenstackRouterAdminService adminService =
Jian Li5c51d90a2018-02-20 14:10:25 +090062 get(OpenstackRouterAdminService.class);
Jian Li7b8c3682019-05-12 13:57:15 +090063 private final OpenstackHaService haService = get(OpenstackHaService.class);
Hyunsun Moon44aac662017-02-18 02:07:01 +090064
65 @Context
66 private UriInfo uriInfo;
musonous95c3ee52016-02-23 10:54:34 +090067
68 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +090069 * Creates a floating IP from the JSON input stream.
musonous95c3ee52016-02-23 10:54:34 +090070 *
Hyunsun Moon44aac662017-02-18 02:07:01 +090071 * @param input floating ip JSON input stream
72 * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
73 * is invalid or duplicated floating ip already exists
Jian Li7b8c3682019-05-12 13:57:15 +090074 * @throws IOException exception
Jian Li2077f662018-02-12 14:01:35 +090075 * @onos.rsModel NeutronFloatingIp
musonous95c3ee52016-02-23 10:54:34 +090076 */
77 @POST
78 @Consumes(MediaType.APPLICATION_JSON)
79 @Produces(MediaType.APPLICATION_JSON)
Jian Li7b8c3682019-05-12 13:57:15 +090080 public Response createFloatingIp(InputStream input) throws IOException {
Hyunsun Moon44aac662017-02-18 02:07:01 +090081 log.trace(String.format(MESSAGE, "CREATE"));
musonous95c3ee52016-02-23 10:54:34 +090082
Jian Li7b8c3682019-05-12 13:57:15 +090083 String inputStr = IOUtils.toString(input, REST_UTF8);
84
85 if (!haService.isActive()) {
86 return syncPost(haService, FLOATING_IPS, inputStr);
87 }
88
Jian Li091d8d22018-02-20 10:42:06 +090089 final NeutronFloatingIP floatingIp = (NeutronFloatingIP)
Jian Li7b8c3682019-05-12 13:57:15 +090090 jsonToModelEntity(inputStr, NeutronFloatingIP.class);
Jian Li091d8d22018-02-20 10:42:06 +090091
Hyunsun Moon44aac662017-02-18 02:07:01 +090092 adminService.createFloatingIp(floatingIp);
musonous95c3ee52016-02-23 10:54:34 +090093
Hyunsun Moon44aac662017-02-18 02:07:01 +090094 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
95 .path(FLOATING_IPS)
96 .path(floatingIp.getId());
musonous95c3ee52016-02-23 10:54:34 +090097
Hyunsun Moon44aac662017-02-18 02:07:01 +090098 return created(locationBuilder.build()).build();
musonous95c3ee52016-02-23 10:54:34 +090099 }
100
101 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +0900102 * Updates the floating IP with the specified identifier.
musonous95c3ee52016-02-23 10:54:34 +0900103 *
Hyunsun Moon44aac662017-02-18 02:07:01 +0900104 * @param id floating ip identifier
105 * @param input floating ip JSON input stream
106 * @return 200 OK with the updated floating ip, 400 BAD_REQUEST if the requested
107 * floating ip does not exist
Jian Li7b8c3682019-05-12 13:57:15 +0900108 * @throws IOException exception
Jian Li2077f662018-02-12 14:01:35 +0900109 * @onos.rsModel NeutronFloatingIp
musonous95c3ee52016-02-23 10:54:34 +0900110 */
111 @PUT
112 @Path("{id}")
113 @Consumes(MediaType.APPLICATION_JSON)
114 @Produces(MediaType.APPLICATION_JSON)
Jian Li7b8c3682019-05-12 13:57:15 +0900115 public Response updateFloatingIp(@PathParam("id") String id, InputStream input) throws IOException {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900116 log.trace(String.format(MESSAGE, "UPDATE " + id));
musonous95c3ee52016-02-23 10:54:34 +0900117
Jian Li7b8c3682019-05-12 13:57:15 +0900118 String inputStr = IOUtils.toString(input, REST_UTF8);
119
120 if (!haService.isActive()) {
121 return syncPut(haService, FLOATING_IPS, id, inputStr);
122 }
123
Jian Li091d8d22018-02-20 10:42:06 +0900124 final NeutronFloatingIP floatingIp = (NeutronFloatingIP)
Jian Li7b8c3682019-05-12 13:57:15 +0900125 jsonToModelEntity(inputStr, NeutronFloatingIP.class);
Jian Li091d8d22018-02-20 10:42:06 +0900126
Hyunsun Moon44aac662017-02-18 02:07:01 +0900127 adminService.updateFloatingIp(floatingIp);
musonous95c3ee52016-02-23 10:54:34 +0900128
Hyunsun Moon44aac662017-02-18 02:07:01 +0900129 return status(Response.Status.OK).build();
musonous95c3ee52016-02-23 10:54:34 +0900130 }
131
132 /**
Hyunsun Moon44aac662017-02-18 02:07:01 +0900133 * Removes the floating IP.
musonous95c3ee52016-02-23 10:54:34 +0900134 *
Hyunsun Moon44aac662017-02-18 02:07:01 +0900135 * @param id floating ip identifier
136 * @return 204 NO_CONTENT, 400 BAD_REQUEST if the floating ip does not exist
musonous95c3ee52016-02-23 10:54:34 +0900137 */
138 @DELETE
139 @Path("{id}")
jskim7d881742016-09-13 09:39:02 +0900140 @Consumes(MediaType.APPLICATION_JSON)
musonous95c3ee52016-02-23 10:54:34 +0900141 public Response deleteFloatingIp(@PathParam("id") String id) {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900142 log.trace(String.format(MESSAGE, "DELETE " + id));
musonous95c3ee52016-02-23 10:54:34 +0900143
Jian Li7b8c3682019-05-12 13:57:15 +0900144 if (!haService.isActive()) {
145 return syncDelete(haService, FLOATING_IPS, id);
146 }
147
Hyunsun Moon44aac662017-02-18 02:07:01 +0900148 adminService.removeFloatingIp(id);
149 return noContent().build();
musonous95c3ee52016-02-23 10:54:34 +0900150 }
musonous95c3ee52016-02-23 10:54:34 +0900151}