| /* |
| * Copyright 2015-present Open Networking Foundation |
| * |
| * 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, flash, wss, api; |
| |
| // function to be replaced by the localization bundle function |
| var topoLion = function (x) { |
| return '#ttraf#' + x + '#'; |
| }; |
| |
| /* |
| API to topoForce |
| hovered() |
| somethingSelected() |
| selectOrder() |
| */ |
| |
| var allTrafficTypes = [ |
| 'flowStatsBytes', |
| 'portStatsBitSec', |
| 'portStatsPktSec', |
| ], |
| allTrafficMsgs = []; // filled in with localized messages |
| |
| // internal state |
| var trafficMode = null, |
| hoverMode = null, |
| allTrafficIndex = 0; |
| |
| |
| // === ----------------------------------------------------- |
| // Helper functions |
| |
| function setLionBundle(bundle) { |
| $log.debug('topoTraffic: setting Lion bundle'); |
| topoLion = bundle; |
| allTrafficMsgs = [ |
| topoLion('tr_fl_fstats_bytes'), |
| topoLion('tr_fl_pstats_bits'), |
| topoLion('tr_fl_pstats_pkts'), |
| ]; |
| } |
| |
| // 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' || |
| hov.class === 'link'); |
| } |
| |
| 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(topoLion('fl_monitoring_canceled')); |
| return true; |
| } |
| |
| function showAllTraffic() { |
| trafficMode = 'allFlowPort'; |
| hoverMode = null; |
| wss.sendEvent('requestAllTraffic', { |
| trafficType: allTrafficTypes[allTrafficIndex], |
| }); |
| flash.flash(allTrafficMsgs[allTrafficIndex]); |
| allTrafficIndex = (allTrafficIndex + 1) % 3; |
| } |
| |
| function showDeviceLinkFlows() { |
| trafficMode = hoverMode = 'flows'; |
| requestDeviceLinkFlows(); |
| flash.flash(topoLion('tr_fl_dev_flows')); |
| } |
| |
| function showRelatedIntents() { |
| trafficMode = hoverMode = 'intents'; |
| requestRelatedIntents(); |
| flash.flash(topoLion('tr_fl_rel_paths')); |
| } |
| |
| function showPrevIntent() { |
| if (trafficMode === 'intents') { |
| hoverMode = null; |
| wss.sendEvent('requestPrevRelatedIntent'); |
| flash.flash(topoLion('tr_fl_prev_rel_int')); |
| } |
| } |
| |
| function showNextIntent() { |
| if (trafficMode === 'intents') { |
| hoverMode = null; |
| wss.sendEvent('requestNextRelatedIntent'); |
| flash.flash(topoLion('tr_fl_next_rel_int')); |
| } |
| } |
| |
| function showSelectedIntentTraffic() { |
| if (trafficMode === 'intents') { |
| hoverMode = null; |
| wss.sendEvent('requestSelectedIntentTraffic'); |
| flash.flash(topoLion('tr_fl_traf_on_path')); |
| } |
| } |
| |
| // force the system to create a single intent selection |
| function selectIntent(data) { |
| trafficMode = 'intents'; |
| hoverMode = null; |
| wss.sendEvent('selectIntent', data); |
| flash.flash(topoLion('fl_selecting_intent') + ' ' + data.key); |
| } |
| |
| |
| // === ------------------------------------------------------ |
| // 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(topoLion('tr_fl_h2h_flow_added')); |
| } |
| |
| function removeIntent(d) { |
| var action = topoLion(d.intentPurge ? 'purged' : 'withdrawn'); |
| |
| wss.sendEvent('removeIntent', { |
| appId: d.appId, |
| appName: d.appName, |
| key: d.key, |
| purge: d.intentPurge, |
| }); |
| trafficMode = 'intents'; |
| hoverMode = null; |
| flash.flash(topoLion('intent') + ' ' + action); |
| } |
| |
| function resubmitIntent(d) { |
| wss.sendEvent('resubmitIntent', { |
| appId: d.appId, |
| appName: d.appName, |
| key: d.key, |
| purge: d.intentPurge, |
| }); |
| trafficMode = 'intents'; |
| hoverMode = null; |
| flash.flash(topoLion('intent') + ' ' + topoLion('resubmitted')); |
| } |
| |
| 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(topoLion('tr_fl_multisrc_flow') + ' ' + topoLion('added')); |
| } |
| |
| function removeIntents() { |
| wss.sendEvent('removeIntents', {}); |
| trafficMode = 'intents'; |
| hoverMode = null; |
| flash.flash(topoLion('intents') + ' ' + topoLion('purged')); |
| } |
| |
| |
| // === ----------------------------------------------------- |
| // === MODULE DEFINITION === |
| |
| angular.module('ovTopo') |
| .factory('TopoTrafficService', |
| ['$log', 'FlashService', 'WebSocketService', |
| |
| function (_$log_, _flash_, _wss_) { |
| $log = _$log_; |
| flash = _flash_; |
| wss = _wss_; |
| |
| return { |
| initTraffic: function (_api_) { api = _api_; }, |
| destroyTraffic: function () { }, |
| |
| // invoked from toolbar overlay buttons or keystrokes |
| cancelTraffic: cancelTraffic, |
| showAllTraffic: showAllTraffic, |
| showDeviceLinkFlows: showDeviceLinkFlows, |
| showRelatedIntents: showRelatedIntents, |
| showPrevIntent: showPrevIntent, |
| showNextIntent: showNextIntent, |
| showSelectedIntentTraffic: showSelectedIntentTraffic, |
| selectIntent: selectIntent, |
| |
| // invoked from mouseover/mouseout and selection change |
| requestTrafficForMode: requestTrafficForMode, |
| |
| // invoked from buttons on detail (multi-select) panel |
| addHostIntent: addHostIntent, |
| addMultiSourceIntent: addMultiSourceIntent, |
| removeIntent: removeIntent, |
| resubmitIntent: resubmitIntent, |
| removeIntents: removeIntents, |
| |
| setLionBundle: setLionBundle, |
| }; |
| }]); |
| }()); |