blob: 61417cd6e7a180859c744fe8bdf0bce133409e79 [file] [log] [blame]
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -07001/*
2 * Copyright 2015 Open Networking Laboratory
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 */
16
17package org.onosproject.ui.impl;
18
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070019import com.fasterxml.jackson.databind.node.ObjectNode;
Simon Huntabd16f62015-05-01 13:14:40 -070020import com.google.common.base.Strings;
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070021import com.google.common.collect.ImmutableSet;
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070022import org.onosproject.net.DeviceId;
23import org.onosproject.net.flow.FlowEntry;
24import org.onosproject.net.flow.FlowRuleService;
25import org.onosproject.net.flow.TrafficSelector;
26import org.onosproject.net.flow.TrafficTreatment;
27import org.onosproject.net.flow.criteria.Criterion;
28import org.onosproject.net.flow.instructions.Instruction;
Simon Huntd2747a02015-04-30 22:41:16 -070029import org.onosproject.ui.RequestHandler;
Simon Hunta0ddb022015-05-01 09:53:01 -070030import org.onosproject.ui.UiMessageHandler;
Simon Hunt3d1b0652015-05-05 17:27:24 -070031import org.onosproject.ui.table.TableModel;
Simon Huntabd16f62015-05-01 13:14:40 -070032import org.onosproject.ui.table.TableRequestHandler;
Simon Hunt3d1b0652015-05-05 17:27:24 -070033import org.onosproject.ui.table.cell.IntComparator;
34import org.onosproject.ui.table.cell.LongComparator;
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070035
Simon Huntd2747a02015-04-30 22:41:16 -070036import java.util.Collection;
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070037import java.util.List;
38import java.util.Set;
39
Simon Huntabd16f62015-05-01 13:14:40 -070040import static org.apache.commons.lang.WordUtils.capitalizeFully;
41
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070042
43/**
44 * Message handler for flow view related messages.
45 */
Simon Hunta0ddb022015-05-01 09:53:01 -070046public class FlowViewMessageHandler extends UiMessageHandler {
Simon Huntd2747a02015-04-30 22:41:16 -070047
48 private static final String FLOW_DATA_REQ = "flowDataRequest";
Simon Huntabd16f62015-05-01 13:14:40 -070049 private static final String FLOW_DATA_RESP = "flowDataResponse";
50 private static final String FLOWS = "flows";
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070051
Simon Huntabd16f62015-05-01 13:14:40 -070052 private static final String ID = "id";
53 private static final String APP_ID = "appId";
54 private static final String GROUP_ID = "groupId";
55 private static final String TABLE_ID = "tableId";
56 private static final String PRIORITY = "priority";
57 private static final String SELECTOR = "selector";
58 private static final String TREATMENT = "treatment";
59 private static final String TIMEOUT = "timeout";
60 private static final String PERMANENT = "permanent";
61 private static final String STATE = "state";
Bri Prebilic Cole641b97b2015-05-05 14:47:40 -070062 private static final String PACKETS = "packets";
63 private static final String BYTES = "bytes";
Simon Huntabd16f62015-05-01 13:14:40 -070064
65 private static final String COMMA = ", ";
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070066
Simon Hunt3d1b0652015-05-05 17:27:24 -070067 private static final String[] COL_IDS = {
68 ID, APP_ID, GROUP_ID, TABLE_ID, PRIORITY, SELECTOR,
69 TREATMENT, TIMEOUT, PERMANENT, STATE, PACKETS, BYTES
70 };
71
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070072 @Override
Simon Huntd2747a02015-04-30 22:41:16 -070073 protected Collection<RequestHandler> getHandlers() {
74 return ImmutableSet.of(new FlowDataRequest());
75 }
76
Simon Huntabd16f62015-05-01 13:14:40 -070077 // handler for flow table requests
78 private final class FlowDataRequest extends TableRequestHandler {
Simon Huntd2747a02015-04-30 22:41:16 -070079
80 private FlowDataRequest() {
Simon Huntabd16f62015-05-01 13:14:40 -070081 super(FLOW_DATA_REQ, FLOW_DATA_RESP, FLOWS);
Simon Huntd2747a02015-04-30 22:41:16 -070082 }
83
84 @Override
Simon Hunt3d1b0652015-05-05 17:27:24 -070085 protected String[] getColumnIds() {
86 return COL_IDS;
Simon Hunt44aa2f82015-04-30 15:01:35 -070087 }
Simon Hunt44aa2f82015-04-30 15:01:35 -070088
Simon Hunt3d1b0652015-05-05 17:27:24 -070089 @Override
90 protected TableModel createTableModel() {
91 TableModel tm = super.createTableModel();
92 tm.setComparator(GROUP_ID, IntComparator.INSTANCE);
93 tm.setComparator(TABLE_ID, IntComparator.INSTANCE);
94 tm.setComparator(PRIORITY, IntComparator.INSTANCE);
95 tm.setComparator(TIMEOUT, IntComparator.INSTANCE);
96 tm.setComparator(PACKETS, LongComparator.INSTANCE);
97 tm.setComparator(BYTES, LongComparator.INSTANCE);
98 return tm;
99 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700100
Simon Hunt3d1b0652015-05-05 17:27:24 -0700101 @Override
102 protected void populateTable(TableModel tm, ObjectNode payload) {
103 String uri = string(payload, "devId");
104 if (!Strings.isNullOrEmpty(uri)) {
105 DeviceId deviceId = DeviceId.deviceId(uri);
106 FlowRuleService frs = get(FlowRuleService.class);
107 for (FlowEntry flow : frs.getFlowEntries(deviceId)) {
108 populateRow(tm.addRow(), flow);
109 }
110 }
111 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700112
Simon Hunt3d1b0652015-05-05 17:27:24 -0700113 private void populateRow(TableModel.Row row, FlowEntry flow) {
114 row.cell(ID, flow.id().value())
115 .cell(APP_ID, flow.appId())
116 .cell(GROUP_ID, flow.groupId().id())
117 .cell(TABLE_ID, flow.tableId())
118 .cell(PRIORITY, flow.priority())
119 .cell(SELECTOR, getSelectorString(flow))
120 .cell(TREATMENT, getTreatmentString(flow))
121 .cell(TIMEOUT, flow.timeout())
122 .cell(PERMANENT, flow.isPermanent())
123 .cell(STATE, capitalizeFully(flow.state().toString()))
124 .cell(PACKETS, flow.packets())
125 .cell(BYTES, flow.bytes());
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700126 }
127
128 private String getSelectorString(FlowEntry f) {
129 String result;
130 TrafficSelector selector = f.selector();
131 Set<Criterion> criteria = selector.criteria();
132
133 if (criteria.isEmpty()) {
134 result = "(No traffic selectors for this flow)";
135 } else {
136 StringBuilder sb = new StringBuilder("Criteria = ");
137 for (Criterion c : criteria) {
Simon Huntabd16f62015-05-01 13:14:40 -0700138 sb.append(capitalizeFully(c.type().toString())).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700139 }
140 result = removeTrailingComma(sb).toString();
141 }
142 return result;
143 }
144
145 private String getTreatmentString(FlowEntry f) {
146 TrafficTreatment treatment = f.treatment();
147 List<Instruction> deferred = treatment.deferred();
148 List<Instruction> immediate = treatment.immediate();
149 boolean haveDef = !deferred.isEmpty();
150 boolean haveImm = !immediate.isEmpty();
151 boolean both = haveDef && haveImm;
152 boolean neither = !haveDef && !haveImm;
153 String result;
154
155 if (neither) {
156 result = "(No traffic treatment instructions for this flow)";
157 } else {
158 StringBuilder sb = new StringBuilder();
159 addDeferred(sb, deferred);
160 if (both) {
161 sb.append(COMMA);
162 }
163 addImmediate(sb, immediate);
164 result = sb.toString();
165 }
166 return result;
167 }
168
169 private void addDeferred(StringBuilder sb, List<Instruction> deferred) {
170 if (!deferred.isEmpty()) {
171 sb.append("Deferred instructions = ");
172 for (Instruction i : deferred) {
Simon Huntabd16f62015-05-01 13:14:40 -0700173 sb.append(capitalizeFully(i.type().toString())).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700174 }
175 removeTrailingComma(sb);
176 }
177 }
178
179 private void addImmediate(StringBuilder sb, List<Instruction> immediate) {
180 if (!immediate.isEmpty()) {
181 sb.append("Immediate instructions = ");
182 for (Instruction i : immediate) {
Simon Huntabd16f62015-05-01 13:14:40 -0700183 sb.append(capitalizeFully(i.type().toString())).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700184 }
185 removeTrailingComma(sb);
186 }
187 }
188
189 private StringBuilder removeTrailingComma(StringBuilder sb) {
190 int pos = sb.lastIndexOf(COMMA);
191 sb.delete(pos, sb.length());
192 return sb;
193 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700194 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700195}