blob: 81f82eeb06da382bc4271bca9867c1609af075ad [file] [log] [blame]
Hyunsun Moonb6febbe2016-02-12 15:59:53 -08001/*
Brian O'Connor8e57fd52016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Hyunsun Moonb6febbe2016-02-12 15:59:53 -08003 *
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 */
alshabibb4d31712016-06-01 18:51:03 -070016package org.opencord.cordvtn.rest;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080017
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070018import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.node.ArrayNode;
20import com.fasterxml.jackson.databind.node.ObjectNode;
21import org.onlab.osgi.DefaultServiceDirectory;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080022import org.onosproject.rest.AbstractWebResource;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070023import org.opencord.cordvtn.api.CordVtnAdminService;
24import org.opencord.cordvtn.api.NetworkId;
25import org.openstack4j.core.transport.ObjectMapperSingleton;
26import org.openstack4j.model.network.Network;
27import org.openstack4j.openstack.networking.domain.NeutronNetwork;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080028import org.slf4j.Logger;
29import org.slf4j.LoggerFactory;
30
31import javax.ws.rs.Consumes;
32import javax.ws.rs.DELETE;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070033import javax.ws.rs.GET;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080034import javax.ws.rs.POST;
35import javax.ws.rs.PUT;
36import javax.ws.rs.Path;
37import javax.ws.rs.PathParam;
38import javax.ws.rs.Produces;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070039import javax.ws.rs.core.Context;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080040import javax.ws.rs.core.MediaType;
41import javax.ws.rs.core.Response;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070042import javax.ws.rs.core.UriBuilder;
43import javax.ws.rs.core.UriInfo;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080044import java.io.InputStream;
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070045import java.util.Set;
46
47import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
48import static javax.ws.rs.core.Response.*;
49import static javax.ws.rs.core.Response.Status.NOT_FOUND;
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080050
51/**
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070052 * Neutron ML2 mechanism driver implementation for the network resource.
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080053 */
54@Path("networks")
55public class NeutronMl2NetworksWebResource extends AbstractWebResource {
56 protected final Logger log = LoggerFactory.getLogger(getClass());
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080057
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070058 private static final String MESSAGE = "Received networks %s request";
59 private static final String NETWORK = "network";
60 private static final String NETWORKS = "networks";
61
62 private final CordVtnAdminService adminService =
63 DefaultServiceDirectory.getService(CordVtnAdminService.class);
64
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
74 */
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080075 @POST
76 @Consumes(MediaType.APPLICATION_JSON)
77 @Produces(MediaType.APPLICATION_JSON)
78 public Response createNetwork(InputStream input) {
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070079 log.trace(String.format(MESSAGE, "CREATE"));
80
81 final NeutronNetwork net = readNetwork(input);
82 adminService.createNetwork(net);
83
84 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
85 .path(NETWORKS)
86 .path(net.getId());
87
88 return created(locationBuilder.build()).build();
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080089 }
90
Hyunsun Mooneaf75e62016-09-27 16:40:23 -070091 /**
92 * Updates the network with the specified identifier.
93 *
94 * @param id network identifier
95 * @param input network JSON input stream
96 * @return 200 OK with the updated network, 400 BAD_REQUEST if the requested
97 * network does not exist
98 */
Hyunsun Moonb6febbe2016-02-12 15:59:53 -080099 @PUT
100 @Path("{id}")
101 @Consumes(MediaType.APPLICATION_JSON)
102 @Produces(MediaType.APPLICATION_JSON)
103 public Response updateNetwork(@PathParam("id") String id, InputStream input) {
Hyunsun Mooneaf75e62016-09-27 16:40:23 -0700104 log.trace(String.format(MESSAGE, "UPDATE " + id));
105
106 final NeutronNetwork net = readNetwork(input);
107 adminService.updateNetwork(net);
108
109 ObjectNode result = this.mapper().createObjectNode();
110 return ok(result.set(NETWORK, writeNetwork(net))).build();
Hyunsun Moonb6febbe2016-02-12 15:59:53 -0800111 }
112
Hyunsun Mooneaf75e62016-09-27 16:40:23 -0700113 /**
114 * Returns all networks.
115 *
116 * @return 200 OK with set of networks
117 */
118 @GET
119 @Consumes(MediaType.APPLICATION_JSON)
120 @Produces(MediaType.APPLICATION_JSON)
121 public Response getNetworks() {
122 log.trace(String.format(MESSAGE, "GET"));
123
124 Set<Network> nets = adminService.getNetworks();
125 ArrayNode arrayNodes = mapper().createArrayNode();
126 nets.stream().forEach(net -> {
127 arrayNodes.add(writeNetwork(net));
128 });
129
130 ObjectNode result = this.mapper().createObjectNode();
131 return ok(result.set(NETWORKS, arrayNodes)).build();
132 }
133
134 /**
135 * Returns the network with the given network id.
136 *
137 * @param id network id
138 * @return 200 OK with the network, 404 NOT_FOUND if the network does not exist
139 */
140 @GET
141 @Path("{id}")
142 @Consumes(MediaType.APPLICATION_JSON)
143 @Produces(MediaType.APPLICATION_JSON)
144 public Response getNetwork(@PathParam("id") String id) {
145 log.trace(String.format(MESSAGE, "GET " + id));
146
147 Network net = adminService.getNetwork(NetworkId.of(id));
148 if (net == null) {
149 return status(NOT_FOUND).build();
150 }
151
152 ObjectNode result = mapper().createObjectNode();
153 return ok(result.set(NETWORK, writeNetwork(net))).build();
154 }
155
156 /**
157 * Removes the service network.
158 *
159 * @param id network identifier
160 * @return 204 NO_CONTENT, 400 BAD_REQUEST if the network does not exist
161 */
Hyunsun Moonb6febbe2016-02-12 15:59:53 -0800162 @DELETE
163 @Path("{id}")
Hyunsun Mooneaf75e62016-09-27 16:40:23 -0700164 @Consumes(MediaType.APPLICATION_JSON)
165 @Produces(MediaType.APPLICATION_JSON)
Hyunsun Moonb6febbe2016-02-12 15:59:53 -0800166 public Response deleteNetwork(@PathParam("id") String id) {
Hyunsun Mooneaf75e62016-09-27 16:40:23 -0700167 log.trace(String.format(MESSAGE, "DELETE " + id));
168
169 adminService.removeNetwork(NetworkId.of(id));
170 return noContent().build();
171 }
172
173 private NeutronNetwork readNetwork(InputStream input) {
174 try {
175 JsonNode jsonTree = mapper().enable(INDENT_OUTPUT).readTree(input);
176 log.trace(mapper().writeValueAsString(jsonTree));
177 return ObjectMapperSingleton.getContext(NeutronNetwork.class)
178 .readerFor(NeutronNetwork.class)
179 .readValue(jsonTree);
180 } catch (Exception e) {
181 throw new IllegalArgumentException();
182 }
183 }
184
185 private ObjectNode writeNetwork(Network net) {
186 try {
187 String strNet = ObjectMapperSingleton.getContext(NeutronNetwork.class)
188 .writerFor(NeutronNetwork.class)
189 .writeValueAsString(net);
190 log.trace(strNet);
191 return (ObjectNode) mapper().readTree(strNet.getBytes());
192 } catch (Exception e) {
193 throw new IllegalStateException();
194 }
Hyunsun Moonb6febbe2016-02-12 15:59:53 -0800195 }
196}