blob: fb6416480570c55d1652b36a10bac16d87f4bfe9 [file] [log] [blame]
Madan Jampani38a88212015-09-15 11:21:27 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Madan Jampani38a88212015-09-15 11:21:27 -07003 *
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 */
16package org.onosproject.vtnweb.resources;
17
Jian Lic2a542b2016-05-10 11:48:19 -070018import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.ObjectMapper;
20import com.fasterxml.jackson.databind.node.ObjectNode;
21import com.google.common.collect.Maps;
22import org.onlab.util.ItemNotFoundException;
23import org.onosproject.rest.AbstractWebResource;
24import org.onosproject.vtnrsc.DefaultTenantNetwork;
25import org.onosproject.vtnrsc.PhysicalNetwork;
26import org.onosproject.vtnrsc.SegmentationId;
27import org.onosproject.vtnrsc.TenantId;
28import org.onosproject.vtnrsc.TenantNetwork;
29import org.onosproject.vtnrsc.TenantNetwork.State;
30import org.onosproject.vtnrsc.TenantNetwork.Type;
31import org.onosproject.vtnrsc.TenantNetworkId;
lishuai38eeac42016-05-19 15:34:30 +080032import org.onosproject.vtnrsc.service.VtnRscService;
Jian Lic2a542b2016-05-10 11:48:19 -070033import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
34import org.onosproject.vtnweb.web.TenantNetworkCodec;
35import org.slf4j.Logger;
36import org.slf4j.LoggerFactory;
Madan Jampani38a88212015-09-15 11:21:27 -070037
38import javax.ws.rs.Consumes;
39import javax.ws.rs.DELETE;
40import javax.ws.rs.GET;
41import javax.ws.rs.POST;
42import javax.ws.rs.PUT;
43import javax.ws.rs.Path;
44import javax.ws.rs.PathParam;
45import javax.ws.rs.Produces;
46import javax.ws.rs.QueryParam;
47import javax.ws.rs.core.MediaType;
48import javax.ws.rs.core.Response;
Jian Lic2a542b2016-05-10 11:48:19 -070049import java.io.InputStream;
50import java.util.Collections;
51import java.util.HashSet;
52import java.util.Iterator;
53import java.util.Set;
54import java.util.concurrent.ConcurrentMap;
Madan Jampani38a88212015-09-15 11:21:27 -070055
Jian Lic2a542b2016-05-10 11:48:19 -070056import static com.google.common.base.Preconditions.checkArgument;
57import static com.google.common.base.Preconditions.checkNotNull;
58import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
59import static javax.ws.rs.core.Response.Status.NOT_FOUND;
60import static javax.ws.rs.core.Response.Status.OK;
Madan Jampani38a88212015-09-15 11:21:27 -070061
62/**
63 * REST resource for interacting with the inventory of networks.
64 */
65@Path("networks")
66public class TenantNetworkWebResource extends AbstractWebResource {
67 public static final String NETWORK_NOT_FOUND = "Network is not found";
68 public static final String NETWORK_ID_EXIST = "Network id is existed";
69 public static final String NETWORK_ID_NOT_EXIST = "Network id is not existed";
70 public static final String CREATE_NETWORK = "create network";
71 public static final String UPDATE_NETWORK = "update network";
72 public static final String DELETE_NETWORK = "delete network";
73 public static final String JSON_NOT_NULL = "JsonNode can not be null";
74
Ray Milkey9c9cde42018-01-12 14:22:06 -080075 private static final Logger log = LoggerFactory
Madan Jampani38a88212015-09-15 11:21:27 -070076 .getLogger(TenantNetworkWebResource.class);
77 private final ConcurrentMap<TenantNetworkId, TenantNetwork> networksMap = Maps
78 .newConcurrentMap();
79
80 @GET
Wu wenbind0b119f2016-05-11 18:03:41 +080081 @Produces(MediaType.APPLICATION_JSON)
82 @Consumes(MediaType.APPLICATION_JSON)
Madan Jampani38a88212015-09-15 11:21:27 -070083 public Response getNetworks(@QueryParam("id") String queryId,
84 @QueryParam("name") String queryName,
85 @QueryParam("admin_state_up") String queryadminStateUp,
86 @QueryParam("status") String querystate,
87 @QueryParam("shared") String queryshared,
88 @QueryParam("tenant_id") String querytenantId,
89 @QueryParam("router:external") String routerExternal,
90 @QueryParam("provider:network_type") String type,
91 @QueryParam("provider:physical_network") String physicalNetwork,
92 @QueryParam("provider:segmentation_id") String segmentationId) {
93 Iterable<TenantNetwork> networks = get(TenantNetworkService.class)
94 .getNetworks();
95 Iterator<TenantNetwork> networkors = networks.iterator();
96 while (networkors.hasNext()) {
97 TenantNetwork network = networkors.next();
98 if ((queryId == null || queryId.equals(network.id().toString()))
99 && (queryName == null || queryName.equals(network.name()))
100 && (queryadminStateUp == null || queryadminStateUp
Satish K32035572015-11-22 14:49:14 +0530101 .equals(Boolean.toString(network.adminStateUp())))
Madan Jampani38a88212015-09-15 11:21:27 -0700102 && (querystate == null || querystate.equals(network.state()
103 .toString()))
Satish K32035572015-11-22 14:49:14 +0530104 && (queryshared == null || queryshared.equals(Boolean.toString(network
105 .shared())))
Madan Jampani38a88212015-09-15 11:21:27 -0700106 && (querytenantId == null || querytenantId.equals(network
107 .tenantId().toString()))
Satish K32035572015-11-22 14:49:14 +0530108 && (routerExternal == null || routerExternal.equals(Boolean.toString(network
109 .routerExternal())))
110 && (type == null || type.equals(network.type().toString()))
Madan Jampani38a88212015-09-15 11:21:27 -0700111 && (physicalNetwork == null || physicalNetwork
Satish K32035572015-11-22 14:49:14 +0530112 .equals(network.physicalNetwork().toString()))
Madan Jampani38a88212015-09-15 11:21:27 -0700113 && (segmentationId == null || segmentationId.equals(network
Satish K32035572015-11-22 14:49:14 +0530114 .segmentationId().toString()))) {
Madan Jampani38a88212015-09-15 11:21:27 -0700115 networksMap.putIfAbsent(network.id(), network);
116 }
117 }
118 networks = Collections.unmodifiableCollection(networksMap.values());
119 ObjectNode result = new ObjectMapper().createObjectNode();
120 result.set("networks", new TenantNetworkCodec().encode(networks, this));
121
122 return ok(result.toString()).build();
123 }
124
125 private State isState(String state) {
Jon Halla3fcf672017-03-28 16:53:22 -0700126 if ("ACTIVE".equals(state)) {
Madan Jampani38a88212015-09-15 11:21:27 -0700127 return TenantNetwork.State.ACTIVE;
Jon Halla3fcf672017-03-28 16:53:22 -0700128 } else if ("BUILD".equals(state)) {
Madan Jampani38a88212015-09-15 11:21:27 -0700129 return TenantNetwork.State.BUILD;
Jon Halla3fcf672017-03-28 16:53:22 -0700130 } else if ("DOWN".equals(state)) {
Madan Jampani38a88212015-09-15 11:21:27 -0700131 return TenantNetwork.State.DOWN;
Jon Halla3fcf672017-03-28 16:53:22 -0700132 } else if ("ERROR".equals(state)) {
Madan Jampani38a88212015-09-15 11:21:27 -0700133 return TenantNetwork.State.ERROR;
134 } else {
135 return null;
136 }
137 }
138
139 private Type isType(String type) {
Jon Halla3fcf672017-03-28 16:53:22 -0700140 if ("LOCAL".equals(type)) {
Madan Jampani38a88212015-09-15 11:21:27 -0700141 return TenantNetwork.Type.LOCAL;
142 } else {
143 return null;
144 }
145 }
146
147 @GET
148 @Path("{id}")
Wu wenbind0b119f2016-05-11 18:03:41 +0800149 @Produces(MediaType.APPLICATION_JSON)
150 @Consumes(MediaType.APPLICATION_JSON)
Madan Jampani38a88212015-09-15 11:21:27 -0700151 public Response getNetwork(@PathParam("id") String id) {
152
153 if (!get(TenantNetworkService.class).exists(TenantNetworkId
154 .networkId(id))) {
lishuai0f47f342015-09-16 11:38:48 +0800155 return Response.status(NOT_FOUND)
156 .entity(NETWORK_NOT_FOUND).build();
Madan Jampani38a88212015-09-15 11:21:27 -0700157 }
158 TenantNetwork network = nullIsNotFound(get(TenantNetworkService.class)
159 .getNetwork(TenantNetworkId.networkId(id)), NETWORK_NOT_FOUND);
160 ObjectNode result = new ObjectMapper().createObjectNode();
161 result.set("network", new TenantNetworkCodec().encode(network, this));
162
163 return ok(result.toString()).build();
164
165 }
166
167 @POST
168 @Produces(MediaType.APPLICATION_JSON)
169 @Consumes(MediaType.APPLICATION_JSON)
170 public Response createNetworks(InputStream input) {
171 try {
172 ObjectMapper mapper = new ObjectMapper();
173 JsonNode cfg = mapper.readTree(input);
174 JsonNode nodes = null;
175 Iterable<TenantNetwork> networks = null;
176 if (cfg.get("network") != null) {
177 nodes = cfg.get("network");
178 if (nodes.isArray()) {
179 networks = changeJson2objs(nodes);
180 } else {
181 networks = changeJson2obj(CREATE_NETWORK, null, nodes);
182 }
183 } else if (cfg.get("networks") != null) {
184 nodes = cfg.get("networks");
185 networks = changeJson2objs(nodes);
186 }
187 Boolean issuccess = nullIsNotFound((get(TenantNetworkService.class)
188 .createNetworks(networks)),
189 NETWORK_NOT_FOUND);
190
191 if (!issuccess) {
192 return Response.status(INTERNAL_SERVER_ERROR)
193 .entity(NETWORK_ID_EXIST).build();
194 }
195 return Response.status(OK).entity(issuccess.toString()).build();
196 } catch (Exception e) {
197 log.error("Creates tenantNetwork exception {}.", e.toString());
198 return Response.status(INTERNAL_SERVER_ERROR).entity(e.toString())
199 .build();
200 }
201 }
202
203 @PUT
204 @Path("{id}")
205 @Produces(MediaType.APPLICATION_JSON)
206 @Consumes(MediaType.APPLICATION_JSON)
207 public Response updateNetworks(@PathParam("id") String id, InputStream input) {
208 try {
209 ObjectMapper mapper = new ObjectMapper();
210 JsonNode cfg = mapper.readTree(input);
211 JsonNode nodes = null;
212 Iterable<TenantNetwork> networks = null;
213 if (cfg.get("network") != null) {
214 nodes = cfg.get("network");
215 if (nodes.isArray()) {
216 networks = changeJson2objs(nodes);
217 } else {
218 networks = changeJson2obj(UPDATE_NETWORK,
219 TenantNetworkId.networkId(id),
220 nodes);
221 }
222 } else if (cfg.get("networks") != null) {
223 nodes = cfg.get("networks");
224 networks = changeJson2objs(nodes);
225 }
226 Boolean issuccess = nullIsNotFound((get(TenantNetworkService.class)
227 .updateNetworks(networks)),
228 NETWORK_NOT_FOUND);
229 if (!issuccess) {
230 return Response.status(INTERNAL_SERVER_ERROR)
231 .entity(NETWORK_ID_NOT_EXIST).build();
232 }
233 return Response.status(OK).entity(issuccess.toString()).build();
234 } catch (Exception e) {
235 log.error("Updates tenantNetwork failed because of exception {}.",
236 e.toString());
237 return Response.status(INTERNAL_SERVER_ERROR).entity(e.toString())
238 .build();
239 }
240 }
241
242 @DELETE
243 @Path("{id}")
Wu wenbinb0bd6132016-05-10 19:20:23 +0800244 @Consumes(MediaType.APPLICATION_JSON)
245 @Produces(MediaType.APPLICATION_JSON)
Madan Jampani38a88212015-09-15 11:21:27 -0700246 public Response deleteNetworks(@PathParam("id") String id) {
247 log.debug("Deletes network by identifier {}.", id);
248 Set<TenantNetworkId> networkSet = new HashSet<>();
249 networkSet.add(TenantNetworkId.networkId(id));
250 Boolean issuccess = nullIsNotFound(get(TenantNetworkService.class)
251 .removeNetworks(networkSet), NETWORK_NOT_FOUND);
252 if (!issuccess) {
253 log.debug("Network identifier {} is not existed", id);
254 return Response.status(INTERNAL_SERVER_ERROR)
255 .entity(NETWORK_ID_NOT_EXIST).build();
256 }
Jian Lic2a542b2016-05-10 11:48:19 -0700257 return ok(issuccess.toString()).build();
Madan Jampani38a88212015-09-15 11:21:27 -0700258 }
259
260 /**
261 * Returns a collection of tenantNetworks.
262 *
263 * @param flag the flag
264 * @param networkId network identifier
265 * @param node the network json node
266 * @return a collection of tenantNetworks
267 */
268 public Iterable<TenantNetwork> changeJson2obj(String flag,
269 TenantNetworkId networkId,
270 JsonNode node) {
271 checkNotNull(node, JSON_NOT_NULL);
272 TenantNetwork network = null;
273 ConcurrentMap<TenantNetworkId, TenantNetwork> networksMap = Maps
274 .newConcurrentMap();
Satish Kab54ffa2015-11-27 14:19:42 +0530275 checkArgument(node.get("admin_state_up").isBoolean(), "admin_state_up should be boolean");
276 checkArgument(node.get("shared").isBoolean(), "shared should be boolean");
277 checkArgument(node.get("router:external").isBoolean(), "router:external should be boolean");
278 String name = node.get("name").asText();
279 boolean adminStateUp = node.get("admin_state_up").asBoolean();
280 String state = node.get("status").asText();
281 boolean shared = node.get("shared").asBoolean();
lishuai38eeac42016-05-19 15:34:30 +0800282 String tenantIdStr = node.get("tenant_id").asText();
Satish Kab54ffa2015-11-27 14:19:42 +0530283 boolean routerExternal = node.get("router:external").asBoolean();
284 String type = node.get("provider:network_type").asText();
285 String physicalNetwork = node.get("provider:physical_network").asText();
lishuai38eeac42016-05-19 15:34:30 +0800286 String segmentationIdStr = node.get("provider:segmentation_id").asText();
287 SegmentationId segmentationId = SegmentationId.segmentationId(segmentationIdStr);
288 TenantId tenantId = TenantId.tenantId(tenantIdStr);
Jon Halla3fcf672017-03-28 16:53:22 -0700289 if (segmentationIdStr == null || "null".equals(segmentationIdStr)) {
lishuai38eeac42016-05-19 15:34:30 +0800290 segmentationId = get(VtnRscService.class).getL3vni(tenantId);
291 }
Satish Kab54ffa2015-11-27 14:19:42 +0530292 TenantNetworkId id = null;
293 if (flag.equals(CREATE_NETWORK)) {
294 id = TenantNetworkId.networkId(node.get("id").asText());
295 } else if (flag.equals(UPDATE_NETWORK)) {
296 id = networkId;
Madan Jampani38a88212015-09-15 11:21:27 -0700297 }
Satish Kab54ffa2015-11-27 14:19:42 +0530298 network = new DefaultTenantNetwork(
299 id,
300 name,
301 adminStateUp,
302 isState(state),
303 shared,
lishuai38eeac42016-05-19 15:34:30 +0800304 tenantId,
Satish Kab54ffa2015-11-27 14:19:42 +0530305 routerExternal,
306 isType(type),
307 PhysicalNetwork
308 .physicalNetwork(physicalNetwork),
lishuai38eeac42016-05-19 15:34:30 +0800309 segmentationId);
Satish Kab54ffa2015-11-27 14:19:42 +0530310 networksMap.putIfAbsent(id, network);
311
Madan Jampani38a88212015-09-15 11:21:27 -0700312 return Collections.unmodifiableCollection(networksMap.values());
313 }
314
315 /**
316 * Returns a collection of tenantNetworks.
317 *
318 * @param nodes the network jsonnodes
319 * @return a collection of tenantNetworks
320 */
321 public Iterable<TenantNetwork> changeJson2objs(JsonNode nodes) {
322 checkNotNull(nodes, JSON_NOT_NULL);
323 TenantNetwork network = null;
324 ConcurrentMap<TenantNetworkId, TenantNetwork> networksMap = Maps
325 .newConcurrentMap();
Satish Kab54ffa2015-11-27 14:19:42 +0530326 for (JsonNode node : nodes) {
327 String id = node.get("id").asText();
328 String name = node.get("name").asText();
329 boolean adminStateUp = node.get("admin_state_up").asBoolean();
330 String state = node.get("status").asText();
331 boolean shared = node.get("shared").asBoolean();
lishuai38eeac42016-05-19 15:34:30 +0800332 String tenantIdStr = node.get("tenant_id").asText();
Satish Kab54ffa2015-11-27 14:19:42 +0530333 boolean routerExternal = node.get("router:external")
334 .asBoolean();
335 String type = node.get("provider:network_type").asText();
336 String physicalNetwork = node.get("provider:physical_network").asText();
lishuai38eeac42016-05-19 15:34:30 +0800337 String segmentationIdStr = node.get("provider:segmentation_id").asText();
338 SegmentationId segmentationId = SegmentationId.segmentationId(segmentationIdStr);
339 TenantId tenantId = TenantId.tenantId(tenantIdStr);
Jon Halla3fcf672017-03-28 16:53:22 -0700340 if (segmentationIdStr == null || "null".equals(segmentationIdStr)) {
lishuai38eeac42016-05-19 15:34:30 +0800341 segmentationId = get(VtnRscService.class).getL3vni(tenantId);
342 }
Satish Kab54ffa2015-11-27 14:19:42 +0530343 network = new DefaultTenantNetwork(
344 TenantNetworkId.networkId(id),
345 name,
346 adminStateUp,
347 isState(state),
348 shared,
lishuai38eeac42016-05-19 15:34:30 +0800349 tenantId,
Satish Kab54ffa2015-11-27 14:19:42 +0530350 routerExternal,
351 isType(type),
352 PhysicalNetwork.physicalNetwork(physicalNetwork),
lishuai38eeac42016-05-19 15:34:30 +0800353 segmentationId);
Satish Kab54ffa2015-11-27 14:19:42 +0530354 networksMap.putIfAbsent(TenantNetworkId.networkId(id), network);
Madan Jampani38a88212015-09-15 11:21:27 -0700355 }
Satish Kab54ffa2015-11-27 14:19:42 +0530356
Madan Jampani38a88212015-09-15 11:21:27 -0700357 return Collections.unmodifiableCollection(networksMap.values());
358 }
359
360 /**
361 * Returns the specified item if that items is null; otherwise throws not
362 * found exception.
363 *
364 * @param item item to check
365 * @param <T> item type
366 * @param message not found message
367 * @return item if not null
368 * @throws org.onlab.util.ItemNotFoundException if item is null
369 */
370 protected <T> T nullIsNotFound(T item, String message) {
371 if (item == null) {
372 throw new ItemNotFoundException(message);
373 }
374 return item;
375 }
376}