blob: 3900bbd09ecae525e3545fa68d03090780c047ea [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;
20import org.onosproject.openstackvtap.api.OpenstackVtapAdminService;
21import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
22import 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
58 private final OpenstackVtapAdminService vtapAdminService = get(OpenstackVtapAdminService.class);
59
60 /**
61 * Creates a openstack vtap network from the JSON input stream.
62 *
63 * @param input openstack vtap network JSON input stream
64 * @return 200 OK if the JSON is correct
65 * 400 BAD_REQUEST if the JSON is malformed
66 * 409 CONFLICT if already the vtap network exists
67 * @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
79 if (vtapAdminService.createVtapNetwork(vtapNetwork.mode(),
80 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
91 * @return 200 OK if the JSON is correct
92 * 400 BAD_REQUEST if the JSON is malformed
93 * 404 NOT_FOUND if vtap network is not exists
94 * @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
106 if (vtapAdminService.updateVtapNetwork(vtapNetwork) == null) {
107 log.warn(ERROR_NOTFOUND, vtapNetwork);
108 return Response.status(Response.Status.NOT_FOUND).build();
109 }
110 return Response.ok().build();
111 }
112
113 /**
114 * Get openstack vtap network.
115 *
116 * @return 200 OK with openstack vtap network
117 * 404 NOT_FOUND if openstackvtap network is not exists
118 * @onos.rsModel OpenstackVtapNetwork
119 */
120 @GET
121 @Consumes(MediaType.APPLICATION_JSON)
122 @Produces(MediaType.APPLICATION_JSON)
123 public Response getNetwork() {
124 log.info(MESSAGE_NETWORK, READ);
125
126 OpenstackVtapNetwork vtapNetwork = vtapAdminService.getVtapNetwork();
127 if (vtapNetwork == null) {
128 return Response.status(Response.Status.NOT_FOUND).build();
129 }
130
131 JsonNode jsonNode = codec(OpenstackVtapNetwork.class).encode(vtapNetwork, this);
132 return Response.ok(jsonNode, MediaType.APPLICATION_JSON_TYPE).build();
133 }
134
135 /**
136 * Removes openstack network.
137 *
138 * @return 200 OK on removing success
139 * 404 NOT_FOUND if openstackvtap network is not exists
140 * @onos.rsModel OpenstackVtapNetwork
141 */
142 @DELETE
143 @Consumes(MediaType.APPLICATION_JSON)
144 public Response deleteNetwork() {
145 log.info(MESSAGE_NETWORK, DELETE);
146
147 if (vtapAdminService.removeVtapNetwork() == null) {
148 return Response.status(Response.Status.NOT_FOUND).build();
149 }
150
151 return Response.ok().build();
152 }
153
154 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}