blob: c3e01ff21a639504d080a4269991452386fae457 [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 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
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 Huntd2747a02015-04-30 22:41:16 -070070 protected Collection<RequestHandler> getHandlers() {
71 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();
89 tm.setComparator(GROUP_ID, IntComparator.INSTANCE);
90 tm.setComparator(TABLE_ID, IntComparator.INSTANCE);
91 tm.setComparator(PRIORITY, IntComparator.INSTANCE);
92 tm.setComparator(TIMEOUT, IntComparator.INSTANCE);
93 tm.setComparator(PACKETS, LongComparator.INSTANCE);
94 tm.setComparator(BYTES, LongComparator.INSTANCE);
Bri Prebilic Cole9467a232015-05-06 16:59:05 -070095
96 tm.setFormatter(SELECTOR, new SelectorFormatter());
97 tm.setFormatter(TREATMENT, new TreatmentFormatter());
98 tm.setFormatter(STATE, EnumFormatter.INSTANCE);
Simon Hunt3d1b0652015-05-05 17:27:24 -070099 return tm;
100 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700101
Simon Hunt3d1b0652015-05-05 17:27:24 -0700102 @Override
103 protected void populateTable(TableModel tm, ObjectNode payload) {
104 String uri = string(payload, "devId");
105 if (!Strings.isNullOrEmpty(uri)) {
106 DeviceId deviceId = DeviceId.deviceId(uri);
107 FlowRuleService frs = get(FlowRuleService.class);
108 for (FlowEntry flow : frs.getFlowEntries(deviceId)) {
109 populateRow(tm.addRow(), flow);
110 }
111 }
112 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700113
Simon Hunt3d1b0652015-05-05 17:27:24 -0700114 private void populateRow(TableModel.Row row, FlowEntry flow) {
115 row.cell(ID, flow.id().value())
116 .cell(APP_ID, flow.appId())
117 .cell(GROUP_ID, flow.groupId().id())
118 .cell(TABLE_ID, flow.tableId())
119 .cell(PRIORITY, flow.priority())
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700120 .cell(SELECTOR, flow)
121 .cell(TREATMENT, flow)
Simon Hunt3d1b0652015-05-05 17:27:24 -0700122 .cell(TIMEOUT, flow.timeout())
123 .cell(PERMANENT, flow.isPermanent())
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700124 .cell(STATE, flow.state())
Simon Hunt3d1b0652015-05-05 17:27:24 -0700125 .cell(PACKETS, flow.packets())
126 .cell(BYTES, flow.bytes());
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700127 }
128
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700129 private final class SelectorFormatter implements CellFormatter {
130 @Override
131 public String format(Object value) {
132 FlowEntry flow = (FlowEntry) value;
133 Set<Criterion> criteria = flow.selector().criteria();
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700134
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700135 if (criteria.isEmpty()) {
136 return "(No traffic selector criteria for this flow)";
137 }
138 StringBuilder sb = new StringBuilder("Criteria: ");
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700139 for (Criterion c : criteria) {
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700140 sb.append(c).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700141 }
142 removeTrailingComma(sb);
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700143
144 return sb.toString();
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700145 }
146 }
147
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700148 private final class TreatmentFormatter implements CellFormatter {
149 @Override
150 public String format(Object value) {
151 FlowEntry flow = (FlowEntry) value;
152 List<Instruction> instructions = flow.treatment().allInstructions();
153
154 if (instructions.isEmpty()) {
155 return "(No traffic treatment instructions for this flow)";
156 }
157 StringBuilder sb = new StringBuilder("Treatment Instructions: ");
158 for (Instruction i : instructions) {
159 sb.append(i).append(COMMA);
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700160 }
161 removeTrailingComma(sb);
Bri Prebilic Cole9467a232015-05-06 16:59:05 -0700162
163 return sb.toString();
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700164 }
165 }
166
167 private StringBuilder removeTrailingComma(StringBuilder sb) {
168 int pos = sb.lastIndexOf(COMMA);
169 sb.delete(pos, sb.length());
170 return sb;
171 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700172 }
Bri Prebilic Colecdc188d2015-04-24 16:40:11 -0700173}