define([ 'app/cpeui/cpeui.module' ], function(cpeui) { cpeui.register.controller('OpenTenantCtrl', function($scope, CpeuiSvc, CpeuiDialogs, CpeUiUtils, $stateParams) { $scope.curTenant = $stateParams.tenantid; $scope.unisTables = {}; $scope.unis = []; $scope.ces = []; $scope.ipvcs = []; $scope.evcs = []; $scope.subnets = {}; $scope.profiles =[]; $scope.cesDisplayNames = {}; $scope.unisMap = {}; $scope.networkNames = {}; $scope.expandFlags = { ipuni:{}, tuni:{}, L2:{},L3:{} }; var tabIndexs = { "inventory" : 0, "L2" : 1, "L3" : 2 } if ($stateParams.tenantTabName in tabIndexs) { $scope.tab.tenantData = tabIndexs[$stateParams.tenantTabName]; } else { $scope.tab.tenantData = tabIndexs.inventory; } CpeuiSvc.getTenantList(function(tenant_list) { if (tenant_list.filter(t => t.name == $scope.curTenant).length == 0) { window.location = "#/cpeui/admin/tenants"; } }); function init(){ $scope.updateUnis(function(unis){ CpeuiSvc.getCes(function(ces) { $scope.ces = ces.filter(function(item) { var filteredUnis = unis.filterByField('device', item["dev-id"]); filteredUnis = filteredUnis.filterByField('prettyID', 'br-int', true); filteredUnis = filteredUnis.filter(function(i){return !(i.prettyID && i.prettyID.startsWith('tun'));}); return (filteredUnis.length); }); ces.forEach(function(ce){ $scope.cesDisplayNames[ce['dev-id']] = ce['device-name'] ? ce['device-name'] : ce['dev-id']; }); $scope.updateEvcView(); }); }); CpeuiSvc.getNetworkNames(function(networks){ networks.forEach(function(net){ $scope.networkNames[net.uuid] = net.name; }); }); CpeuiSvc.getProfiles(function(profiles) { $scope.profiles = profiles; }); } $scope.updateUnis = function(callback) { CpeuiSvc.getUnis(function(unis) { unis.forEach(function(u) { u.prettyID = u['uni-id'].split(":")[u['uni-id'].split(":").length - 1]; $scope.unisMap[u['uni-id']] = u; }); $scope.unis = unis.filter(function(u){return u["tenant-id"] == $scope.curTenant;}); if (callback) { callback($scope.unis); } }); }; $scope.updateEvcView = function() { CpeuiSvc.getServices($scope.curTenant, function(services) { $scope.evcs = services.filter(function(svc){ return svc.evc != undefined;}); $scope.ipvcs = services.filter(function(svc){ return svc.ipvc != undefined;}); $scope.updateUnis(); function mapUniToService(uni, service) { var uniObj = $scope.unis.filterByField('uni-id',uni['uni-id'])[0]; if (uniObj === undefined) { return; } if (!uniObj.vlanToService) { uniObj.vlanToService = []; } uniObj.hasService = true; if (uni['evc-uni-ce-vlans'] && uni['evc-uni-ce-vlans']['evc-uni-ce-vlan']){ uni['evc-uni-ce-vlans']['evc-uni-ce-vlan'].forEach(function(v){ uniObj.vlanToService.push({"vlan":v.vid, "svc":service}); }); } else { if (uni["ip-uni-id"]) { var ipuni = $scope.unis.filterByField('uni-id',uni['uni-id'])[0]; if (ipuni && ipuni["ip-unis"] && ipuni["ip-unis"]["ip-uni"]) { ipuni["ip-unis"]["ip-uni"].forEach(function(ipu){ if (ipu['ip-uni-id'] == uni["ip-uni-id"]){ var vlan = ipu.vlan ? ipu.vlan : 0; uniObj.vlanToService.push({"vlan":vlan, "svc":service}); } }); } } else { uniObj.vlanToService.push({"vlan":0, "svc":service}); } } } $scope.ipvcs.forEach(function(e){ if (e.ipvc.unis != undefined && e.ipvc.unis.uni != undefined){ e.ipvc.unis.uni.forEach(function(u){ u.device = u['uni-id'].split(":")[u['uni-id'].split(":").length-2]; u.prettyID = u['uni-id'].split(":")[u['uni-id'].split(":").length-1]; mapUniToService(u,e); }); } }); $scope.evcs.forEach(function(e){ e.isTree = (e.evc['evc-type'] == 'rooted-multipoint'); e.device2unis = {}; if (e.evc.unis != undefined && e.evc.unis.uni != undefined){ e.evc.unis.uni.forEach(function(u){ if (e.device2unis[$scope.unisMap[u['uni-id']].device] == undefined){ e.device2unis[$scope.unisMap[u['uni-id']].device] = []; } u.prettyID = u['uni-id'].split(":")[u['uni-id'].split(":").length - 1]; e.device2unis[$scope.unisMap[u['uni-id']].device].push(u); mapUniToService(u,e); }); } }); }); CpeuiSvc.getAllIpUniSubnets(function(raw_subnets){ var subnets ={} if (raw_subnets) { raw_subnets.forEach(function(sub) { if (subnets[sub["uni-id"]] == undefined) { subnets[sub["uni-id"]] = {}; } if (subnets[sub["uni-id"]][sub["ip-uni-id"]] == undefined) { subnets[sub["uni-id"]][sub["ip-uni-id"]] = []; } subnets[sub["uni-id"]][sub["ip-uni-id"]].push(sub); }); } $scope.subnets = subnets; }); }; $scope.doesAllUniHasService = function(ceUnis) { for (var i=0 ; i< ceUnis.length; ++i) { if (!ceUnis[i].hasService) { return false; } } return true; } $scope.title = function(str) { if (!str) { return str; } return str.split('-').map(function(s) { return s[0].toUpperCase() + s.slice(1); }).join(' '); } var evcTypes = { 'epl' : 'point-to-point', 'evpl' : 'point-to-point', 'eplan' : 'multipoint-to-multipoint', 'evplan' : 'multipoint-to-multipoint', 'eptree' : 'rooted-multipoint', 'evptree' : 'rooted-multipoint' } var addEvcController = function($scope, $mdDialog) { $scope.initObj = function(svc) { $scope.obj = angular.merge($scope.obj, svc); if (!$scope.obj.evc) { $scope.obj.evc = {}; } if (!$scope.obj.evc['max-svc-frame-size']){ $scope.obj.evc['max-svc-frame-size'] = 1522; } if (!$scope.obj.evc['mac-timeout']){ $scope.obj.evc['mac-timeout'] = 300; } } $scope.validate = function(form) { form.svc_type.$setTouched(); // patch because angular bug http://stackoverflow.com/questions/36138442/error-not-showing-for-angular-material-md-select console.log($scope); return form.$valid; }; }; $scope.editEvc = function($event, svc) { new CpeuiDialogs.Dialog('AddEvc', {}, function(obj) { obj['svc-id'] = svc['svc-id']; CpeuiSvc.addEvc(obj, evcTypes[obj['svc-type']], $scope.curTenant, function() { $scope.updateEvcView(); }); }, addEvcController).show($event, {svc:svc}); } $scope.openMenu = function($mdOpenMenu, ev) { originatorEv = ev; $mdOpenMenu(ev); }; $scope.evcDialog = new CpeuiDialogs.Dialog('AddEvc', {}, function(obj) { CpeuiSvc.addEvc(obj, evcTypes[obj.svc_type], $scope.curTenant, function() { $scope.updateEvcView(); }); }, addEvcController); $scope.changeProfile = function(svcId, svcType, uni, profile) { var uniKey = (svcType == 'evc') ? uni['uni-id'] : (uni['uni-id'] +'/' + uni['ip-uni-id']); CpeuiDialogs.customConfirm("Are you sure?", "This will change " + uniKey + " bandwidth profile.", function() { CpeuiSvc.changeUniProfile(svcId, svcType, uniKey, profile); },function() { uni.selectedProfile = uni['ingress-bw-profile'] }); } $scope.ipvcDialog = new CpeuiDialogs.Dialog('AddIpvc', {}, function(obj) { CpeuiSvc.addIpvc(obj, $scope.curTenant, function() { $scope.updateEvcView(); }); }); $scope.linkIpvcUniDialog = new CpeuiDialogs.Dialog('LinkIpvcUni', {}, function(obj) { CpeuiSvc.addIpUni(obj.uni['uni-id'], obj['ip-address'], obj.vlan, obj['segmentation-id'], function(ipUniId) { CpeuiSvc.addIpvcUni(obj.svc_id, obj.uni['uni-id'], ipUniId, obj.profile_name, function() { $scope.updateUnis($scope.updateEvcView); }); }); }); var ipUniDialogController = function($scope, $mdDialog) { $scope.hasVlans = false; if ($scope.params.uni['ip-unis'] && $scope.params.uni['ip-unis']['ip-uni']) { var ipunis = $scope.params.uni['ip-unis']['ip-uni']; for (i = 0; i < ipunis.length; i++) { if (ipunis[i].vlan){ $scope.hasVlans = true; } } } }; $scope.ipUniDialog = new CpeuiDialogs.Dialog('AddIpUni', {}, function(obj) { CpeuiSvc.addIpUni(obj['uni-id'], obj['ip-address'], obj.vlan, obj['segmentation-id'], function() { $scope.updateUnis(); }); }, ipUniDialogController); $scope.openIpUniDialog = function(event,uni){ if (uni['ip-unis'] && (uni['ip-unis']['ip-uni'] != undefined)){ var ipunis = uni['ip-unis']['ip-uni']; for (i = 0; i < ipunis.length; i++) { if (!ipunis[i].vlan){ CpeuiDialogs.alert("Error","You Can't have more then one ip-uni with no vlan. please remove the non-vlan ip-uni before adding new.") return; } } } $scope.ipUniDialog.show(event,{'uniid':uni['uni-id'], uni:uni}) } var staticRoutingController = function($scope, $mdDialog, params) { $scope.add = function(obj){ if ($scope.projectForm.$valid) { if (!obj.selectedUni.subnets) { obj.selectedUni.subnets = []; } obj.selectedUni.subnets.push({"subnet":obj.network,"gateway":obj.gateway}); if (!$scope.toAdd) { $scope.toAdd = []; } $scope.toAdd.push(obj); // reset form $scope.obj={}; $scope.projectForm.$setPristine(); $scope.projectForm.$setUntouched(); } }; $scope.removeSubnet = function(u,subnet) { if (!$scope.toRemove) { $scope.toRemove = []; } u.subnets = u.subnets.filter(s=>s!=subnet); $scope.toRemove.push({"uni":u, "subnet":subnet}); } $scope.done = function() { if (!$scope.toRemove && !$scope.toAdd) { $mdDialog.hide(); return; } CpeuiSvc.getAllIpUniSubnets(function(subnets){ if ($scope.toRemove) { $scope.toRemove.forEach(function(u){ subnets = subnets.filter(function(s) { if (s['uni-id'] != u.uni['uni-id']) { return true; } else if (s['ip-uni-id'] != u.uni['ip-uni-id']) { return true; } else if (s.subnet != u.subnet.subnet) { return true; } return false; }); }); } if ($scope.toAdd) { $scope.toAdd.forEach(function(added){ var u = added.selectedUni; subnets.push({ "ip-uni-id":u['ip-uni-id'], "subnet":added.network, "gateway":added.gateway, "uni-id":u['uni-id'], }); }); } CpeuiSvc.setAllSubnets(subnets, $scope.callback); }); $mdDialog.hide(); }; }; $scope.openRoutingDialog = function(ipvc) { if (ipvc.ipvc.unis && ipvc.ipvc.unis.uni) { ipvc.ipvc.unis.uni.forEach(function(u){ var mefUni = $scope.getMefInterfaceIpvc(u['uni-id'],u['ip-uni-id']); if (mefUni === undefined) { return; } u.ipAddress = mefUni['ip-address']; u.deviceName = $scope.cesDisplayNames[u.device]; if ($scope.subnets[u['uni-id']]) { u.subnets = $scope.subnets[u['uni-id']][u['ip-uni-id']]; } if (mefUni.vlan) { u.vlan = mefUni.vlan }; }); } new CpeuiDialogs.Dialog('StaticRouting', {"ipvc":ipvc, "subnets":angular.copy($scope.subnets)}, function() { $scope.updateEvcView(); }, staticRoutingController).show(); } var dhcpDialogController = function($scope, $mdDialog, params) { $scope.selectedNetworks = []; $scope.vrfid = params.vrfId; $scope._isAddingRow = false; $scope.selectAll = function(){ if (!$scope.isAllSelected()){ $scope.selectedNetworks = $scope.getAvailableNetwork(); } else { $scope.selectedNetworks = []; } }; $scope.isPartialSelected = function(){ return ($scope.selectedNetworks.length != 0) && ($scope.selectedNetworks.length != $scope.getAvailableNetwork().length); }; $scope.isAllSelected = function(){ return ($scope.selectedNetworks.length == $scope.getAvailableNetwork().length); }; $scope.updateEnabled = function() { $scope.selectedNetworks.forEach(function(subnet){ $scope.addDhcp(subnet); }); $scope.selectedNetworks = []; $('md-backdrop').click();// close md-select dropdown }; $scope.openStaticAssigment = function(subnet) { $scope.focusedSubnet = subnet; CpeuiSvc.getDhcpStaticAllocation($scope.vrfid, subnet.subnet, function(allocations) { $scope.subnetAllocations = allocations; $scope.dialogState = 'STATIC'; }); }; $scope.openMain = function() { $scope.dialogState = 'MAIN'; }; //confirmation $scope.confirmationMsg = null; $scope.okCallback = null; $scope.previousState = null; $scope.confirm = function(msg, okCallback) { $scope.confirmationMsg = msg; $scope.okCallback = okCallback; $scope.previousState = $scope.dialogState; $scope.dialogState = 'CONFIRM'; } $scope.back = function() { $scope.dialogState = $scope.previousState; } $scope.confirmed = function() { $scope.okCallback() $scope.dialogState = $scope.previousState; } $scope.updateDhcpData = function() { CpeuiSvc.getDhcp($scope.vrfid, function(dhcps){ $scope.dhcps = dhcps; //$scope.params.ipvcUnis = $scope.params.ipvcUnis.filter(x => $scope.dhcps[x.mefUni['ip-address']] == undefined); }); } $scope.getAvailableNetwork = function(){ if ($scope.dhcps !== undefined) { return $scope.params.ipvcUnis.filter(x => ($scope.dhcps[x.cidr] == undefined)); } else { return $scope.params.ipvcUnis; } } $scope.addDhcp = function(subnet) { CpeuiSvc.addDhcp($scope.vrfid, subnet.cidr, subnet.min ,subnet.max,function(){ // TODO find a way to getDhcp only once, after the last add $scope.updateDhcpData(); }); } $scope.removeDhcp = function(subnet) { $scope.confirm("This will delete this dhcp configuration",function(){ CpeuiSvc.removeDhcp($scope.vrfid, subnet, function(){ $scope.updateDhcpData(); }); }); }; $scope.isAddingRow = function() { return $scope._isAddingRow; } $scope.setAddingRow = function(val) { $scope._isAddingRow = val; } $scope.addAllocation = function(form, mac, ip) { if (form.$valid) { CpeuiSvc.addDhcpStaticAllocation($scope.vrfid, $scope.focusedSubnet.subnet, [[mac,ip]], function(){ CpeuiSvc.getDhcpStaticAllocation($scope.vrfid, $scope.focusedSubnet.subnet, function(allocations) { $scope.subnetAllocations = allocations; }); }); // reset form delete $scope.obj.mac; delete $scope.obj.ip; form.$setPristine(); form.$setUntouched(); $scope.setAddingRow(false); } } $scope.removeAllocation = function(subnet, mac) { $scope.confirm("Are you sure you want to remove this allocation?",function(){ CpeuiSvc.removeDhcpStaticAllocation($scope.vrfid, subnet, mac, function(){ CpeuiSvc.getDhcpStaticAllocation($scope.vrfid, subnet, function(allocations) { $scope.subnetAllocations = allocations; }); }); }); }; $scope.setDNS = function(primaryDns, secondaryDns) { for (var i in $scope.dhcps) { var allocPool = $scope.dhcps[i]; CpeuiSvc.setDHCPDnsServers($scope.vrfid, allocPool.subnet, primaryDns, secondaryDns, $scope.updateDhcpData); }; } $scope.updateDhcpData(); }; $scope.openDhcpDialog = function(ipvc) { CpeuiSvc.getServicesVrfId(ipvc['svc-id'],function(vrfId){ params = {ipvc:ipvc,ipvcUnis:[],vrfId:vrfId}; if (ipvc.ipvc.unis && ipvc.ipvc.unis.uni) { params.ipvcUnis = ipvc.ipvc.unis.uni.map(u => CpeUiUtils.getSubnetEdges($scope.getMefInterfaceIpvc(u['uni-id'],u['ip-uni-id'])['ip-address'])); } new CpeuiDialogs.Dialog('DHCP', params, function() { $scope.updateEvcView(); }, dhcpDialogController).show(); }); } $scope.ipUniSubnetDialog = new CpeuiDialogs.Dialog('AddIpUniSubnet', {}, function(obj) { CpeuiSvc.addIpUniSubnet(obj.uniid, obj.ipuniid, obj.subnet, obj.gateway, function() { if ($scope.subnets[obj.uniid] == undefined){ $scope.subnets[obj.uniid] = {}; } if ($scope.subnets[obj.uniid][obj.ipuniid] == undefined) { $scope.subnets[obj.uniid][obj.ipuniid] = []; } $scope.subnets[obj.uniid][obj.ipuniid].push({ "uni-id": obj.uniid, "ip-uni-id": obj.ipuniid, "subnet": obj.subnet, "gateway": obj.gateway }); }); }); $scope.deleteIpUni = function(uniid, ipuni_id) { CpeuiDialogs.confirm(function() { CpeuiSvc.deleteIpUni(uniid, ipuni_id, function() { $scope.updateEvcView(); // TODO update unis only }); }); }; $scope.deleteIpvcUni = function(svc_id, uni_id, ipuni_id) { CpeuiDialogs.confirm(function() { CpeuiSvc.deleteIpvcUni(svc_id, uni_id, ipuni_id, function() { $scope.updateEvcView(); }); }); }; $scope.getMefInterfaceIpvc = function(uni_id,ipuni_id){ var uni = $scope.unis.filterByField('uni-id',uni_id)[0]; if ((uni == undefined) || (uni['ip-unis'] == undefined) || (uni['ip-unis']['ip-uni'] == undefined)) { return undefined; } return uni['ip-unis']['ip-uni'].filterByField('ip-uni-id',ipuni_id)[0]; } $scope.deleteIpUniSubnet = function(uniid, ipuni_id, subnet) { CpeuiDialogs.confirm(function() { CpeuiSvc.deleteIpUniSubnet(uniid, ipuni_id, subnet, function() { $scope.updateEvcView(); // TODO update unis only }); }); }; $scope.deleteEvc = function(svcid) { CpeuiDialogs.confirm(function() { CpeuiSvc.removeEvc(svcid, function() { $scope.updateEvcView(); }); }); }; $scope.deleteEvcUni = function(svc_id, uni_id) { CpeuiDialogs.confirm(function() { CpeuiSvc.deleteEvcUni(svc_id, uni_id, function() { $scope.updateEvcView(); }); }); }; var linkEvcUniController = function($scope, $mdDialog, params) { $scope.params = params; $scope.obj = { vlans : [] }; $scope.deleteVlan = function(vlan) { $scope.obj.vlans.splice($scope.obj.vlans.indexOf(vlan), 1); }; $scope.addVlan = function(vlan) { if ($scope.obj.vlans.indexOf(vlan) == -1) { $scope.obj.vlans.push(vlan); console.log(vlan); } $('#vlan_input').val(undefined); }; $scope.filterUsedUnis = function(evc){ return function(u) { if (u.prettyID == 'br-int') { return false; } if (u.prettyID && u.prettyID.startsWith('tun')) { return false; } if (evc.evc == undefined || evc.evc.unis.uni == undefined){ return true; } return evc.evc.unis.uni.filterByField('uni-id',u['uni-id']).length == 0; }; }; }; $scope.linkEvcUniDialog = new CpeuiDialogs.Dialog('LinkEvcUni', {}, function(obj) { if (!obj.role) { obj.role = "root"; } CpeuiSvc.addEvcUni(obj.svc_id, obj.uni_id, obj.role, obj.vlans, obj.profile_name, function() { $scope.updateEvcView(); }); }, linkEvcUniController); var editVlanController = function($scope, $mdDialog, params) { $scope.params = params; $scope.deleteVlan = function(svc_id, uni_id, vlan, allvlans) { CpeuiSvc.deleteVlan(svc_id, uni_id, vlan, function() { allvlans.splice(allvlans.indexOf(vlan), 1) }); }; $scope.addVlan = function(svc_id, uni_id, vlan, allvlans) { if (allvlans == undefined) { allvlans = []; } if (allvlans.indexOf(vlan) == -1) { CpeuiSvc.addVlan(svc_id, uni_id, vlan, function() { allvlans.push(vlan); }); } $('#vlan_input').val(undefined); }; }; $scope.editVlanDialog = new CpeuiDialogs.Dialog('EditVlans', {}, undefined, editVlanController); $scope.sortUni = function(uni) { return uni['uni-id']; }; $scope.getKeys = function(obj){ var keys = []; for(var keyName in obj){ keys.push(keyName) } return keys; } $scope.sortCeFromId = function(ce) { return $scope.cesDisplayNames[ce]; }; $scope.isEmpty = function(obj){ return angular.equals({}, obj); } init(); }); });