blob: 60fcc1464fdb1a2b41aecad854e6e4fdff8db4c4 [file] [log] [blame]
Jimo Jung14e87bf2018-09-03 16:28:13 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
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.openstackvtap.web;
17
18import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.node.ObjectNode;
Jimo Jung14e87bf2018-09-03 16:28:13 +090020import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
Jimo Jung1bf54352018-11-08 14:16:08 +090021import org.onosproject.openstackvtap.api.OpenstackVtapService;
Jimo Jung14e87bf2018-09-03 16:28:13 +090022import org.onosproject.rest.AbstractWebResource;
23import org.slf4j.Logger;
24import org.slf4j.LoggerFactory;
25
26import javax.ws.rs.Consumes;
27import javax.ws.rs.DELETE;
28import javax.ws.rs.GET;
29import javax.ws.rs.POST;
30import javax.ws.rs.PUT;
31import javax.ws.rs.Path;
32import javax.ws.rs.Produces;
33import javax.ws.rs.core.MediaType;
34import javax.ws.rs.core.Response;
35import java.io.InputStream;
36
37import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
38import static org.onlab.util.Tools.readTreeFromStream;
39
40/**
41 * Handles REST API call of openstack vtap network.
42 */
43@Path("vtap-network")
44public class OpenstackVtapNetworkWebResource extends AbstractWebResource {
45
46 private final Logger log = LoggerFactory.getLogger(getClass());
47
48 private static final String MESSAGE_NETWORK = "Received openstackVtapNetwork {} request";
49 private static final String ERROR_DUPLICATE = "Already has data {}";
50 private static final String ERROR_NOTFOUND = "No data to update {}";
51 private static final String CREATE = "CREATE";
52 private static final String READ = "READ";
53 private static final String UPDATE = "UPDATE";
54 private static final String DELETE = "DELETE";
55
56 private static final String NETWORK = "network";
57
Jimo Jung1bf54352018-11-08 14:16:08 +090058 private final OpenstackVtapService vtapService = get(OpenstackVtapService.class);
Jimo Jung14e87bf2018-09-03 16:28:13 +090059
60 /**
61 * Creates a openstack vtap network from the JSON input stream.
62 *
63 * @param input openstack vtap network JSON input stream
Jimo Jung1bf54352018-11-08 14:16:08 +090064 * @return 200 OK on creating success
Jimo Jung14e87bf2018-09-03 16:28:13 +090065 * 400 BAD_REQUEST if the JSON is malformed
Jimo Jung1bf54352018-11-08 14:16:08 +090066 * 409 CONFLICT if already the openstack vtap network exists
Jimo Jung14e87bf2018-09-03 16:28:13 +090067 * @onos.rsModel OpenstackVtapNetwork
68 */
69 @POST
70 @Consumes(MediaType.APPLICATION_JSON)
71 public Response createNetwork(InputStream input) {
72 log.info(MESSAGE_NETWORK, CREATE);
73
74 OpenstackVtapNetwork vtapNetwork = readNetworkConfiguration(input);
75 if (vtapNetwork == null) {
76 return Response.status(Response.Status.BAD_REQUEST).build();
77 }
78
Jimo Jung1bf54352018-11-08 14:16:08 +090079 if (vtapService.createVtapNetwork(vtapNetwork.mode(),
Jimo Jung14e87bf2018-09-03 16:28:13 +090080 vtapNetwork.networkId(), vtapNetwork.serverIp()) == null) {
81 log.warn(ERROR_DUPLICATE, vtapNetwork);
82 return Response.status(Response.Status.CONFLICT).build();
83 }
84 return Response.ok().build();
85 }
86
87 /**
88 * Updates openstack vtap network from the JSON input stream.
89 *
90 * @param input openstack vtap network JSON input stream
Jimo Jung1bf54352018-11-08 14:16:08 +090091 * @return 200 OK on updating success
Jimo Jung14e87bf2018-09-03 16:28:13 +090092 * 400 BAD_REQUEST if the JSON is malformed
Jimo Jung1bf54352018-11-08 14:16:08 +090093 * 404 NOT_FOUND if openstack vtap network is not exists
Jimo Jung14e87bf2018-09-03 16:28:13 +090094 * @onos.rsModel OpenstackVtapNetwork
95 */
96 @PUT
97 @Consumes(MediaType.APPLICATION_JSON)
98 public Response updateNetwork(InputStream input) {
99 log.info(MESSAGE_NETWORK, UPDATE);
100
101 OpenstackVtapNetwork vtapNetwork = readNetworkConfiguration(input);
102 if (vtapNetwork == null) {
103 return Response.status(Response.Status.BAD_REQUEST).build();
104 }
105
Jimo Jung1bf54352018-11-08 14:16:08 +0900106 if (vtapService.updateVtapNetwork(vtapNetwork) == null) {
Jimo Jung14e87bf2018-09-03 16:28:13 +0900107 log.warn(ERROR_NOTFOUND, vtapNetwork);
108 return Response.status(Response.Status.NOT_FOUND).build();
109 }
110 return Response.ok().build();
111 }
112
113 /**
Jimo Jung1bf54352018-11-08 14:16:08 +0900114 * Removes openstack network.
115 *
116 * @return 200 OK on removing success
117 * 404 NOT_FOUND if openstack vtap network is not exists
118 * @onos.rsModel OpenstackVtapNetwork
119 */
120 @DELETE
121 @Consumes(MediaType.APPLICATION_JSON)
122 public Response deleteNetwork() {
123 log.info(MESSAGE_NETWORK, DELETE);
124
125 if (vtapService.removeVtapNetwork() == null) {
126 return Response.status(Response.Status.NOT_FOUND).build();
127 }
128
129 return Response.ok().build();
130 }
131
132 /**
Jimo Jung14e87bf2018-09-03 16:28:13 +0900133 * Get openstack vtap network.
134 *
135 * @return 200 OK with openstack vtap network
Jimo Jung1bf54352018-11-08 14:16:08 +0900136 * 404 NOT_FOUND if openstack vtap network is not exists
Jimo Jung14e87bf2018-09-03 16:28:13 +0900137 * @onos.rsModel OpenstackVtapNetwork
138 */
139 @GET
140 @Consumes(MediaType.APPLICATION_JSON)
141 @Produces(MediaType.APPLICATION_JSON)
142 public Response getNetwork() {
143 log.info(MESSAGE_NETWORK, READ);
144
Jimo Jung1bf54352018-11-08 14:16:08 +0900145 OpenstackVtapNetwork vtapNetwork = vtapService.getVtapNetwork();
Jimo Jung14e87bf2018-09-03 16:28:13 +0900146 if (vtapNetwork == null) {
147 return Response.status(Response.Status.NOT_FOUND).build();
148 }
149
150 JsonNode jsonNode = codec(OpenstackVtapNetwork.class).encode(vtapNetwork, this);
151 return Response.ok(jsonNode, MediaType.APPLICATION_JSON_TYPE).build();
152 }
153
Jimo Jung14e87bf2018-09-03 16:28:13 +0900154 private OpenstackVtapNetwork readNetworkConfiguration(InputStream input) {
155 try {
156 JsonNode jsonTree = readTreeFromStream(mapper().enable(INDENT_OUTPUT), input);
157 ObjectNode vtap = (ObjectNode) jsonTree.get(NETWORK);
158 return codec(OpenstackVtapNetwork.class).decode(vtap, this);
159 } catch (Exception e) {
160 log.error(e.toString());
161 return null;
162 }
163 }
164
165}