blob: 9d1fb90a0fecde0b227b78f80d36f224eae6bbe7 [file] [log] [blame]
Jonghwan Hyun13a430d2018-07-22 17:02:51 +09001/*
2 * Copyright 2015-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.inbandtelemetry.app.ui;
17
18import com.fasterxml.jackson.databind.JsonNode;
19import com.google.common.collect.ImmutableSet;
20import com.fasterxml.jackson.databind.node.ObjectNode;
21import org.onlab.packet.Ip4Address;
22import org.onlab.packet.Ip4Prefix;
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090023import org.onlab.packet.TpPort;
24import org.onosproject.inbandtelemetry.api.IntIntent;
25import org.onosproject.inbandtelemetry.api.IntIntentId;
Carmelo Casconedefc74e2020-07-17 15:27:02 -070026import org.onosproject.net.behaviour.inbandtelemetry.IntMetadataType;
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090027import org.onosproject.inbandtelemetry.api.IntService;
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090028import org.onosproject.net.flow.DefaultTrafficSelector;
29import org.onosproject.net.flow.TrafficSelector;
30import org.onosproject.ui.RequestHandler;
31import org.onosproject.ui.UiMessageHandler;
32import org.slf4j.Logger;
33import org.slf4j.LoggerFactory;
34
35import java.util.Collection;
36
Davide Scanob5ade982020-06-03 21:47:13 +020037import static org.onosproject.inbandtelemetry.api.IntIntent.IntHeaderType.HOP_BY_HOP;
38
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090039public class IntAppUiMessageHandler extends UiMessageHandler {
40
41 private static final String INT_INTENT_ADD_REQUEST = "intIntentAddRequest";
42 private static final String INT_INTENT_DEL_REQUEST = "intIntentDelRequest";
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090043
44 private final Logger log = LoggerFactory.getLogger(getClass());
45
46 private IntService intService;
47
48 @Override
49 protected Collection<RequestHandler> createRequestHandlers() {
50 return ImmutableSet.of(
51 new IntIntentAddRequestHandler(),
Yi Tseng0f1ffd12020-09-18 11:10:47 -070052 new IntIntentDelRequestHandler()
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090053 );
54 }
55
Jonghwan Hyun13a430d2018-07-22 17:02:51 +090056 private final class IntIntentDelRequestHandler extends RequestHandler {
57 private IntIntentDelRequestHandler() {
58 super(INT_INTENT_DEL_REQUEST);
59 }
60
61 @Override
62 public void process(ObjectNode payload) {
63 log.info("intIntentDelRequest: {}", payload);
64
65 intService = get(IntService.class);
66
67 if (payload.get("intentId") != null) {
68 intService.removeIntIntent(IntIntentId.valueOf(payload.get("intentId").asLong()));
69 }
70 }
71 }
72
73 private final class IntIntentAddRequestHandler extends RequestHandler {
74 private IntIntentAddRequestHandler() {
75 super(INT_INTENT_ADD_REQUEST);
76 }
77
78 @Override
79 public void process(ObjectNode payload) {
80 log.info("intIntentAddRequest: {}", payload);
81
82 intService = get(IntService.class);
83
84 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
85 IntIntent.Builder builder = IntIntent.builder();
86
87 if (payload.get("ip4SrcPrefix") != null) {
88 sBuilder.matchIPSrc(parseIp4Prefix(payload.get("ip4SrcPrefix").asText()));
89 }
90
91 if (payload.get("ip4DstPrefix") != null) {
92 sBuilder.matchIPDst(parseIp4Prefix(payload.get("ip4DstPrefix").asText()));
93 }
94
95 if (payload.get("l4SrcPort") != null) {
96 if (payload.get("protocol") != null && payload.get("protocol").asText().equalsIgnoreCase("TCP")) {
97 sBuilder.matchTcpSrc(TpPort.tpPort(payload.get("l4SrcPort").asInt()));
98 } else {
99 sBuilder.matchUdpSrc(TpPort.tpPort(payload.get("l4SrcPort").asInt()));
100 }
101 }
102
103 if (payload.get("l4DstPort") != null) {
104 if (payload.get("protocol") != null && payload.get("protocol").asText().equalsIgnoreCase("TCP")) {
105 sBuilder.matchTcpDst(TpPort.tpPort(payload.get("l4DstPort").asInt()));
106 } else {
107 sBuilder.matchUdpDst(TpPort.tpPort(payload.get("l4DstPort").asInt()));
108 }
109 }
110
111 if (payload.get("metadata") != null) {
112 JsonNode meta = payload.get("metadata");
113 if (meta.isArray()) {
114 for (final JsonNode json : meta) {
115 switch (json.asText()) {
116 case "SWITCH_ID":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700117 builder.withMetadataType(IntMetadataType.SWITCH_ID);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900118 break;
119 case "PORT_ID":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700120 builder.withMetadataType(IntMetadataType.L1_PORT_ID);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900121 break;
122 case "HOP_LATENCY":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700123 builder.withMetadataType(IntMetadataType.HOP_LATENCY);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900124 break;
125 case "QUEUE_OCCUPANCY":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700126 builder.withMetadataType(IntMetadataType.QUEUE_OCCUPANCY);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900127 break;
128 case "INGRESS_TIMESTAMP":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700129 builder.withMetadataType(IntMetadataType.INGRESS_TIMESTAMP);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900130 break;
131 case "EGRESS_TIMESTAMP":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700132 builder.withMetadataType(IntMetadataType.EGRESS_TIMESTAMP);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900133 break;
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900134 case "EGRESS_TX_UTIL":
Carmelo Casconedefc74e2020-07-17 15:27:02 -0700135 builder.withMetadataType(IntMetadataType.EGRESS_TX_UTIL);
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900136 break;
137 default:
138 break;
139 }
140 }
141 }
142 }
143
144 builder.withSelector(sBuilder.build())
Davide Scanob5ade982020-06-03 21:47:13 +0200145 .withHeaderType(HOP_BY_HOP)
Jonghwan Hyun13a430d2018-07-22 17:02:51 +0900146 .withReportType(IntIntent.IntReportType.TRACKED_FLOW)
147 .withTelemetryMode(IntIntent.TelemetryMode.INBAND_TELEMETRY);
148 intService.installIntIntent(builder.build());
149 }
150
151 private Ip4Prefix parseIp4Prefix(String prefixString) {
152 if (prefixString == null) {
153 return null;
154 }
155 String[] splitString = prefixString.split("/");
156 Ip4Address ip4Address = Ip4Address.valueOf(splitString[0]);
157 int mask = splitString.length > 1 ? Integer.parseInt(splitString[1]) : 32;
158 return Ip4Prefix.valueOf(ip4Address, mask);
159 }
160 }
161}