| /* |
| * 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() { |
| if (hoverMode === 'flows') { |
| requestDeviceLinkFlows(); |
| } else if (hoverMode === 'intents') { |
| requestRelatedIntents(); |
| } else { |
| cancelTraffic(); |
| } |
| } |
| |
| 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() { |
| if (!trafficMode) { |
| return false; |
| } |
| |
| trafficMode = hoverMode = null; |
| wss.sendEvent('cancelTraffic'); |
| flash.flash('Traffic monitoring canceled'); |
| return true; |
| } |
| |
| function showAllFlowTraffic() { |
| trafficMode = 'allFlow'; |
| hoverMode = 'all'; |
| wss.sendEvent('requestAllFlowTraffic'); |
| flash.flash('All Flow Traffic'); |
| } |
| |
| function showAllPortTraffic() { |
| trafficMode = 'allPort'; |
| hoverMode = 'all'; |
| 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 |
| }); |
| 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 |
| }); |
| 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, |
| |
| // invoked from buttons on detail (multi-select) panel |
| addHostIntent: addHostIntent, |
| addMultiSourceIntent: addMultiSourceIntent |
| }; |
| }]); |
| }()); |