blob: b6033150de68e6a8e831d5500de7decf886e3ced [file] [log] [blame]
sanghoshin94872a12015-10-16 18:04:34 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
sanghoshin94872a12015-10-16 18:04: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 */
sangho0c2a3da2016-02-16 13:39:07 +090016package org.onosproject.openstacknetworking.web;
sanghoshin94872a12015-10-16 18:04:34 +090017
Jian Li7b8c3682019-05-12 13:57:15 +090018import org.apache.commons.io.IOUtils;
19import org.onosproject.openstacknetworking.api.OpenstackHaService;
Hyunsun Moon44aac662017-02-18 02:07:01 +090020import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
sanghoshin94872a12015-10-16 18:04:34 +090021import org.onosproject.rest.AbstractWebResource;
Hyunsun Moon44aac662017-02-18 02:07:01 +090022import org.openstack4j.openstack.networking.domain.NeutronNetwork;
sanghoshin94872a12015-10-16 18:04:34 +090023import org.slf4j.Logger;
24import org.slf4j.LoggerFactory;
25
26import javax.ws.rs.Consumes;
sanghoshinf25d2e02015-11-11 23:07:17 +090027import javax.ws.rs.DELETE;
sanghoshin94872a12015-10-16 18:04:34 +090028import javax.ws.rs.POST;
sanghoshinf25d2e02015-11-11 23:07:17 +090029import javax.ws.rs.PUT;
sanghoshin94872a12015-10-16 18:04:34 +090030import javax.ws.rs.Path;
Hyunsun Moon44aac662017-02-18 02:07:01 +090031import javax.ws.rs.PathParam;
sanghoshin94872a12015-10-16 18:04:34 +090032import javax.ws.rs.Produces;
Hyunsun Moon44aac662017-02-18 02:07:01 +090033import javax.ws.rs.core.Context;
sanghoshin94872a12015-10-16 18:04:34 +090034import javax.ws.rs.core.MediaType;
35import javax.ws.rs.core.Response;
Hyunsun Moon44aac662017-02-18 02:07:01 +090036import javax.ws.rs.core.UriBuilder;
37import javax.ws.rs.core.UriInfo;
Jian Li7b8c3682019-05-12 13:57:15 +090038import java.io.IOException;
sanghoshin94872a12015-10-16 18:04:34 +090039import java.io.InputStream;
40
Hyunsun Moon44aac662017-02-18 02:07:01 +090041import static javax.ws.rs.core.Response.created;
42import static javax.ws.rs.core.Response.noContent;
43import static javax.ws.rs.core.Response.status;
Daniel Parkf8f4f202019-09-15 16:38:06 +090044import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_ACTIVE_IP_ADDRESS;
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;
Hyunsun Moon44aac662017-02-18 02:07:01 +090050
sanghoshinf25d2e02015-11-11 23:07:17 +090051/**
Jian Li68efab42019-03-31 19:43:18 +090052 * Handles network REST API call of Neutron ML2 plugin.
sanghoshinf25d2e02015-11-11 23:07:17 +090053 */
sanghoshin94872a12015-10-16 18:04:34 +090054@Path("networks")
55public class OpenstackNetworkWebResource extends AbstractWebResource {
Hyunsun Moon44aac662017-02-18 02:07:01 +090056 protected final Logger log = LoggerFactory.getLogger(getClass());
sanghoshin94872a12015-10-16 18:04:34 +090057
Hyunsun Moon44aac662017-02-18 02:07:01 +090058 private static final String MESSAGE = "Received networks %s request";
59 private static final String NETWORKS = "networks";
sanghoshin94872a12015-10-16 18:04:34 +090060
Hyunsun Moon44aac662017-02-18 02:07:01 +090061 private final OpenstackNetworkAdminService adminService =
Jian Li5fe34472018-02-21 10:24:31 +090062 get(OpenstackNetworkAdminService.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;
67
68 /**
69 * Creates a network from the JSON input stream.
70 *
71 * @param input network JSON input stream
72 * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
73 * is invalid or duplicated network already exists
Jian Li7b8c3682019-05-12 13:57:15 +090074 * @throws IOException exception
Jian Li2077f662018-02-12 14:01:35 +090075 * @onos.rsModel NeutronNetwork
Hyunsun Moon44aac662017-02-18 02:07:01 +090076 */
sanghoshin94872a12015-10-16 18:04:34 +090077 @POST
78 @Consumes(MediaType.APPLICATION_JSON)
79 @Produces(MediaType.APPLICATION_JSON)
Jian Li7b8c3682019-05-12 13:57:15 +090080 public Response createNetwork(InputStream input) throws IOException {
Hyunsun Moon44aac662017-02-18 02:07:01 +090081 log.trace(String.format(MESSAGE, "CREATE"));
82
Jian Li7b8c3682019-05-12 13:57:15 +090083 String inputStr = IOUtils.toString(input, REST_UTF8);
84
Daniel Parkf8f4f202019-09-15 16:38:06 +090085 if (!haService.isActive()
86 && !DEFAULT_ACTIVE_IP_ADDRESS.equals(haService.getActiveIp())) {
Jian Li7b8c3682019-05-12 13:57:15 +090087 return syncPost(haService, NETWORKS, inputStr);
88 }
89
Jian Li091d8d22018-02-20 10:42:06 +090090 final NeutronNetwork net = (NeutronNetwork)
Jian Li7b8c3682019-05-12 13:57:15 +090091 jsonToModelEntity(inputStr, NeutronNetwork.class);
Jian Li091d8d22018-02-20 10:42:06 +090092
Hyunsun Moon44aac662017-02-18 02:07:01 +090093 adminService.createNetwork(net);
94
95 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
96 .path(NETWORKS)
97 .path(net.getId());
98
99 return created(locationBuilder.build()).build();
sanghoshinf25d2e02015-11-11 23:07:17 +0900100 }
sanghoshin94872a12015-10-16 18:04:34 +0900101
Hyunsun Moon44aac662017-02-18 02:07:01 +0900102 /**
103 * Updates the network with the specified identifier.
104 *
105 * @param id network identifier
106 * @param input network JSON input stream
107 * @return 200 OK with the updated network, 400 BAD_REQUEST if the requested
108 * network does not exist
Jian Li7b8c3682019-05-12 13:57:15 +0900109 * @throws IOException exception
Jian Li2077f662018-02-12 14:01:35 +0900110 * @onos.rsModel NeutronNetwork
Hyunsun Moon44aac662017-02-18 02:07:01 +0900111 */
sanghoshinf25d2e02015-11-11 23:07:17 +0900112 @PUT
113 @Path("{id}")
114 @Consumes(MediaType.APPLICATION_JSON)
115 @Produces(MediaType.APPLICATION_JSON)
Jian Li7b8c3682019-05-12 13:57:15 +0900116 public Response updateNetwork(@PathParam("id") String id, InputStream input) throws IOException {
Hyunsun Moon44aac662017-02-18 02:07:01 +0900117 log.trace(String.format(MESSAGE, "UPDATE " + id));
118
Jian Li7b8c3682019-05-12 13:57:15 +0900119 String inputStr = IOUtils.toString(input, REST_UTF8);
120
Daniel Parkf8f4f202019-09-15 16:38:06 +0900121 if (!haService.isActive()
122 && !DEFAULT_ACTIVE_IP_ADDRESS.equals(haService.getActiveIp())) {
Jian Li7b8c3682019-05-12 13:57:15 +0900123 return syncPut(haService, NETWORKS, id, inputStr);
124 }
125
Jian Li091d8d22018-02-20 10:42:06 +0900126 final NeutronNetwork net = (NeutronNetwork)
Jian Li7b8c3682019-05-12 13:57:15 +0900127 jsonToModelEntity(inputStr, NeutronNetwork.class);
Jian Li091d8d22018-02-20 10:42:06 +0900128
Hyunsun Moon44aac662017-02-18 02:07:01 +0900129 adminService.updateNetwork(net);
130
131 return status(Response.Status.OK).build();
sanghoshinf25d2e02015-11-11 23:07:17 +0900132 }
sanghoshin94872a12015-10-16 18:04:34 +0900133
Hyunsun Moon44aac662017-02-18 02:07:01 +0900134 /**
135 * Removes the service network.
136 *
137 * @param id network identifier
138 * @return 204 NO_CONTENT, 400 BAD_REQUEST if the network does not exist
139 */
sanghoshinf25d2e02015-11-11 23:07:17 +0900140 @DELETE
141 @Path("{id}")
142 @Consumes(MediaType.APPLICATION_JSON)
Hyunsun Moon44aac662017-02-18 02:07:01 +0900143 @Produces(MediaType.APPLICATION_JSON)
144 public Response deleteNetwork(@PathParam("id") String id) {
145 log.trace(String.format(MESSAGE, "DELETE " + id));
146
Daniel Parkf8f4f202019-09-15 16:38:06 +0900147 if (!haService.isActive()
148 && !DEFAULT_ACTIVE_IP_ADDRESS.equals(haService.getActiveIp())) {
Jian Li7b8c3682019-05-12 13:57:15 +0900149 return syncDelete(haService, NETWORKS, id);
150 }
151
Hyunsun Moon44aac662017-02-18 02:07:01 +0900152 adminService.removeNetwork(id);
153 return noContent().build();
154 }
sanghoshin94872a12015-10-16 18:04:34 +0900155}