aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js')
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js220
1 files changed, 220 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js
new file mode 100644
index 00000000..ca379360
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Traffic Module.
+ Defines behavior for viewing different traffic modes.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, flash, wss, api;
+
+ /*
+ API to topoForce
+ hovered()
+ somethingSelected()
+ selectOrder()
+ */
+
+ // internal state
+ var trafficMode = null,
+ hoverMode = null;
+
+
+ // === -----------------------------------------------------
+ // Helper functions
+
+ // invoked in response to change in selection and/or mouseover/out:
+ function requestTrafficForMode(mouse) {
+ if (trafficMode === 'flows') {
+ requestDeviceLinkFlows();
+ } else if (trafficMode === 'intents') {
+ if (!mouse || hoverMode === 'intents') {
+ requestRelatedIntents();
+ }
+ } else {
+ // do nothing
+ }
+ }
+
+ function requestDeviceLinkFlows() {
+ // generates payload based on current hover-state
+ var hov = api.hovered();
+
+ function hoverValid() {
+ return hoverMode === 'flows' &&
+ hov && (hov.class === 'device');
+ }
+
+ if (api.somethingSelected()) {
+ wss.sendEvent('requestDeviceLinkFlows', {
+ ids: api.selectOrder(),
+ hover: hoverValid() ? hov.id : ''
+ });
+ }
+ }
+
+ function requestRelatedIntents() {
+ // generates payload based on current hover-state
+ var hov = api.hovered();
+
+ function hoverValid() {
+ return hoverMode === 'intents' &&
+ hov && (hov.class === 'host' || hov.class === 'device');
+ }
+
+ if (api.somethingSelected()) {
+ wss.sendEvent('requestRelatedIntents', {
+ ids: api.selectOrder(),
+ hover: hoverValid() ? hov.id : ''
+ });
+ }
+ }
+
+
+ // === -------------------------------------------------------------
+ // Traffic requests invoked from keystrokes or toolbar buttons...
+
+ function cancelTraffic(forced) {
+ if (!trafficMode || (!forced && trafficMode === 'allFlowPort')) {
+ return false;
+ }
+
+ trafficMode = hoverMode = null;
+ wss.sendEvent('cancelTraffic');
+ flash.flash('Traffic monitoring canceled');
+ return true;
+ }
+
+ function showAllFlowTraffic() {
+ trafficMode = 'allFlowPort';
+ hoverMode = null;
+ wss.sendEvent('requestAllFlowTraffic');
+ flash.flash('All Flow Traffic');
+ }
+
+ function showAllPortTraffic() {
+ trafficMode = 'allFlowPort';
+ hoverMode = null;
+ wss.sendEvent('requestAllPortTraffic');
+ flash.flash('All Port Traffic');
+ }
+
+ function showDeviceLinkFlows () {
+ trafficMode = hoverMode = 'flows';
+ requestDeviceLinkFlows();
+ flash.flash('Device Flows');
+ }
+
+ function showRelatedIntents () {
+ trafficMode = hoverMode = 'intents';
+ requestRelatedIntents();
+ flash.flash('Related Paths');
+ }
+
+ function showPrevIntent() {
+ if (trafficMode === 'intents') {
+ hoverMode = null;
+ wss.sendEvent('requestPrevRelatedIntent');
+ flash.flash('Previous related intent');
+ }
+ }
+
+ function showNextIntent() {
+ if (trafficMode === 'intents') {
+ hoverMode = null;
+ wss.sendEvent('requestNextRelatedIntent');
+ flash.flash('Next related intent');
+ }
+ }
+
+ function showSelectedIntentTraffic() {
+ if (trafficMode === 'intents') {
+ hoverMode = null;
+ wss.sendEvent('requestSelectedIntentTraffic');
+ flash.flash('Traffic on Selected Path');
+ }
+ }
+
+
+ // === ------------------------------------------------------
+ // action buttons on detail panel (multiple selection)
+
+ function addHostIntent () {
+ var so = api.selectOrder();
+ wss.sendEvent('addHostIntent', {
+ one: so[0],
+ two: so[1],
+ ids: so
+ });
+ trafficMode = 'intents';
+ hoverMode = null;
+ flash.flash('Host-to-Host flow added');
+ }
+
+ function addMultiSourceIntent () {
+ var so = api.selectOrder();
+ wss.sendEvent('addMultiSourceIntent', {
+ src: so.slice(0, so.length - 1),
+ dst: so[so.length - 1],
+ ids: so
+ });
+ trafficMode = 'intents';
+ hoverMode = null;
+ flash.flash('Multi-Source flow added');
+ }
+
+
+ // === -----------------------------------------------------
+ // === MODULE DEFINITION ===
+
+ angular.module('ovTopo')
+ .factory('TopoTrafficService',
+ ['$log', 'FnService', 'FlashService', 'WebSocketService',
+
+ function (_$log_, _fs_, _flash_, _wss_) {
+ $log = _$log_;
+ fs = _fs_;
+ flash = _flash_;
+ wss = _wss_;
+
+ return {
+ initTraffic: function (_api_) { api = _api_; },
+ destroyTraffic: function () { },
+
+ // invoked from toolbar overlay buttons or keystrokes
+ cancelTraffic: cancelTraffic,
+ showAllFlowTraffic: showAllFlowTraffic,
+ showAllPortTraffic: showAllPortTraffic,
+ showDeviceLinkFlows: showDeviceLinkFlows,
+ showRelatedIntents: showRelatedIntents,
+ showPrevIntent: showPrevIntent,
+ showNextIntent: showNextIntent,
+ showSelectedIntentTraffic: showSelectedIntentTraffic,
+
+ // invoked from mouseover/mouseout and selection change
+ requestTrafficForMode: requestTrafficForMode,
+
+ // TODO: these should move to new UI demo app
+ // invoked from buttons on detail (multi-select) panel
+ addHostIntent: addHostIntent,
+ addMultiSourceIntent: addMultiSourceIntent
+ };
+ }]);
+}());