blob: 34f8366032a714e07a04071179a681e68852df84 [file] [log] [blame]
Jian Li6e4da2f2018-05-21 18:11:31 +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.openstacktelemetry.web;
17
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090018import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.node.ArrayNode;
Jian Li6e4da2f2018-05-21 18:11:31 +090020import com.fasterxml.jackson.databind.node.ObjectNode;
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090021import com.google.common.collect.Sets;
22import org.apache.commons.lang3.exception.ExceptionUtils;
23import org.onosproject.codec.JsonCodec;
24import org.onosproject.openstacktelemetry.api.FlowInfo;
25import org.onosproject.openstacktelemetry.api.StatsFlowRule;
26import org.onosproject.openstacktelemetry.api.StatsFlowRuleAdminService;
27import org.onosproject.openstacktelemetry.codec.FlowInfoJsonCodec;
Jian Li6e4da2f2018-05-21 18:11:31 +090028import org.onosproject.rest.AbstractWebResource;
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090029import org.slf4j.Logger;
30import org.slf4j.LoggerFactory;
Jian Li6e4da2f2018-05-21 18:11:31 +090031
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090032import javax.ws.rs.Consumes;
Jian Lia4947682018-07-07 14:53:32 +090033import javax.ws.rs.DELETE;
Jian Li6e4da2f2018-05-21 18:11:31 +090034import javax.ws.rs.GET;
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090035import javax.ws.rs.POST;
Jian Li6e4da2f2018-05-21 18:11:31 +090036import javax.ws.rs.Path;
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090037import javax.ws.rs.PathParam;
Jian Li6e4da2f2018-05-21 18:11:31 +090038import javax.ws.rs.Produces;
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090039import javax.ws.rs.core.Context;
Jian Li6e4da2f2018-05-21 18:11:31 +090040import javax.ws.rs.core.MediaType;
41import javax.ws.rs.core.Response;
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090042import javax.ws.rs.core.UriBuilder;
43import javax.ws.rs.core.UriInfo;
44import java.io.InputStream;
45import java.util.Set;
46
47import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
48import static javax.ws.rs.core.Response.created;
49import static org.onlab.util.Tools.readTreeFromStream;
Jian Li6e4da2f2018-05-21 18:11:31 +090050
51/**
52 * Handles REST API call of openstack telemetry.
53 */
54
55@Path("telemetry")
56public class OpenstackTelemetryWebResource extends AbstractWebResource {
57
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090058 private final Logger log = LoggerFactory.getLogger(getClass());
59
Jian Li6e4da2f2018-05-21 18:11:31 +090060 private final ObjectNode root = mapper().createObjectNode();
61
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090062 private static final String JSON_NODE_FLOW_RULE = "rules";
63 private static final String FLOW_RULE_ID = "STATS_FLOW_RULE_ID";
64
Jian Li0bbbb1c2018-06-22 22:01:17 +090065 private final StatsFlowRuleAdminService
66 statsFlowRuleService = get(StatsFlowRuleAdminService.class);
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090067
68 @Context
69 private UriInfo uriInfo;
70
71 /**
72 * Creates a flow rule for metric.
73 *
74 * @param input openstack flow rule JSON input stream
75 * @return 201 CREATED if the JSON is correct,
76 * 400 BAD_REQUEST if the JSON is malformed.
77 */
78 @POST
79 @Consumes(MediaType.APPLICATION_JSON)
80 @Produces(MediaType.APPLICATION_JSON)
81 public Response createBulkFlowRule(InputStream input) {
82 log.info("CREATE BULK FLOW RULE: {}", input.toString());
83
84 readNodeConfiguration(input).forEach(flowRule -> {
85 log.debug("FlowRule: {}", flowRule.toString());
Jian Li0bbbb1c2018-06-22 22:01:17 +090086 statsFlowRuleService.createStatFlowRule(flowRule);
Boyoung Jeong9e8faec2018-06-17 21:19:23 +090087 });
88
89 UriBuilder locationBuilder = uriInfo.getBaseUriBuilder()
90 .path(JSON_NODE_FLOW_RULE)
91 .path(FLOW_RULE_ID);
92
93 return created(locationBuilder.build()).build();
94 }
95
96 /**
97 * Delete flow rules.
98 *
99 * @param input openstack flow rule JSON input stream
100 * @return 200 OK if processing is correct.
101 */
Jian Lia4947682018-07-07 14:53:32 +0900102 @DELETE
103 @Consumes(MediaType.APPLICATION_JSON)
104 @Produces(MediaType.APPLICATION_JSON)
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900105 public Response deleteBulkFlowRule(InputStream input) {
106 log.info("DELETE BULK FLOW RULE: {}", input.toString());
107
108 readNodeConfiguration(input).forEach(flowRule -> {
109 log.debug("FlowRule: {}", flowRule.toString());
Jian Li0bbbb1c2018-06-22 22:01:17 +0900110 statsFlowRuleService.deleteStatFlowRule(flowRule);
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900111 });
112
113 return ok(root).build();
114 }
115
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900116 /**
117 * Get flow rules which is installed on ONOS.
118 *
119 * @return 200 OK
120 */
121 public Response readBulkFlowRule() {
122 log.info("READ BULK FLOW RULE");
123
124 return ok(root).build();
125 }
126
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900127 /**
128 * Get flow information list.
129 *
130 * @return Flow information list
131 */
132 @GET
133 @Path("list")
134 @Produces(MediaType.APPLICATION_JSON)
135 public Response getFlowInfoBulk() {
136 log.info("GET BULK FLOW RULE");
137
138 Set<FlowInfo> flowInfoSet;
Jian Lif8b8c7f2018-08-27 18:49:04 +0900139 flowInfoSet = statsFlowRuleService.getOverlayFlowInfos();
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900140
141 log.info("\n\n======================================================\n" +
142 "FlowInfo Set: \n{}" +
143 "\n\n======================================================\n",
144 flowInfoSet);
145
146 JsonCodec<FlowInfo> flowInfoCodec = new FlowInfoJsonCodec();
147
148 ObjectNode nodeJson;
149 int idx = 0;
150 for (FlowInfo flowInfo: flowInfoSet) {
151 nodeJson = flowInfoCodec.encode(flowInfo, this);
152 root.put("FlowInfo" + String.valueOf(idx++), nodeJson.toString());
153 }
154 return ok(root).build();
155 }
156
157 @GET
Jian Lia4947682018-07-07 14:53:32 +0900158 @Path("list/{srcIpPrefix}/{dstIpPrefix}")
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900159 @Produces(MediaType.APPLICATION_JSON)
Jian Lia4947682018-07-07 14:53:32 +0900160 public Response getFlowRule(@PathParam("srcIpPrefix") String srcIpPrefix,
161 @PathParam("dstIpPrefix") String dstIpPrefix) {
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900162 return ok(root).build();
163 }
164
Boyoung Jeong9e8faec2018-06-17 21:19:23 +0900165 private Set<StatsFlowRule> readNodeConfiguration(InputStream input) {
166 log.info("Input JSON Data: \n\t\t{}", input.toString());
167 Set<StatsFlowRule> flowRuleSet = Sets.newHashSet();
168 try {
169 JsonNode jsonTree = readTreeFromStream(mapper().enable(INDENT_OUTPUT), input);
170 ArrayNode nodes = (ArrayNode) jsonTree.path(JSON_NODE_FLOW_RULE);
171 nodes.forEach(node -> {
172 try {
173 ObjectNode objectNode = node.deepCopy();
174 log.debug("ObjectNode: {}", objectNode.toString());
175 StatsFlowRule statsFlowRule = codec(StatsFlowRule.class)
176 .decode(objectNode, this);
177 log.debug("StatsFlowRule: {}", statsFlowRule.toString());
178 flowRuleSet.add(statsFlowRule);
179 } catch (Exception ex) {
180 log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
181 throw new IllegalArgumentException();
182 }
183 });
184 } catch (Exception ex) {
185 log.error("Exception Stack:\n{}", ExceptionUtils.getStackTrace(ex));
186 throw new IllegalArgumentException(ex);
187 }
188
189 return flowRuleSet;
190 }
Jian Li6e4da2f2018-05-21 18:11:31 +0900191}