Added a new GUI view for packet processors.
Change-Id: Ia0c6a23b389c4033b94deefdc32a2543b9c9cfa5
Showing
9 changed files
with
341 additions
and
2 deletions
1 | +/* | ||
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 | + | ||
17 | +package org.onosproject.ui.table.cell; | ||
18 | + | ||
19 | +import java.text.DecimalFormat; | ||
20 | +import java.text.NumberFormat; | ||
21 | + | ||
22 | +/** | ||
23 | + * Formats number using the specified format string". | ||
24 | + */ | ||
25 | +public final class NumberFormatter extends AbstractCellFormatter { | ||
26 | + | ||
27 | + private final NumberFormat format; | ||
28 | + | ||
29 | + /** | ||
30 | + * Creates a formatter using a default decimal format. | ||
31 | + */ | ||
32 | + public NumberFormatter() { | ||
33 | + this(new DecimalFormat("#,##0.00000")); | ||
34 | + } | ||
35 | + | ||
36 | + /** | ||
37 | + * Creates a formatter using the specified format. | ||
38 | + * | ||
39 | + * @param format number format | ||
40 | + */ | ||
41 | + public NumberFormatter(NumberFormat format) { | ||
42 | + this.format = format; | ||
43 | + } | ||
44 | + | ||
45 | + @Override | ||
46 | + protected String nonNullFormat(Object value) { | ||
47 | + return format.format(value); | ||
48 | + } | ||
49 | + | ||
50 | +} |
1 | +/* | ||
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 | + | ||
17 | +package org.onosproject.ui.impl; | ||
18 | + | ||
19 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
20 | +import com.google.common.collect.ImmutableSet; | ||
21 | +import org.onosproject.net.packet.PacketProcessorEntry; | ||
22 | +import org.onosproject.net.packet.PacketService; | ||
23 | +import org.onosproject.ui.RequestHandler; | ||
24 | +import org.onosproject.ui.UiMessageHandler; | ||
25 | +import org.onosproject.ui.table.TableModel; | ||
26 | +import org.onosproject.ui.table.TableRequestHandler; | ||
27 | +import org.onosproject.ui.table.cell.NumberFormatter; | ||
28 | + | ||
29 | +import java.util.Collection; | ||
30 | + | ||
31 | +import static org.onosproject.net.packet.PacketProcessor.ADVISOR_MAX; | ||
32 | +import static org.onosproject.net.packet.PacketProcessor.DIRECTOR_MAX; | ||
33 | + | ||
34 | +/** | ||
35 | + * Message handler for packet processor view related messages. | ||
36 | + */ | ||
37 | +public class ProcessorViewMessageHandler extends UiMessageHandler { | ||
38 | + | ||
39 | + private static final String PROCESSOR_DATA_REQ = "processorDataRequest"; | ||
40 | + private static final String PROCESSOR_DATA_RESP = "processorDataResponse"; | ||
41 | + private static final String PROCESSORS = "processors"; | ||
42 | + | ||
43 | + private static final String ID = "id"; | ||
44 | + private static final String TYPE = "type"; | ||
45 | + private static final String PRIORITY = "priority"; | ||
46 | + private static final String PROCESSOR = "processor"; | ||
47 | + private static final String PACKETS = "packets"; | ||
48 | + private static final String AVG_MS = "avgMillis"; | ||
49 | + | ||
50 | + private static final long NANOS_IN_MS = 1_000_000; | ||
51 | + | ||
52 | + private static final String[] COL_IDS = { | ||
53 | + ID, TYPE, PRIORITY, PROCESSOR, PACKETS, AVG_MS | ||
54 | + }; | ||
55 | + | ||
56 | + @Override | ||
57 | + protected Collection<RequestHandler> createRequestHandlers() { | ||
58 | + return ImmutableSet.of(new ProcessorDataRequest()); | ||
59 | + } | ||
60 | + | ||
61 | + // handler for link table requests | ||
62 | + private final class ProcessorDataRequest extends TableRequestHandler { | ||
63 | + private ProcessorDataRequest() { | ||
64 | + super(PROCESSOR_DATA_REQ, PROCESSOR_DATA_RESP, PROCESSORS); | ||
65 | + } | ||
66 | + | ||
67 | + @Override | ||
68 | + protected String[] getColumnIds() { | ||
69 | + return COL_IDS; | ||
70 | + } | ||
71 | + | ||
72 | + @Override | ||
73 | + protected String defaultColumnId() { | ||
74 | + return ID; | ||
75 | + } | ||
76 | + | ||
77 | + @Override | ||
78 | + protected TableModel createTableModel() { | ||
79 | + TableModel tm = super.createTableModel(); | ||
80 | + tm.setFormatter(AVG_MS, new NumberFormatter()); | ||
81 | + return tm; | ||
82 | + } | ||
83 | + | ||
84 | + @Override | ||
85 | + protected void populateTable(TableModel tm, ObjectNode payload) { | ||
86 | + PacketService ps = get(PacketService.class); | ||
87 | + ps.getProcessors().forEach(entry -> populateRow(tm.addRow(), entry)); | ||
88 | + } | ||
89 | + | ||
90 | + private void populateRow(TableModel.Row row, PacketProcessorEntry entry) { | ||
91 | + row.cell(ID, entry.priority()) | ||
92 | + .cell(TYPE, processorType(entry.priority())) | ||
93 | + .cell(PRIORITY, processorPriority(entry.priority())) | ||
94 | + .cell(PROCESSOR, entry.processor().getClass().getName()) | ||
95 | + .cell(PACKETS, entry.invocations()) | ||
96 | + .cell(AVG_MS, entry.averageNanos() / NANOS_IN_MS); | ||
97 | + } | ||
98 | + | ||
99 | + private String processorType(int p) { | ||
100 | + return p > DIRECTOR_MAX ? "observer" : | ||
101 | + p > ADVISOR_MAX ? "director" : "observer"; | ||
102 | + } | ||
103 | + | ||
104 | + private int processorPriority(int p) { | ||
105 | + return p > DIRECTOR_MAX ? (p - DIRECTOR_MAX - 1) : | ||
106 | + p > ADVISOR_MAX ? (p - ADVISOR_MAX - 1) : (p - 1); | ||
107 | + } | ||
108 | + | ||
109 | + } | ||
110 | +} |
... | @@ -77,6 +77,7 @@ public class UiExtensionManager implements UiExtensionService, SpriteService { | ... | @@ -77,6 +77,7 @@ public class UiExtensionManager implements UiExtensionService, SpriteService { |
77 | new UiView(PLATFORM, "app", "Applications", "nav_apps"), | 77 | new UiView(PLATFORM, "app", "Applications", "nav_apps"), |
78 | new UiView(PLATFORM, "settings", "Settings", "nav_settings"), | 78 | new UiView(PLATFORM, "settings", "Settings", "nav_settings"), |
79 | new UiView(PLATFORM, "cluster", "Cluster Nodes", "nav_cluster"), | 79 | new UiView(PLATFORM, "cluster", "Cluster Nodes", "nav_cluster"), |
80 | + new UiView(PLATFORM, "processor", "Packet Processors", "nav_processors"), | ||
80 | new UiView(NETWORK, "topo", "Topology", "nav_topo"), | 81 | new UiView(NETWORK, "topo", "Topology", "nav_topo"), |
81 | new UiView(NETWORK, "device", "Devices", "nav_devs"), | 82 | new UiView(NETWORK, "device", "Devices", "nav_devs"), |
82 | new UiViewHidden("flow"), | 83 | new UiViewHidden("flow"), |
... | @@ -102,6 +103,7 @@ public class UiExtensionManager implements UiExtensionService, SpriteService { | ... | @@ -102,6 +103,7 @@ public class UiExtensionManager implements UiExtensionService, SpriteService { |
102 | new ApplicationViewMessageHandler(), | 103 | new ApplicationViewMessageHandler(), |
103 | new SettingsViewMessageHandler(), | 104 | new SettingsViewMessageHandler(), |
104 | new ClusterViewMessageHandler(), | 105 | new ClusterViewMessageHandler(), |
106 | + new ProcessorViewMessageHandler(), | ||
105 | new TunnelViewMessageHandler() | 107 | new TunnelViewMessageHandler() |
106 | ); | 108 | ); |
107 | 109 | ... | ... |
... | @@ -64,7 +64,8 @@ | ... | @@ -64,7 +64,8 @@ |
64 | nav_devs: 'switch', | 64 | nav_devs: 'switch', |
65 | nav_links: 'ports', | 65 | nav_links: 'ports', |
66 | nav_hosts: 'endstation', | 66 | nav_hosts: 'endstation', |
67 | - nav_intents: 'relatedIntents' | 67 | + nav_intents: 'relatedIntents', |
68 | + nav_processors: 'allTraffic' | ||
68 | }; | 69 | }; |
69 | 70 | ||
70 | function ensureIconLibDefs() { | 71 | function ensureIconLibDefs() { | ... | ... |
1 | +/* | ||
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 | + | ||
17 | +/* | ||
18 | + ONOS GUI -- Processor View -- CSS file | ||
19 | + */ | ||
20 | + | ||
21 | +#ov-processor h2 { | ||
22 | + display: inline-block; | ||
23 | +} | ||
24 | + | ||
25 | +#ov-processor div.ctrl-btns { | ||
26 | + width: 40px; | ||
27 | +} | ||
28 | + | ||
29 | +.light #ov-processor .current-view use { | ||
30 | + fill: white; | ||
31 | +} | ||
32 | +.dark #ov-processor .current-view use { | ||
33 | + fill: #304860; | ||
34 | +} | ||
35 | + | ||
36 | +.light #ov-processor .current-view rect { | ||
37 | + fill: deepskyblue; | ||
38 | +} | ||
39 | +.dark #ov-processor .current-view rect { | ||
40 | + fill: #eee; | ||
41 | +} | ||
42 | + | ||
43 | +#ov-processor td.number { | ||
44 | + text-align: right; | ||
45 | +} | ||
46 | + | ||
47 | +#ov-processor td.type { | ||
48 | + text-align: center; | ||
49 | +} | ||
50 | + | ||
51 | +#ov-processor tr.no-data td { | ||
52 | + text-align: center; | ||
53 | +} |
1 | +<!-- processor partial HTML --> | ||
2 | +<div id="ov-processor"> | ||
3 | + <div class="tabular-header"> | ||
4 | + <h2> | ||
5 | + Packet Processors ({{tableData.length}} Processors total) | ||
6 | + </h2> | ||
7 | + <div class="ctrl-btns"> | ||
8 | + <div class="refresh" ng-class="{active: autoRefresh}" | ||
9 | + icon icon-size="36" icon-id="refresh" | ||
10 | + tooltip tt-msg="autoRefreshTip" | ||
11 | + ng-click="toggleRefresh()"></div> | ||
12 | + <!-- | ||
13 | + <div class="separator"></div> | ||
14 | + | ||
15 | + <div class="current-view" | ||
16 | + icon icon-id="processorTable" icon-size="36"></div> | ||
17 | + | ||
18 | + <div class="active" | ||
19 | + icon icon-id="requestTable" icon-size="36" | ||
20 | + tooltip tt-msg="requestTip" | ||
21 | + ng-click="nav('request')"></div> | ||
22 | + --> | ||
23 | + </div> | ||
24 | + </div> | ||
25 | + | ||
26 | + <div class="summary-list" onos-table-resize> | ||
27 | + <div ng-show="loading" class="loading-wheel" | ||
28 | + icon icon-id="loading" icon-size="75"></div> | ||
29 | + | ||
30 | + <div class="table-header" onos-sortable-header> | ||
31 | + <table> | ||
32 | + <tr> | ||
33 | + <td class="type" colId="type" sortable col-width="80px">Type </td> | ||
34 | + <td class="number" colId="priority" sortable col-width="80px">Priority </td> | ||
35 | + <td colId="processor" sortable col-width="500px">Class </td> | ||
36 | + <td class="number" colId="packets" sortable col-width="100px">Packets </td> | ||
37 | + <td class="number" colId="avgMillis" sortable col-width="80px">Average (ms) </td> | ||
38 | + </tr> | ||
39 | + </table> | ||
40 | + </div> | ||
41 | + | ||
42 | + <div class="table-body"> | ||
43 | + <table onos-flash-changes id-prop="id"> | ||
44 | + <tr ng-if="!tableData.length" class="no-data"> | ||
45 | + <td colspan="5"> | ||
46 | + No Processors found | ||
47 | + </td> | ||
48 | + </tr> | ||
49 | + | ||
50 | + <tr ng-repeat="processor in tableData track by $index" | ||
51 | + ng-repeat-complete row-id="{{processor.id}}"> | ||
52 | + <td class="type">{{processor.type}}</td> | ||
53 | + <td class="number">{{processor.priority}}</td> | ||
54 | + <td>{{processor.processor}}</td> | ||
55 | + <td class="number">{{processor.packets}}</td> | ||
56 | + <td class="number">{{processor.avgMillis}}</td> | ||
57 | + </tr> | ||
58 | + </table> | ||
59 | + </div> | ||
60 | + | ||
61 | + </div> | ||
62 | + | ||
63 | +</div> |
1 | +/* | ||
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 | + | ||
17 | +/* | ||
18 | + ONOS GUI -- Packet Processor View Module | ||
19 | + */ | ||
20 | + | ||
21 | +(function () { | ||
22 | + 'use strict'; | ||
23 | + | ||
24 | + // injected references | ||
25 | + var $log, $scope, $location, fs, tbs, ns; | ||
26 | + | ||
27 | + angular.module('ovProcessor', []) | ||
28 | + .controller('OvProcessorCtrl', | ||
29 | + ['$log', '$scope', '$location', | ||
30 | + 'FnService', 'TableBuilderService', 'NavService', | ||
31 | + | ||
32 | + function (_$log_, _$scope_, _$location_, _fs_, _tbs_, _ns_) { | ||
33 | + var params; | ||
34 | + $log = _$log_; | ||
35 | + $scope = _$scope_; | ||
36 | + $location = _$location_; | ||
37 | + fs = _fs_; | ||
38 | + tbs = _tbs_; | ||
39 | + ns = _ns_; | ||
40 | + $scope.requestTip = 'Show packet requests'; | ||
41 | + | ||
42 | + params = $location.search(); | ||
43 | + | ||
44 | + tbs.buildTable({ | ||
45 | + scope: $scope, | ||
46 | + tag: 'processor', | ||
47 | + query: params | ||
48 | + }); | ||
49 | + | ||
50 | + $scope.nav = function (path) { | ||
51 | + if ($scope.devId) { | ||
52 | + ns.navTo(path); | ||
53 | + } | ||
54 | + }; | ||
55 | + | ||
56 | + $log.log('OvProcessorCtrl has been created'); | ||
57 | + }]); | ||
58 | +}()); |
... | @@ -17,7 +17,7 @@ | ... | @@ -17,7 +17,7 @@ |
17 | <div class="table-header" onos-sortable-header> | 17 | <div class="table-header" onos-sortable-header> |
18 | <table> | 18 | <table> |
19 | <tr> | 19 | <tr> |
20 | - <td colId="component" sortable col-width="200px">Component </td> | 20 | + <td colId="component" sortable col-width="300px">Component </td> |
21 | <td colId="id" sortable>Property </td> | 21 | <td colId="id" sortable>Property </td> |
22 | <td colId="type" sortable col-width="70px">Type </td> | 22 | <td colId="type" sortable col-width="70px">Type </td> |
23 | <td colId="value" sortable>Value </td> | 23 | <td colId="value" sortable>Value </td> | ... | ... |
... | @@ -121,6 +121,7 @@ | ... | @@ -121,6 +121,7 @@ |
121 | <script src="app/view/app/app.js"></script> | 121 | <script src="app/view/app/app.js"></script> |
122 | <script src="app/view/settings/settings.js"></script> | 122 | <script src="app/view/settings/settings.js"></script> |
123 | <script src="app/view/cluster/cluster.js"></script> | 123 | <script src="app/view/cluster/cluster.js"></script> |
124 | + <script src="app/view/processor/processor.js"></script> | ||
124 | <script src="app/view/tunnel/tunnel.js"></script> | 125 | <script src="app/view/tunnel/tunnel.js"></script> |
125 | 126 | ||
126 | <!-- This is where contributed javascript will get injected --> | 127 | <!-- This is where contributed javascript will get injected --> |
... | @@ -139,6 +140,7 @@ | ... | @@ -139,6 +140,7 @@ |
139 | <link rel="stylesheet" href="app/view/app/app.css"> | 140 | <link rel="stylesheet" href="app/view/app/app.css"> |
140 | <link rel="stylesheet" href="app/view/settings/settings.css"> | 141 | <link rel="stylesheet" href="app/view/settings/settings.css"> |
141 | <link rel="stylesheet" href="app/view/cluster/cluster.css"> | 142 | <link rel="stylesheet" href="app/view/cluster/cluster.css"> |
143 | + <link rel="stylesheet" href="app/view/processor/processor.css"> | ||
142 | <link rel="stylesheet" href="app/view/tunnel/tunnel.css"> | 144 | <link rel="stylesheet" href="app/view/tunnel/tunnel.css"> |
143 | 145 | ||
144 | <!-- This is where contributed stylesheets will get injected --> | 146 | <!-- This is where contributed stylesheets will get injected --> | ... | ... |
-
Please register or login to post a comment