/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
var modules = ['app/vpp/vpp.module',
'app/vpp/vpp.services',
];
define(modules, function(vpp) {
vpp.register.controller('vppCtrl', ['$scope', '$rootScope', '$timeout' ,'dataService', 'toastService', '$mdSidenav', '$mdDialog',
function ($scope, $rootScope, $timeout ,dataService, toastService, $mdSidenav, $mdDialog) {
$rootScope['section_logo'] = 'src/app/vpp/assets/images/vpp.gif';
$scope.view_path = 'src/app/vpp/views/';
$scope.mainView = "inventory";
$scope.setMainView = function(viewName) {
$scope.mainView = viewName;
};
}]);
vpp.register.controller('InventoryTableController', ['$scope', '$rootScope','$filter', 'toastService', 'VppService', '$mdDialog', 'dataService', 'VppInterfaceService',
function($scope, $rootScope, filter, toastService, VppService, $mdDialog, dataService, VppInterfaceService) {
$scope.initTable =
$scope.getInterfaces = function(index) {
VppInterfaceService.getInterfaceList(
$scope.vppList[index].name,
//success callback
function(data) {
var interfaces = data['interfaces-state'].interface;
var vpp = $scope.vppList[index];
vpp.interfaces = [];
interfaces.forEach(function(i){
if (i.name != 'local0') {
vpp.interfaces.push(i);
}
});
console.log($scope.vppList);
angular.copy($scope.vppList, dataService.vpps);
},
//error callback
function(res) {
console.error(res);
}
)
};
$scope.getVppList = function() {
$scope.initVppList();
VppService.getVppList(
// success callback
function(data) {
if(data.topology.length || data.topology[0].node.length) {
data.topology[0].node.forEach(function(n) {
if(n['node-id'] !== 'controller-config') {
var vppObj = VppService.createObj(n['node-id'], n['netconf-node-topology:host'], n['netconf-node-topology:port'], null, null, n['netconf-node-topology:connection-status']);
$scope.vppList.push(vppObj);
$scope.getInterfaces($scope.vppList.length - 1); //pass index.
}
});
}
$scope.$broadcast('RELOAD_VPP_TABLE');
},
// error callback
function(res) {
console.error(res);
}
);
};
$scope.initVppList = function() {
$scope.vppList = [];
};
$scope.viewTopology = function(vpp) {
$mdDialog.show({
controller: function() {
var vm = this;
$scope.topo = new nx.graphic.Topology({
height: 350,
width: 500,
scalable: true,
theme:'blue',
enableGradualScaling:true,
nodeConfig: {
color: '#414040',
label: 'model.label',
scale: 'model.scale',
iconType: function(vertex) {
var type = vertex.get().type;
if (type === 'bd') {
return 'bd'
} else if (type === 'vpp') {
return 'switch'
} else {
return 'interf';
}
}
},
linkConfig: {
label: 'model.label',
linkType: 'parallel',
color: function(link) {
if (link.getData().type === 'tunnel') {
return '#00FF00';
} else {
return '#414040';
}
},
width: function(link) {
if (link.getData().type === 'tunnel') {
return 5;
}
}
},
showIcon: true,
dataProcessor: 'force',
autoLayout: true,
enableSmartNode: false,
tooltipManagerConfig: {
nodeTooltipContentClass: 'TooltipNode',
linkTooltipContentClass: 'TooltipLink'
}
});
$scope.app = new nx.ui.Application;
vm.vpp = vpp;
vm.vpp.type = 'vpp';
vm.vpp.label = vm.vpp.name;
var nodes = [].concat(vm.vpp);
var links = [];
_.forEach(vm.vpp.interfaces, function(interf, index){
interf.label = interf.name;
interf.scale = 0.5;
nodes.push(interf);
links.push({source: 0, target: index + 1});
});
console.log(vpp);
console.log(nodes);
console.log(links);
$scope.topo.data({
nodes: nodes,
links: links
});
this.close = function() {
$mdDialog.cancel();
};
},
onComplete: function() {
console.log(document.getElementById('next-vpp-topo'));
$scope.app.container(document.getElementById('next-vpp-topo'));
$scope.topo.attach($scope.app);
},
templateUrl: $scope.view_path + 'vpp-topo.html',
controllerAs: 'VppTopoCtrl',
parent: angular.element(document.body),
clickOutsideToClose:true
})
};
$scope.addVppShowForm = function() {
$mdDialog.show({
controller: function() {
var vm = this;
vm.vpp = {};
//function called when the cancel button ( 'x' in the top right) is clicked
vm.close = function() {
$mdDialog.cancel();
};
vm.finished = function(successful) {
if (successful) {
vm.close();
vm.waiting = false;
toastService.showToast('New VPP added!');
$scope.getVppList();
} else {
vm.waiting = false;
toastService.showToast('Error adding new VPP');
}
};
//function called when the update button is clicked
vm.updateConfig = function() {
vm.waiting = true;
VppService.mountVpp(vm.vpp.name, vm.vpp.ip, vm.vpp.port, vm.vpp.un, vm.vpp.pw, vm.finished);
};
},
controllerAs: 'NewVppDialogCtrl',
templateUrl: $scope.view_path + 'new-vpp-dialog.html',
parent: angular.element(document.body),
clickOutsideToClose:true
})
};
$scope.editVppShowForm = function(vppObject) {
$mdDialog.show({
controller: function() {
var vm = this;
vm.vpp = {
name: vppObject.name,
status: vppObject.status,
ip: vppObject.ipAddress,
port: vppObject.port
};
//function called when the cancel button ( 'x' in the top right) is clicked
vm.close = function() {
$mdDialog.cancel();
};
vm.finishedUpdating = function(successful) {
if (successful) {
vm.close();
vm.waiting = false;
toastService.showToast('VPP configuration updated!');
$scope.getVppList();
} else {
vm.waiting = false;
toastService.showToast('Error configuring VPP');
}
};
vm.finishedDeleting = function(successful) {
if (successful) {
VppService.mountVpp(vm.vpp.name, vm.vpp.ip, vm.vpp.port, vm.vpp.un, vm.vpp.pw, vm.finishedUpdating);
$scope.getVppList();
} else {
vm.waiting = false;
toastService.showToast('Error configuring VPP');
}
};
//function called when the update button is clicked
vm.updateConfig = function() {
//VppService.editVpp(vm.vpp.name, vm.vpp.ip, vm.vpp.port, vm.vpp.un, vm.vpp.pw, vm.finishedUpdating);
VppService.deleteVpp(vm.vpp, vm.finishedDeleting);
};
},
controllerAs: 'ConfigVppDialogCtrl',
templateUrl: $scope.view_path + 'config-vpp-dialog.html',
parent: angular.element(document.body),
clickOutsideToClose:true
});
};
$scope.deleteVpp = function(vppObject) {
var finished = function(successful) {
if (successful) {
toastService.showToast('Removed VPP!');
$scope.getVppList();
} else {
toastService.showToast('Error removing VPP');
}
};
VppService.deleteVpp(vppObject, finished);
};
$scope.getVppList();
}]);
vpp.register.controller('InventoryTableDefinitonController', ['$scope', function($scope) {
var actionCellTemplate =
'View Topology' +
'Edit' +
'Delete';
$scope.gridOptions = {
expandableRowTemplate: $scope.view_path + 'inventory-table-interfaces-subgrid.tpl.html',
expandableRowHeight: 150,
//subGridVariable will be available in subGrid scope
expandableRowScope: {
subGridVariable: 'subGridScopeVariable'
}
}
$scope.gridOptions.columnDefs = [
{ name: 'name' },
{ name: 'ipAddress'},
{ name: 'port'},
{ name: 'status'},
{ name:' ',cellTemplate: actionCellTemplate}
];
//$scope.gridOptions.data = $scope.vppList;
$scope.gridOptions.onRegisterApi = function(gridApi){
$scope.gridApi = gridApi;
};
$scope.$on('RELOAD_VPP_TABLE', function(event) {
$scope.gridOptions.data = $scope.vppList.map(function(item) {
item.subGridOptions = {
columnDefs: [
{ name:"Name", field:"name" },
{name:"Mac Address", field: "phys-address"},
{name:"Oper. Status", fiels: "oper-status"}
],
data: item.interfaces
};
return item;
});
});
}]);
vpp.register.controller('TableController', ['$scope', '$rootScope','$filter', 'dataService', 'toastService', function ($scope, $rootScope, filter, dataService, toastService) {
var vm = this;
vm.rowCollection = dataService.tableContent;
vm.displayedCollection = [].concat(vm.rowCollection);
vm.updateAssignment = function(receivedInterface) {
var interf = _.find(dataService.interfaces, {name: receivedInterface.name, 'phys-address': receivedInterface['phys-address']});
angular.copy(receivedInterface, interf);
if (interf.assigned){
interf['v3po:l2']['bridge-domain'] = dataService.selectedBd.name;
} else {
interf['v3po:l2']['bridge-domain'] = '';
}
dataService.injectBridgeDomainsTopoElements();
dataService.buildTableContent();
var previouslyChangedInterface = _.find(dataService.changedInterfaces, {name: interf.name, 'phys-address': interf['phys-address']});
if (!previouslyChangedInterface) {
dataService.changedInterfaces.push(interf);
}
console.log(dataService.changedInterfaces);
};
}]);
vpp.register.controller('BridgeDomainsController', function(dataService, $location, $mdDialog, toastService) {
var vm = this;
vm.dataService = dataService;
dataService.nextApp.container(document.getElementById('bridge-domains-next-app'));
dataService.bridgeDomainsTopo.attach(dataService.nextApp);
window.addEventListener('resize', function () {
if ($location.path() === '/bridgedomains') {
dataService.topo.adaptToContainer();
}
});
vm.bridgedomains = dataService.bridgedomains;
vm.selectedBd = dataService.selectedBd;
dataService.bridgeDomainsTopo.on('clickNode',function(topo,node) {
console.log(node);
});
vm.bdChanged = function() {
dataService.injectBridgeDomainsTopoElements();
dataService.buildTableContent();
};
vm.addBd = function() {
//show dialog
$mdDialog.show({
controller: function() {
var vm = this;
vm.bd = {};
vm.waiting = false;
//function called when the cancel button ( 'x' in the top right) is clicked
vm.close = function() {
$mdDialog.cancel();
};
vm.isDone = function(status) {
vm.waiting = false;
if (status === 'success') {
dataService.bridgedomains.push(vm.bd);
dataService.selectedBd.name = vm.bd.name;
dataService.injectBridgeDomainsTopoElements();
dataService.buildTableContent();
vm.close();
}
};
//function called when the update button is clicked
vm.updateConfig = function() {
vm.waiting = true;
//send a POST with the entered content in the form field
};
},
controllerAs: 'NewBdDialogCtrl',
templateUrl: 'templates/new-bd-dialog.html',
parent: angular.element(document.body),
clickOutsideToClose:false
})
};
vm.deploy = function() {
};
vm.removeBd = function() {
if(vm.selectedBd.name) {
var successCallback = function(success) {
if (success) {
console.log(vm.bridgedomains);
_.remove(vm.bridgedomains, {
name: vm.selectedBd.name
});
toastService.showToast('Bridge Domain Removed!');
vm.selectedBd.name = '';
dataService.clearInjectedInterfacesInBridgeDomainTopo();
dataService.injectBdIntoBridgeDomainsTopo();
dataService.tableContent.length = 0;
} else {
toastService.showToast('Error removing Bridge Domain!');
}
};
//... removeBdFromOdl(vm.selectedBd.name, successCallback);
}
};
});
});