blob: ef8f7075732c4f6f5462518effcb6835c2ceed82 [file] [log] [blame]
Daniel Park2ba66e22022-04-27 12:33:45 +09001/*
2 * Copyright 2022-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.kubevirtnetworking.web;
17
18import com.fasterxml.jackson.databind.node.ObjectNode;
19import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
20import org.onosproject.kubevirtnetworking.api.KubevirtInstance;
21import org.onosproject.kubevirtnetworking.api.KubevirtInstanceService;
22import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
23import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerService;
24import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
25import org.onosproject.kubevirtnetworking.api.KubevirtNetworkService;
26import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
27import org.onosproject.kubevirtnetworking.api.KubevirtRouterService;
28import org.onosproject.kubevirtnode.api.KubevirtNode;
29import org.onosproject.kubevirtnode.api.KubevirtNodeService;
30import org.onosproject.rest.AbstractWebResource;
31import org.slf4j.Logger;
32import org.slf4j.LoggerFactory;
33
34import javax.ws.rs.Consumes;
35import javax.ws.rs.DELETE;
36import javax.ws.rs.GET;
37import javax.ws.rs.POST;
38import javax.ws.rs.PUT;
39import javax.ws.rs.Path;
40import javax.ws.rs.PathParam;
41import javax.ws.rs.Produces;
42import javax.ws.rs.core.Context;
43import javax.ws.rs.core.MediaType;
44import javax.ws.rs.core.Response;
45import javax.ws.rs.core.UriInfo;
46import java.io.InputStream;
47
48/**
49 * Handles REST API for communication with MEC Orchestrator.
50 */
51@Path("api/mm5/v1")
52public class KubevirtMm5WebResource extends AbstractWebResource {
53 protected final Logger log = LoggerFactory.getLogger(getClass());
54
55 private static final String RECEIVED_REQUEST = "Received %s request";
56 private static final String QUERY_STATUS_LEG = "LEG status query";
57 private static final String QUERY_STATUS_VR = "VR status query";
58
59 private static final String QUERY_GET_NETWORK = "get network query";
60 private static final String QUERY_CREATE_NETWORK = "create network query";
61 private static final String QUERY_UPDATE_NETWORK = "update network query";
62 private static final String QUERY_DELETE_NETWORK = "delete network query";
63
64 private static final String QUERY_GET_VR = "get virtual router query";
65 private static final String QUERY_CREATE_VR = "create virtual router query";
66 private static final String QUERY_UPDATE_VR = "update virtual router query";
67 private static final String QUERY_DELETE_VR = "delete virtual router query";
68
69 private static final String QUERY_GET_FIP = "get floating ip query";
70 private static final String QUERY_CREATE_FIP = "create floating ip query";
71 private static final String QUERY_UPDATE_FIP = "update floating ip query";
72 private static final String QUERY_DELETE_FIP = "delete floating ip query";
73
74 private static final String QUERY_GET_LB = "get LoadBalancer query";
75 private static final String QUERY_CREATE_LB = "create LoadBalancer query";
76 private static final String QUERY_UPDATE_LB = "update LoadBalancer query";
77 private static final String QUERY_DELETE_LB = "delete LoadBalancer query";
78
79 private static final String QUERY_GET_INSTANCE = "get instance query";
80 private static final String QUERY_CREATE_INSTANCE = "create instance query";
81 private static final String QUERY_UPDATE_INSTANCE = "update floating ip query";
82 private static final String QUERY_DELETE_INSTANCE = "delete floating ip query";
83
84 private static final String NODE_NAME = "nodeName";
85 private static final String STATE = "state";
86 private static final String ACTIVE = "ACTIVE";
87 private static final String INACTIVE = "INACTIVE";
88
89 private static final String NETWORKS = "networks";
90 private static final String INSTANCES = "instances";
91 private static final String VIRTUAL_ROUTERS = "virtualRouters";
92 private static final String LOAD_BALANCERS = "loadBalancers";
93 private static final String FLOATING_IPS = "floatingIps";
94
95 private static final String UP = "up";
96 private static final String DOWN = "down";
97 private static final String NONE = "none";
98
99 private static final String VR_NAME = "vrName";
100
101 @Context
102 private UriInfo uriInfo;
103
104 /**
105 * Obtains the status of the virtual router.
106 *
107 * @param vrName virtual router name
108 * @return the state of the virtual router in Json
109 */
110 @GET
111 @Path("status/vr/{vrName}")
112 @Consumes(MediaType.APPLICATION_JSON)
113 @Produces(MediaType.APPLICATION_JSON)
114 public Response vrStatus(@PathParam(VR_NAME) String vrName) {
115 log.trace(String.format(RECEIVED_REQUEST, QUERY_STATUS_VR));
116
117 KubevirtRouterService service = get(KubevirtRouterService.class);
118
119 KubevirtRouter router = service.routers().stream()
120 .filter(r -> r.name().equals(vrName))
121 .findAny().orElse(null);
122
123 if (router == null) {
124 return Response.status(Response.Status.NOT_FOUND).build();
125 } else {
126 ObjectNode jsonResult = mapper().createObjectNode();
127
128 jsonResult.put(VR_NAME, router.name());
129
130 if (router.electedGateway() == null) {
131 jsonResult.put("merName", NONE);
132 jsonResult.put("status", DOWN);
133 } else {
134 jsonResult.put("merName", router.electedGateway());
135 jsonResult.put("status", UP);
136 }
137
138 jsonResult.put("timeUpdated", System.currentTimeMillis());
139 return ok(jsonResult).build();
140 }
141 }
142
143 /**
144 * Obtains the state of the leg node.
145 *
146 * @param nodeName leg host name
147 * @return the state of the leg node in Json
148 */
149 @PUT
150 @Path("state/mer/{nodeName}")
151 @Produces(MediaType.APPLICATION_JSON)
152 public Response legStatus(@PathParam("nodeName") String nodeName) {
153 log.trace(String.format(RECEIVED_REQUEST, QUERY_STATUS_LEG));
154
155 KubevirtNodeService service = get(KubevirtNodeService.class);
156
157 ObjectNode jsonResult = mapper().createObjectNode();
158 jsonResult.put(NODE_NAME, nodeName);
159
160 boolean isActive = service.completeNodes().stream()
161 .anyMatch(node -> node.type().equals(KubevirtNode.Type.GATEWAY) &&
162 node.hostname().equals(nodeName));
163 if (isActive) {
164 jsonResult.put(STATE, ACTIVE);
165 } else {
166 jsonResult.put(STATE, INACTIVE);
167 }
168 return ok(jsonResult).build();
169 }
170
171 /**
172 * Obtains the network information in Json Array.
173 *
174 * @return network information in Json
175 */
176 @GET
177 @Path("network")
178 @Produces(MediaType.APPLICATION_JSON)
179 public Response getNetwork() {
180 log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_NETWORK));
181
182 KubevirtNetworkService service = get(KubevirtNetworkService.class);
183 final Iterable<KubevirtNetwork> networks = service.networks();
184 return ok(encodeArray(KubevirtNetwork.class, NETWORKS, networks)).build();
185 }
186
187 /**
188 * Creates the kubevirt network with specified input stream.
189 *
190 * @param inputStream network Json input stream
191 * @return 200 OK if succeeded
192 */
193 @POST
194 @Path("network")
195 @Consumes(MediaType.APPLICATION_JSON)
196 @Produces(MediaType.APPLICATION_JSON)
197 public Response createNetwork(InputStream inputStream) {
198 log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_NETWORK));
199 //Just sends 200 OK for now.
200 return ok(mapper().createObjectNode()).build();
201 }
202
203 /**
204 * Updates the kubevirt network with the specified input stream.
205 *
206 * @param inputStream network Json input stream
207 * @return 200 OK if succeeded
208 */
209 @PUT
210 @Path("network/{networkName}")
211 @Consumes(MediaType.APPLICATION_JSON)
212 @Produces(MediaType.APPLICATION_JSON)
213 public Response updateNetwork(InputStream inputStream) {
214 log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_NETWORK));
215 //Just sends 200 OK for now.
216 return ok(mapper().createObjectNode()).build();
217 }
218
219 /**
220 * Deletes the kubevirt network with the specified input stream.
221 *
222 * @param inputStream network Json input stream
223 * @return 200 OK if succeeded
224 */
225 @DELETE
226 @Path("network/{networkName}")
227 @Produces(MediaType.APPLICATION_JSON)
228 public Response deleteNetwork(InputStream inputStream) {
229 log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_NETWORK));
230 //Just sends 200 OK for now.
231 return ok(mapper().createObjectNode()).build();
232 }
233
234 /**
235 * Obtains the instance information in Json Array.
236 *
237 * @return instance information in Json
238 */
239 @GET
240 @Path("instance")
241 @Produces(MediaType.APPLICATION_JSON)
242 public Response getInstance() {
243 log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_INSTANCE));
244
245 KubevirtInstanceService service = get(KubevirtInstanceService.class);
246 final Iterable<KubevirtInstance> instances = service.instances();
247 return ok(encodeArray(KubevirtInstance.class, INSTANCES, instances)).build();
248 }
249
250 /**
251 * Creates the instance with specified input stream.
252 *
253 * @param inputStream instance Json insput stream
254 * @return 200 OK if succeeded
255 */
256 @POST
257 @Path("instance")
258 @Consumes(MediaType.APPLICATION_JSON)
259 @Produces(MediaType.APPLICATION_JSON)
260 public Response createInstance(InputStream inputStream) {
261 log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_INSTANCE));
262 //Just sends 200 OK for now.
263 return ok(mapper().createObjectNode()).build();
264 }
265
266 /**
267 * Updates the instance with specified input stream.
268 *
269 * @param inputStream instance Json insput stream
270 * @return 200 OK if succeeded
271 */
272 @PUT
273 @Path("instance/{instanceName}")
274 @Consumes(MediaType.APPLICATION_JSON)
275 @Produces(MediaType.APPLICATION_JSON)
276 public Response updateInstance(InputStream inputStream) {
277 log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_INSTANCE));
278 //Just sends 200 OK for now.
279 return ok(mapper().createObjectNode()).build();
280 }
281
282 /**
283 * Deletes the instance with specified input stream.
284 *
285 * @param inputStream inputStream instance Json insput stream
286 * @return 200 OK if succeeded
287 */
288 @DELETE
289 @Path("instance/{instanceName}")
290 @Produces(MediaType.APPLICATION_JSON)
291 public Response deleteInstance(InputStream inputStream) {
292 log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_INSTANCE));
293 //Just sends 200 OK for now.
294 return ok(mapper().createObjectNode()).build();
295 }
296
297 /**
298 * Obtains the virtual router in Json array.
299 *
300 * @return virtual router information in Json
301 */
302 @GET
303 @Path("vr")
304 @Produces(MediaType.APPLICATION_JSON)
305 public Response getVirtualRouter() {
306 log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_VR));
307
308 KubevirtRouterService service = get(KubevirtRouterService.class);
309 final Iterable<KubevirtRouter> routers = service.routers();
310 return ok(encodeArray(KubevirtRouter.class, VIRTUAL_ROUTERS, routers)).build();
311 }
312
313 /**
314 * Creates the virtual router with specified input stream.
315 *
316 * @param inputStream virtual router Json inputstream
317 * @return 200 OK if succeeded
318 */
319 @POST
320 @Path("vr")
321 @Consumes(MediaType.APPLICATION_JSON)
322 @Produces(MediaType.APPLICATION_JSON)
323 public Response createVirtualRouter(InputStream inputStream) {
324 log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_VR));
325 //Just sends 200 OK for now.
326 return ok(mapper().createObjectNode()).build();
327 }
328
329 /**
330 * Updates the virtual router with specified input stream.
331 *
332 * @param inputStream virtual router Json inputstream
333 * @return 200 OK if succeeded
334 */
335 @PUT
336 @Path("vr/{vrName}")
337 @Consumes(MediaType.APPLICATION_JSON)
338 @Produces(MediaType.APPLICATION_JSON)
339 public Response updateVirtualRouter(InputStream inputStream) {
340 log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_VR));
341 //Just sends 200 OK for now.
342 return ok(mapper().createObjectNode()).build();
343 }
344
345 /**
346 * Deletes the virtual router with specified input stream.
347 *
348 * @param inputStream virtual router Json inputstream
349 * @return 200 OK if succeeded
350 */
351 @DELETE
352 @Path("vr/{vrName}")
353 @Produces(MediaType.APPLICATION_JSON)
354 public Response deleteVirtualRouter(InputStream inputStream) {
355 log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_VR));
356 //Just sends 200 OK for now.
357 return ok(mapper().createObjectNode()).build();
358 }
359
360 /**
361 * Obtains the floating ip in Json array.
362 *
363 * @return floating ip information in Json
364 */
365 @GET
366 @Path("fip")
367 @Produces(MediaType.APPLICATION_JSON)
368 public Response getFloatingIp() {
369 log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_FIP));
370
371 KubevirtRouterService service = get(KubevirtRouterService.class);
372 final Iterable<KubevirtFloatingIp> fips = service.floatingIps();
373 return ok(encodeArray(KubevirtFloatingIp.class, FLOATING_IPS, fips)).build();
374 }
375
376 /**
377 * Creates the floating ip with specified input stream.
378 *
379 * @param inputStream floating ip Json inputstream
380 * @return 200 OK if succeeded
381 */
382 @POST
383 @Path("fip")
384 @Consumes(MediaType.APPLICATION_JSON)
385 @Produces(MediaType.APPLICATION_JSON)
386 public Response createFloatingIp(InputStream inputStream) {
387 log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_FIP));
388 //Just sends 200 OK for now.
389 return ok(mapper().createObjectNode()).build();
390 }
391
392 /**
393 * Updates the floating ip with specified input stream.
394 *
395 * @param inputStream floating ip Json inputstream
396 * @return 200 OK if succeeded
397 */
398 @PUT
399 @Path("fip/{fipName}")
400 @Consumes(MediaType.APPLICATION_JSON)
401 @Produces(MediaType.APPLICATION_JSON)
402 public Response updateFloatingIp(InputStream inputStream) {
403 log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_FIP));
404 //Just sends 200 OK for now.
405 return ok(mapper().createObjectNode()).build();
406 }
407
408 /**
409 * Deletes the floating ip with specified input stream.
410 *
411 * @param inputStream floating ip Json inputstream
412 * @return 200 OK if succeeded
413 */
414 @DELETE
415 @Path("fip/{fipName}")
416 @Produces(MediaType.APPLICATION_JSON)
417 public Response deleteFloatingIp(InputStream inputStream) {
418 log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_FIP));
419 //Just sends 200 OK for now.
420 return ok(mapper().createObjectNode()).build();
421 }
422
423 /**
424 * Obtains the loadbalaner in Json array.
425 *
426 * @return loadbalancer information in Json
427 */
428 @GET
429 @Path("lb")
430 @Produces(MediaType.APPLICATION_JSON)
431 public Response getLoadBalancer() {
432 log.trace(String.format(RECEIVED_REQUEST, QUERY_GET_LB));
433
434 KubevirtLoadBalancerService service = get(KubevirtLoadBalancerService.class);
435 final Iterable<KubevirtLoadBalancer> lbs = service.loadBalancers();
436 return ok(encodeArray(KubevirtLoadBalancer.class, LOAD_BALANCERS, lbs)).build();
437 }
438
439 /**
440 * Creates the loadbalander with specified input stream.
441 *
442 * @param inputStream loadbalancer Json inputstream
443 * @return 200 OK if succeeded
444 */
445 @POST
446 @Path("lb")
447 @Consumes(MediaType.APPLICATION_JSON)
448 @Produces(MediaType.APPLICATION_JSON)
449 public Response createLoadBalancer(InputStream inputStream) {
450 log.trace(String.format(RECEIVED_REQUEST, QUERY_CREATE_LB));
451 //Just sends 200 OK for now.
452 return ok(mapper().createObjectNode()).build();
453 }
454
455 /**
456 * Updates the loadbalander with specified input stream.
457 *
458 * @param inputStream loadbalancer Json inputstream
459 * @return 200 OK if succeeded
460 */
461 @PUT
462 @Path("lb/{lbName}")
463 @Consumes(MediaType.APPLICATION_JSON)
464 @Produces(MediaType.APPLICATION_JSON)
465 public Response updateLoadBalancer(InputStream inputStream) {
466 log.trace(String.format(RECEIVED_REQUEST, QUERY_UPDATE_LB));
467 //Just sends 200 OK for now.
468 return ok(mapper().createObjectNode()).build();
469 }
470
471 /**
472 * Deletes the loadbalander with specified input stream.
473 *
474 * @param inputStream loadbalancer Json inputstream
475 * @return 200 OK if succeeded
476 */
477 @DELETE
478 @Path("lb/{lbName}")
479 @Produces(MediaType.APPLICATION_JSON)
480 public Response deleteLoadBalancer(InputStream inputStream) {
481 log.trace(String.format(RECEIVED_REQUEST, QUERY_DELETE_LB));
482 //Just sends 200 OK for now.
483 return ok(mapper().createObjectNode()).build();
484 }
485}