blob: b5a5283840e1e5ad89a37b167e1cb4d020bb1b8c [file] [log] [blame]
/*
* 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 layer filtering Module.
Provides functionality to visually differentiate between the packet and
optical layers of the topology.
*/
(function () {
'use strict';
// injected refs
var flash;
// api to topoForce
var api;
/*
node() // get ref to D3 selection of nodes
link() // get ref to D3 selection of links
*/
// function to be replaced by the localization bundle function
var topoLion = function (x) {
return '#tfltr#' + x + '#';
};
var smax = 'suppressedmax';
// which "layer" a particular item "belongs to"
var layerLookup = {
host: {
endstation: 'pkt', // default, if host event does not define type
router: 'pkt',
bgpSpeaker: 'pkt',
},
device: {
switch: 'pkt',
router: 'pkt',
roadm: 'opt',
otn: 'opt',
},
link: {
hostLink: 'pkt',
direct: 'pkt',
indirect: '',
tunnel: '',
optical: 'opt',
},
},
// order of layer cycling in button
dispatch = [
{
type: 'all',
action: function () { suppressLayers(false); },
},
{
type: 'pkt',
action: function () { showLayer('pkt'); },
},
{
type: 'opt',
action: function () { showLayer('opt'); },
},
],
layer = 0,
layerType,
lionKey;
function clickAction() {
layer = (layer + 1) % dispatch.length;
dispatch[layer].action();
layerType = dispatch[layer].type;
lionKey = 'fl_layer_' + layerType;
flash.flash(topoLion(lionKey));
}
function selected() {
return dispatch[layer].type;
}
function inLayer(d, layer) {
var type = d.class === 'link' ? d.type() : d.type,
look = layerLookup[d.class],
lyr = look && look[type];
return lyr === layer;
}
function unsuppressLayer(which) {
api.node().each(function (d) {
var node = d.el;
if (inLayer(d, which)) {
node.classed(smax, false);
}
});
api.link().each(function (d) {
var link = d.el;
if (inLayer(d, which)) {
link.classed(smax, false);
}
});
}
function suppressLayers(b) {
api.node().classed(smax, b);
api.link().classed(smax, b);
}
function showLayer(which) {
suppressLayers(true);
unsuppressLayer(which);
}
// invoked after the localization bundle has been received from the server
function setLionBundle(bundle) {
topoLion = bundle;
}
// === -----------------------------------------------------
// === MODULE DEFINITION ===
angular.module('ovTopo')
.factory('TopoFilterService', ['FlashService',
function (_flash_) {
flash = _flash_;
function initFilter(_api_) {
api = _api_;
}
return {
initFilter: initFilter,
clickAction: clickAction,
selected: selected,
inLayer: inLayer,
setLionBundle: setLionBundle,
};
},
]);
}());