/*
* 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
*/
define(['app/vpp/vpp.module', 'next'], function(vpp) {
vpp.register.factory('VPPRestangular', function(Restangular, ENV) {
return Restangular.withConfig(function(RestangularConfig) {
RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL"));
});
});
vpp.register.factory('VPPRestangularXml', function(Restangular, ENV) {
return Restangular.withConfig(function(RestangularConfig) {
RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL"));
RestangularConfig.setDefaultHeaders({ "Content-Type": "application/xml" }, { "Accept": "application/xml" });
});
});
vpp.register.service('toastService', function($mdToast) {
this.showToast = function(content) {
var toast = $mdToast.simple()
.content(content)
.action('OK')
.position('bottom right');
$mdToast.show(toast);
}
});
vpp.register.service('httpService', function($http, dataService, $log, toastService, $q) {
/*
this.requestVpps = function() {
$http.get(vppsUrl, {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
dataService.vpps = processVpps(response.data);
var counter = 0;
angular.forEach(dataService.vpps, function(vpp) {
counter++;
var isFinalInterfaceRequest = counter === dataService.vpps.length;
requestInterfaces(vpp, isFinalInterfaceRequest);
});
}, function errorCallback(response) {
toastService.showToast('Error retrieving VPPs');
$log.error(response);
});
};
var requestInterfaces = function(vpp, isFinalInterfaceRequest) {
$http.get(interfacesUrl+vpp['node-id']+interfacesUri, {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
vpp.interfaces = response.data.interfaces.interface;
//------
$http.get(operationalUrl+vpp['node-id']+operationalUri, {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
vpp.operational = response.data;
var interfaceStates = vpp.operational['ietf-interfaces:interfaces-state'].interface;
_.forEach(interfaceStates, function(interf) {
var matchedInterface = _.find(vpp.interfaces,{name: interf.name});
if (matchedInterface) {
matchedInterface['oper-status'] = interf['oper-status'];
matchedInterface['admin-status'] = interf['admin-status'];
}
});
if (isFinalInterfaceRequest) {
dataService.updateInventoryTopology();
}
}, function errorCallback() {
$log.error('Error receiving interface states for '+vpp['node-id']);
});
//-------
}, function errorCallback() {
$log.error('Error receiving interfaces for '+vpp['node-id']);
});
};
var requestBridgeDomains = function() {
$http.get(bridgedomainsUrl, {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
dataService.setBridgeDomains(response.data["v3po:vpp-state"]);
// done loading...
dataService.requestsFinished();
}, function errorCallback(response) {
toastService.showToast('Error retrieving Bridge Domains');
$log.error(response);
});
};
this.deploy = function() {
var errorOccurred = false;
var success = function(succeeded, lastAssignment) {
if (!errorOccurred && !succeeded) {
toastService.showToast('Error deploying configuration!');
errorOccurred = true;
} else if (!errorOccurred && succeeded && lastAssignment){
toastService.showToast('Deployed! Bridge Domain Validated');
}
};
for (var x = 0; x < dataService.changedInterfaces.length; x++) {
this.updateAssignmentInODL(dataService.changedInterfaces[x], success, x === dataService.changedInterfaces.length - 1);
}
dataService.changedInterfaces.length = 0;
};
this.updateAssignmentInODL = function(interf, success, lastAssignment) {
var postData = {
"interface": [
{
"name": interf.name,
"link-up-down-trap-enable": "disabled",
"v3po:ethernet": {
"mtu": interf['v3po:ethernet']['mtu']
},
"v3po:l2": {
"bridge-domain": interf['v3po:l2']['bridge-domain'],
"split-horizon-group": 0,
"bridged-virtual-interface": false
},
"type": interf.type,
"description": "",
"enabled": true
}
]
};
$http.put(interfacesConfigUrl + encodeURIComponent(interf.name), postData, {
headers: {
'Content-Type': 'application/yang.data+json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
//...
success(true, lastAssignment);
}, function errorCallback(response) {
success(false, lastAssignment);
$log.error(response);
});
};
this.addBdToODL = function(bdName, isDone) {
var putData = {
"bridge-domain": [
{
"name": bdName,
"flood": "true",
"forward": "true",
"learn": "true",
"unknown-unicast-flood": "true",
"arp-termination": "false"
}
]
};
$http.put(newBridgeDomainUrl+bdName, putData,
{
headers: {
'Content-Type': 'application/yang.data+json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback() {
toastService.showToast('Bridge Domain Added!');
isDone('success');
}, function errorCallback(response) {
$log.error(response);
toastService.showToast('Error adding Bridge Domain.');
isDone('failure');
});
};
this.updateInterface = function(interf, isWaiting, cancel, success) {
$http.get(interfacesOperUrl + encodeURIComponent(interf.name), {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(r) {
var receivedData = r.data.interface[0];
var postData = {
"interface": [
{
"name": receivedData.name,
"link-up-down-trap-enable": "disabled",
"v3po:ethernet": {
"mtu": receivedData['v3po:ethernet']['mtu']
},
"v3po:l2": {
"bridge-domain": receivedData['v3po:l2']['bridge-domain'],
"split-horizon-group": 0,
"bridged-virtual-interface": false
},
"type": receivedData.type,
"description": interf.description,
"enabled": interf['admin-status'] === 'up' ? true : false
}
]
};
$http.put(interfacesConfigUrl + encodeURIComponent(interf.name), postData,
{
headers: {
'Content-Type': 'application/yang.data+json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback() {
toastService.showToast('Updated!');
isWaiting = false;
success();
}, function errorCallback(response) {
$log.error(response);
toastService.showToast('Error updating');
isWaiting = false;
cancel();
});
}, function errorCallback(response) {
$log.error(response);
toastService.showToast('Error updating');
isWaiting = false;
cancel();
});
};
this.removeBdFromOdl = function(name,success) {
$http.delete(newBridgeDomainUrl+name, {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + btoa(username + ":" + password)
}
})
.then(function successCallback() {
success(true);
}, function errorCallback() {
success(false);
});
};
this.configVpp = function(name,ip,port,un,pw,finishedSuccessfullyCallback) {
var putData = '\
\
prefix:sal-netconf-connector\
'+name+'\
'+ip+'\
'+port+'\
'+un+'\
'+pw+'\
false\
\
prefix:netty-event-executor\
global-event-executor\
\
\
prefix:binding-broker-osgi-registry\
binding-osgi-broker\
\
\
prefix:dom-broker-osgi-registry\
dom-broker\
\
\
prefix:netconf-client-dispatcher\
global-netconf-dispatcher\
\
\
prefix:threadpool\
global-netconf-processing-executor\
\
';
$http.put(configVpp+name, putData, {
headers: {
"Accept": 'application/xml',
"Content-Type": 'application/xml',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
//...
finishedSuccessfullyCallback(true);
}, function errorCallback(response) {
finishedSuccessfullyCallback(false);
$log.error(response);
});
};
this.deleteVpp = function(name, finishedSuccessfullyCallback) {
$http.delete(configVpp+name, {
headers: {
"Accept": 'application/xml',
"Content-Type": 'application/xml',
"Authorization": "Basic " + btoa(username + ":" + password)
}
}).then(function successCallback(response) {
//...
finishedSuccessfullyCallback(true);
}, function errorCallback(response) {
finishedSuccessfullyCallback(false);
$log.error(response);
}); */
});
vpp.register.service('dataService', function() {
nx.graphic.Icons.registerIcon("bd", "src/app/vpp/assets/images/bd1.svg", 45, 45);
nx.graphic.Icons.registerIcon("interf", "src/app/vpp/assets/images/interf.svg", 45, 45);
/*
var Topo = function() {
return new nx.graphic.Topology({
adaptive:true,
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'
}
});
};
this.bridgeDomainsTopo = Topo();
this.vpps = [];
this.tableContent = [];
this.unassignedInterfaces = [];
this.interfaces = [];
this.injectedInterfaces = [];
this.bridgedomains = [];
this.changedInterfaces = [];
this.selectedBd = {
name: ''
};
this.setBridgeDomains = function(data) {
angular.copy(data['bridge-domains']['bridge-domain'], this.bridgedomains);
};
this.clearInjectedInterfacesInBridgeDomainTopo = function() {
this.bridgeDomainsTopo.clear();
this.injectedInterfaces.length = 0;
};
this.generateUnassignedInterfaces = function() {
this.unassignedInterfaces.length = 0;
for (var x=0; x\
'+ip+'\
'+port+'\
'+un+'\
'+pw+'\
false\
\
prefix:netty-event-executor\
global-event-executor\
\
\
prefix:binding-broker-osgi-registry\
binding-osgi-broker\
\
\
prefix:dom-broker-osgi-registry\
dom-broker\
\
\
prefix:netconf-client-dispatcher\
global-netconf-dispatcher\
\
\
prefix:threadpool\
global-netconf-processing-executor\
\
';
var restObj = VPPRestangularXml.one('restconf').one('config').one('opendaylight-inventory:nodes').one('node').one('controller-config').one('yang-ext:mount');
restObj.post('config:modules', postData).then(function() {
finishedSuccessfullyCallback(true);
}, function(res) {
finishedSuccessfullyCallback(false);
});
};
return s;
});
vpp.register.factory('VppInterfaceService', function(VPPRestangular) {
var s = {};
s.getInterfaceList = function(vppName,successCallback, errorCallback) {
var restObj = VPPRestangular.one('restconf').one('operational').one('network-topology:network-topology').one('topology').one('topology-netconf').one('node').one(vppName).one('yang-ext:mount').one('ietf-interfaces:interfaces-state');
restObj.get().then(function(data) {
successCallback(data);
}, function(res) {
errorCallback(res);
});
};
return s;
});
});