blob: 44bd78d4a76a39d22a340fe03485cd0f45e4c6f7 [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;
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070025import org.onosproject.net.flow.criteria.Criterion;
26import org.onosproject.net.flow.instructions.Instruction;
Simon Huntd2747a02015-04-30 22:41:16 -070027import org.onosproject.ui.RequestHandler;
Simon Hunta0ddb022015-05-01 09:53:01 -070028import org.onosproject.ui.UiMessageHandler;
Bri Prebilic Cole9467a232015-05-06 16:59:05 -070029import org.onosproject.ui.table.CellFormatter;
Simon Hunt3d1b0652015-05-05 17:27:24 -070030import org.onosproject.ui.table.TableModel;
Simon Huntabd16f62015-05-01 13:14:40 -070031import org.onosproject.ui.table.TableRequestHandler;
Bri Prebilic Cole9467a232015-05-06 16:59:05 -070032import org.onosproject.ui.table.cell.EnumFormatter;
Simon Hunt3e4ccaf2016-01-12 19:59:54 -080033import org.onosproject.ui.table.cell.HexFormatter;
34import org.onosproject.ui.table.cell.HexLongFormatter;
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
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070040/**
41 * Message handler for flow view related messages.
42 */
Simon Hunta0ddb022015-05-01 09:53:01 -070043public class FlowViewMessageHandler extends UiMessageHandler {
Simon Huntd2747a02015-04-30 22:41:16 -070044
45 private static final String FLOW_DATA_REQ = "flowDataRequest";
Simon Huntabd16f62015-05-01 13:14:40 -070046 private static final String FLOW_DATA_RESP = "flowDataResponse";
47 private static final String FLOWS = "flows";
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070048
Simon Huntabd16f62015-05-01 13:14:40 -070049 private static final String ID = "id";
50 private static final String APP_ID = "appId";
51 private static final String GROUP_ID = "groupId";
52 private static final String TABLE_ID = "tableId";
53 private static final String PRIORITY = "priority";
54 private static final String SELECTOR = "selector";
55 private static final String TREATMENT = "treatment";
56 private static final String TIMEOUT = "timeout";
57 private static final String PERMANENT = "permanent";
58 private static final String STATE = "state";
Bri Prebilic Cole641b97b2015-05-05 14:47:40 -070059 private static final String PACKETS = "packets";
60 private static final String BYTES = "bytes";
Simon Huntabd16f62015-05-01 13:14:40 -070061
62 private static final String COMMA = ", ";
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070063
Simon Hunt3d1b0652015-05-05 17:27:24 -070064 private static final String[] COL_IDS = {
65 ID, APP_ID, GROUP_ID, TABLE_ID, PRIORITY, SELECTOR,
66 TREATMENT, TIMEOUT, PERMANENT, STATE, PACKETS, BYTES
67 };
68
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070069 @Override
Simon Huntda580882015-05-12 20:58:18 -070070 protected Collection<RequestHandler> createRequestHandlers() {
Simon Huntd2747a02015-04-30 22:41:16 -070071 return ImmutableSet.of(new FlowDataRequest());
72 }
73
Simon Huntabd16f62015-05-01 13:14:40 -070074 // handler for flow table requests
75 private final class FlowDataRequest extends TableRequestHandler {
Simon Huntd2747a02015-04-30 22:41:16 -070076
77 private FlowDataRequest() {
Simon Huntabd16f62015-05-01 13:14:40 -070078 super(FLOW_DATA_REQ, FLOW_DATA_RESP, FLOWS);
Simon Huntd2747a02015-04-30 22:41:16 -070079 }
80
81 @Override
Simon Hunt3d1b0652015-05-05 17:27:24 -070082 protected String[] getColumnIds() {
83 return COL_IDS;
Simon Hunt44aa2f82015-04-30 15:01:35 -070084 }
Simon Hunt44aa2f82015-04-30 15:01:35 -070085
Simon Hunt3d1b0652015-05-05 17:27:24 -070086 @Override
87 protected TableModel createTableModel() {
88 TableModel tm = super.createTableModel();
Simon Hunt3e4ccaf2016-01-12 19:59:54 -080089 tm.setFormatter(ID, HexLongFormatter.INSTANCE);
90 tm.setFormatter(GROUP_ID, HexFormatter.INSTANCE);
Bri Prebilic Cole9467a232015-05-06 16:59:05 -070091 tm.setFormatter(SELECTOR, new SelectorFormatter());
92 tm.setFormatter(TREATMENT, new TreatmentFormatter());
93 tm.setFormatter(STATE, EnumFormatter.INSTANCE);
Simon Hunt3d1b0652015-05-05 17:27:24 -070094 return tm;
95 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -070096
Simon Hunt3d1b0652015-05-05 17:27:24 -070097 @Override
98 protected void populateTable(TableModel tm, ObjectNode payload) {
99 String uri = string(payload, "devId");
100 if (!Strings.isNullOrEmpty(uri)) {
101 DeviceId deviceId = DeviceId.deviceId(uri);
102 FlowRuleService frs = get(FlowRuleService.class);
103 for (FlowEntry flow : frs.getFlowEntries(deviceId)) {
104 populateRow(tm.addRow(), flow);
105 }
106 }
107 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700108
Simon Hunt3d1b0652015-05-05 17:27:24 -0700109 private void populateRow(TableModel.Row row, FlowEntry flow) {
110 row.cell(ID, flow.id().value())
111 .cell(APP_ID, flow.appId())
112 .cell(GROUP_ID, flow.groupId().id())
113 .cell(TABLE_ID, flow.tableId())
114 .cell(PRIORITY, flow.priority())
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700115 .cell(SELECTOR, flow)
116 .cell(TREATMENT, flow)
Simon Hunt3d1b0652015-05-05 17:27:24 -0700117 .cell(TIMEOUT, flow.timeout())
118 .cell(PERMANENT, flow.isPermanent())
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700119 .cell(STATE, flow.state())
Simon Hunt3d1b0652015-05-05 17:27:24 -0700120 .cell(PACKETS, flow.packets())
121 .cell(BYTES, flow.bytes());
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700122 }
123
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700124 private final class SelectorFormatter implements CellFormatter {
125 @Override
126 public String format(Object value) {
127 FlowEntry flow = (FlowEntry) value;
128 Set<Criterion> criteria = flow.selector().criteria();
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700129
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700130 if (criteria.isEmpty()) {
131 return "(No traffic selector criteria for this flow)";
132 }
133 StringBuilder sb = new StringBuilder("Criteria: ");
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700134 for (Criterion c : criteria) {
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700135 sb.append(c).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700136 }
137 removeTrailingComma(sb);
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700138
139 return sb.toString();
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700140 }
141 }
142
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700143 private final class TreatmentFormatter implements CellFormatter {
144 @Override
145 public String format(Object value) {
146 FlowEntry flow = (FlowEntry) value;
147 List<Instruction> instructions = flow.treatment().allInstructions();
148
149 if (instructions.isEmpty()) {
150 return "(No traffic treatment instructions for this flow)";
151 }
152 StringBuilder sb = new StringBuilder("Treatment Instructions: ");
153 for (Instruction i : instructions) {
154 sb.append(i).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700155 }
156 removeTrailingComma(sb);
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700157
158 return sb.toString();
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700159 }
160 }
161
162 private StringBuilder removeTrailingComma(StringBuilder sb) {
163 int pos = sb.lastIndexOf(COMMA);
164 sb.delete(pos, sb.length());
165 return sb;
166 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700167 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700168}