function RootGbpCtrl($state, $rootScope, $scope, $filter, RootGbpService, TenantListService, TenantService, EpgListService, ResolvedPolicyService, NextTopologyService, EndpointsListService) {
/* properties */
- $scope.stateUrl = null;
+ $scope.apiType = 'operational';
+ $scope.endpoints = EndpointsListService.createList();
+ $scope.policyDisabled = true;
+ $scope.rootTenant = null;
+ $scope.rootTenants = TenantListService.createList();
+ $scope.resolvedPolicy = {};
+ $scope.selectedNode = {};
+ $scope.sidePanelObject = {};
$scope.sidePanelPage = false;
$scope.sidePanelPageEndpoint = false;
- $scope.sidePanelObject = {};
- $scope.rootTenant = TenantService.createObject();
- $scope.rootTenants = TenantListService.createList();
- $scope.policyDisabled = true;
+ $scope.stateUrl = null;
+ $scope.topologyData = {nodes: [], links: []};
$scope.viewPath = 'src/app/gbp/';
- $scope.selectedNode = {};
- $scope.apiType = 'operational';
- $scope.parentTenant = 'tenant-red';
- $scope.resolvedPolicy = {};
- $scope.endpoints = EndpointsListService.createList();
+
+ var resolvedPolicies = ResolvedPolicyService.createObject();
+ resolvedPolicies.get(fillTopologyData);
/* methods */
+ $scope.fillTopologyData = fillTopologyData;
$scope.broadcastFromRoot = broadcastFromRoot;
$scope.closeSidePanel = closeSidePanel;
$scope.openSidePanel = openSidePanel;
$scope.fadeAll = fadeAll;
RootGbpService.setMainClass();
- console.log('RootGbpCtrl initialized');
-
init();
-
- $scope.topologyData = {
- nodes: [],
- links: [],
- };
-
/* implementations */
+
/**
- * Sets '$scope.sidePanelPage' to false. This variable is watched in index.tpl.html template
- * and opens/closes side panel
+ *
+ * @param eventName
+ * @param val
*/
- function init() {
- $scope.rootTenants.clearData();
- $scope.rootTenants.get('config');
- }
-
function broadcastFromRoot(eventName, val) {
$scope.$broadcast(eventName, val);
}
- function setRootTenant() {
- $scope.broadcastFromRoot('ROOT_TENANT_CHANGED');
- enableButtons();
- }
-
+ /**
+ *
+ */
function closeSidePanel() {
$scope.sidePanelPage = false;
NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
}
/**
- * fills $scope.stateUrl with loaded url
- * It's called on $viewContentLoaded event
+ *
+ * @param arr
*/
- function setStateUrl() {
- $scope.stateUrl = $state.current.url;
+ function collapseAll(arr) {
+ arr.forEach(function(element) {
+ element.expanded = false;
+ });
}
/**
- * Sets '$scope.sidePanelPage' to true. This variable is watched in index.tpl.html template
- * and opens/closes side panel
+ *
+ * @param source
+ * @param target
+ * @param contract
+ * @param tenant
+ * @returns {{id: string, source: *, target: *, tenant: *}}
*/
- function openSidePanel(page, object, cbk) {
- if(object.constructor.name == 'Epg') {
- $scope.endpoints.clearData();
- $scope.endpoints.getByEpg(object.data.id);
- }
- var samePage = page === $scope.sidePanelPage;
+ function createLink( source, target, contract, tenant) {
+ return {
+ 'id': generateLinkId(contract, source, target),
+ 'source': source,
+ 'target': target,
+ 'tenant': tenant,
+ };
+ }
- $scope.selectedNode = object;
+ /**
+ *
+ * @param nodeName
+ * @param tenantId
+ * @returns {{id: *, tenantId: *, node-id: *, label: *}}
+ */
+ function createNode(nodeName, tenantId) {
+ return {
+ 'id': nodeName,
+ 'tenantId' : tenantId,
+ 'node-id': nodeName,
+ 'label': nodeName,
+ };
+ }
- $scope.sidePanelCbk = cbk;
- $scope.sidePanelPage = page;
- $scope.sidePanelObject = object;
+ /**
+ *
+ */
+ function deselectContract() {
+ NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
+ $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
- if ( samePage && $scope.sidePanelCbk) {
- $scope.sidePanelCbk();
- }
+ var obj = Object.keys($scope.resolvedPolicy).map(function(k) {
+ var obj = $scope.resolvedPolicy[k];
+ obj.linkId = k;
+
+ return obj;
+ });
+
+ $scope.sidePanelObject = obj;
+ $scope.selectedNode = null;
}
+ /**
+ *
+ */
function deselectEpg() {
NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
var elements;
$scope.sidePanelPage = 'resolved-policy/epg-sidepanel';
elements = EpgListService.createList();
- elements.get($scope.apiType, $scope.parentTenant);
+ elements.get($scope.apiType, $scope.rootTenant);
$scope.sidePanelObject = elements;
$scope.selectedNode = null;
}
- function deselectContract() {
- NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
- $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
-
- var obj = Object.keys($scope.resolvedPolicy).map(function(k) {
- var obj = $scope.resolvedPolicy[k];
- obj.linkId = k;
+ /**
+ *
+ */
+ function enableButtons() {
+ $scope.policyDisabled = false;
+ }
- return obj;
+ /**
+ *
+ * @param arr
+ */
+ function expandAll(arr) {
+ arr.forEach(function(element) {
+ element.expanded = true;
});
+ }
- $scope.sidePanelObject = obj;
- $scope.selectedNode = null;
+ /**
+ *
+ */
+ function fadeAll() {
+ NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
}
- function openSidePanelTpl(tpl) {
- switch(tpl) {
- case 'contract':
- $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
- break;
- case 'subject':
- $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
- break;
- case 'clause':
- $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
- break;
- case 'rule':
- $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
- break;
+ /**
+ *
+ * @param data
+ */
+ function fillResolvedPolicy(data) {
+ if(data['policy-rule-group-with-endpoint-constraints']) {
+ processPolicyRuleGroupWithEpConstraints(
+ data['policy-rule-group-with-endpoint-constraints'],
+ data['provider-epg-id'],
+ data['consumer-epg-id']);
}
+
}
- function openSidePanelContract(idElement) {
- var obj = $filter('filter')(Object.keys($scope.resolvedPolicy).map(function(k) {
- var obj = $scope.resolvedPolicy[k];
- obj.linkId = k;
+ /**
+ *
+ */
+ function fillTopologyData() {
+ var topoData = {nodes: [], links: [],},
+ filteredResolvedPolicies = $filter('filter')(resolvedPolicies.data, {'consumer-tenant-id': $scope.rootTenant, 'provider-tenant-id': $scope.rootTenant});
- return obj;
- }), {'contract-id': idElement});
- $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
- $scope.sidePanelObject = obj[0];
- $scope.selectedNode = obj[0];
+ filteredResolvedPolicies && filteredResolvedPolicies.forEach(function(rp) {
+ if(rp['consumer-tenant-id'] === $scope.rootTenant) {
+ topoData.nodes.push(createNode(rp['consumer-epg-id'], rp['consumer-tenant-id']));
+ }
+ topoData.nodes.push(createNode(rp['provider-epg-id'], rp['provider-tenant-id']));
- NextTopologyService.highlightLink($rootScope.nxTopology, obj[0].linkId);
+ fillResolvedPolicy(rp);
+ topoData.links = getContracts(rp);
+ });
+
+ $scope.topologyData = topoData;
+ $scope.topologyLoaded = true;
}
- function openSidePanelChild(index, type) {
- switch(type) {
- case 'subject':
- $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
- $scope.subjectIndex = index;
- break;
- case 'clause':
- $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
- $scope.clauseIndex = index;
- break;
- case 'rule':
- $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
- $scope.ruleIndex = index;
- break;
+ /**
+ *
+ * @param contractId
+ * @param providerEpgId
+ * @param consumerEpgId
+ * @returns {string}
+ */
+ function generateLinkId(contractId, providerEpgId, consumerEpgId) {
+ return contractId + '_' + providerEpgId + '_' + consumerEpgId;
+ }
+
+ /**
+ *
+ * @param data
+ * @returns {Array}
+ */
+ function getContracts(data) {
+ var retVal = [];
+
+ if( data['policy-rule-group-with-endpoint-constraints'] &&
+ data['policy-rule-group-with-endpoint-constraints'][0]['policy-rule-group']) {
+ data['policy-rule-group-with-endpoint-constraints'][0]['policy-rule-group'].forEach(function(prg) {
+ retVal.push(
+ createLink(
+ data['provider-epg-id'],
+ data['consumer-epg-id'],
+ prg['contract-id'],
+ prg['tenant-id']
+ )
+ )
+ });
}
+
+ return retVal;
}
+ /**
+ *
+ * @param obj
+ * @returns {*}
+ */
function getObjectsCount(obj) {
if(obj)
return Object.keys(obj).length;
return 0;
}
- function enableButtons() {
- $scope.policyDisabled = false;
+ /**
+ *
+ * @param node
+ */
+ function highlightNode(node) {
+ NextTopologyService.highlightNode($rootScope.nxTopology, node);
}
- function toggleExpanded(element) {
- if(typeof element !== 'string') {
- if(element.expanded)
- element.expanded = false;
- else
- element.expanded = true;
- }
+ /**
+ *
+ * @param link
+ */
+ function highlightLink(link) {
+ NextTopologyService.highlightLink($rootScope.nxTopology, link);
}
- function expandAll(arr) {
- arr.forEach(function(element) {
- element.expanded = true;
- });
+ /**
+ *
+ */
+ function init() {
+ $scope.rootTenants.clearData();
+ $scope.rootTenants.get('config');
}
- function collapseAll(arr) {
- arr.forEach(function(element) {
- element.expanded = false;
- });
- }
+ /**
+ * Sets '$scope.sidePanelPage' to true. This variable is watched in index.tpl.html template
+ * and opens/closes side panel
+ */
+ function openSidePanel(page, object, cbk) {
+ if(object.constructor.name == 'Epg') {
+ $scope.endpoints.clearData();
+ $scope.endpoints.getByEpg(object.data.id);
+ }
+ var samePage = page === $scope.sidePanelPage;
- var resolvedPolicies = ResolvedPolicyService.createObject();
- resolvedPolicies.get(function () {
- fillTopologyData();
- });
+ $scope.selectedNode = object;
- function fillTopologyData() {
- var topoData = {nodes: [], links: [],};
+ $scope.sidePanelCbk = cbk;
+ $scope.sidePanelPage = page;
+ $scope.sidePanelObject = object;
- resolvedPolicies.data.forEach(function(rp) {
- topoData.nodes.push(createNode(rp['consumer-epg-id'], rp['consumer-tenant-id']));
- topoData.nodes.push(createNode(rp['provider-epg-id'], rp['provider-tenant-id']));
+ if ( samePage && $scope.sidePanelCbk) {
+ $scope.sidePanelCbk();
+ }
+ }
- fillResolvedPolicy(rp);
- topoData.links = getContracts(rp);
- });
+ /**
+ *
+ * @param idElement
+ */
+ function openSidePanelContract(idElement) {
+ var obj = $filter('filter')(Object.keys($scope.resolvedPolicy).map(function(k) {
+ var obj = $scope.resolvedPolicy[k];
+ obj.linkId = k;
- $scope.topologyData = topoData;
- $scope.topologyLoaded = true;
+ return obj;
+ }), {'contract-id': idElement});
+
+ $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
+ $scope.sidePanelObject = obj[0];
+ $scope.selectedNode = obj[0];
+
+ NextTopologyService.highlightLink($rootScope.nxTopology, obj[0].linkId);
}
- function fillResolvedPolicy(data) {
- if(data['policy-rule-group-with-endpoint-constraints']) {
- processPolicyRuleGroupWithEpConstraints(
- data['policy-rule-group-with-endpoint-constraints'],
- data['provider-epg-id'],
- data['consumer-epg-id']);
+ /**
+ * .
+ * @param index
+ * @param type
+ */
+ function openSidePanelChild(index, type) {
+ switch(type) {
+ case 'subject':
+ $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
+ $scope.subjectIndex = index;
+ break;
+ case 'clause':
+ $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
+ $scope.clauseIndex = index;
+ break;
+ case 'rule':
+ $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
+ $scope.ruleIndex = index;
+ break;
}
+ }
+ /**
+ *
+ * @param tpl
+ */
+ function openSidePanelTpl(tpl) {
+ switch(tpl) {
+ case 'contract':
+ $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
+ break;
+ case 'subject':
+ $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
+ break;
+ case 'clause':
+ $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
+ break;
+ case 'rule':
+ $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
+ break;
+ }
}
+ /**
+ *
+ * @param data
+ * @param providerEpgId
+ * @param consumerEpgId
+ */
function processPolicyRuleGroupWithEpConstraints(data, providerEpgId, consumerEpgId) {
data.forEach(function(element) {
element['policy-rule-group'].forEach(function(el) {
})
}
- function generateLinkId(contractId, providerEpgId, consumerEpgId) {
- return contractId + '_' + providerEpgId + '_' + consumerEpgId;
- }
-
- function createNode(nodeName, tenantId) {
- return {
- 'id': nodeName,
- 'tenantId' : tenantId,
- 'node-id': nodeName,
- 'label': nodeName,
- };
- }
-
- function createLink( source, target, contract, tenant) {
- return {
- 'id': generateLinkId(contract, source, target),
- 'source': source,
- 'target': target,
- 'tenant': tenant,
- };
- }
-
- function getContracts(data) {
- var retVal = [];
+ /**
+ *
+ */
+ function setRootTenant() {
+ $scope.broadcastFromRoot('ROOT_TENANT_CHANGED');
- if( data['policy-rule-group-with-endpoint-constraints'] &&
- data['policy-rule-group-with-endpoint-constraints'][0]['policy-rule-group']) {
- data['policy-rule-group-with-endpoint-constraints'][0]['policy-rule-group'].forEach(function(prg) {
- retVal.push(
- createLink(
- data['provider-epg-id'],
- data['consumer-epg-id'],
- prg['contract-id'],
- prg['tenant-id']
- )
- )
- });
+ if($scope.stateUrl.startsWith('/resolved-policy')) {
+ fillTopologyData();
}
-
- return retVal;
}
- function highlightNode(node) {
- NextTopologyService.highlightNode($rootScope.nxTopology, node);
- }
+ /**
+ * fills $scope.stateUrl with loaded url
+ * It's called on $viewContentLoaded event
+ */
+ function setStateUrl() {
+ $scope.stateUrl = $state.current.url;
+ closeSidePanel();
- function highlightLink(link) {
- NextTopologyService.highlightLink($rootScope.nxTopology, link);
+ if($scope.stateUrl.startsWith('/resolved-policy')) {
+ fillTopologyData();
+ }
}
- function fadeAll() {
- NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
+ /**
+ *
+ * @param element
+ */
+ function toggleExpanded(element) {
+ if(typeof element !== 'string') {
+ if(element.expanded)
+ element.expanded = false;
+ else
+ element.expanded = true;
+ }
}
/* event listeners */
* Event fired after content loaded, setStateUrl function is called to fill stateUrl method
*/
$scope.$on('$viewContentLoaded', setStateUrl);
-
- // $scope.$watch('nxTopology', function() {
- // $rootScope.nxTopology = $scope.nxTopology;
- // });
}
});
selectedItem: null,
searchText: null,
};
- $scope.epgsListOfChoosenTenant = null;
+ $scope.epgsListOfChoosenTenant = [];
$scope.forwarding = ForwardingService.createObject();
$scope.forwardingContexts = [];
$scope.forwardingNetworkDomainIds = [];
+ $scope.regexps = {
+ 'ipv4cidr': '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))',
+ 'ipv6cidr': 's*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))',
+ 'mac-address': '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})',
+ };
+
+ $scope.regexps['ip-prefix'] = '(('+$scope.regexps.ipv4cidr + ')|(' + $scope.regexps.ipv6cidr + '))';
/* methods */
$scope.closeDialog = closeDialog;
$scope.filterContextIds = filterContextIds;
$scope.filterNetworkDomainIds = filterNetworkDomainIds;
$scope.searchEpgs = searchEpgs;
-
-
- $scope.forwarding.get(function () {
- var tenantForwarding = $filter('filter')($scope.forwarding.data, { 'tenant-id': $scope.parentTenant });
-
- if (tenantForwarding && tenantForwarding.length) {
- $scope.forwarding.data = tenantForwarding[0];
- $scope.filterNetworkDomainIds('l2-l3-forwarding:subnet');
- }
-
- if ($scope.endpoint && $scope.endpoint.data['context-type']) {
- $scope.filterContextIds($scope.endpoint.data['context-type']);
- }
- });
-
-
-
- populateEpgsListOfChoosenTenant();
+ $scope.populateScopeAfterTenantSelected = populateScopeAfterTenantSelected;
/* Implementations */
+ $scope.forwarding.get(postForwardingGet);
function closeDialog(){
$mdDialog.cancel();
function filterNetworkDomainIds(networkDomainType) {
$scope.forwardingNetworkDomainIds = $filter('filter')($scope.forwarding.data['network-domain'], {'network-domain-type': networkDomainType});
- $scope.forwardingNetworkDomainIds.unshift('');
}
function populateEpgsListOfChoosenTenant() {
- var tenantsIdsList = $scope.rootTenants.data.map(function (e) { return e.data.id; }),
- indexOfChoosenTenant = tenantsIdsList.indexOf($scope.parentTenant),
- epgsObjectsOfChoosenTenant = $scope.rootTenants.data[indexOfChoosenTenant].data.policy['endpoint-group'];
- $scope.epgsListOfChoosenTenant = epgsObjectsOfChoosenTenant.map(function (a) { return a.id; });
+ $scope.rootTenants.data.some(function (tenant) {
+ if (tenant.data.id === $scope.endpoint.data.tenant) {
+ $scope.epgsListOfChoosenTenant = tenant.data.policy['endpoint-group'].map(function (ele) { return ele.id; } );
+ }
+ });
}
function searchEpgs(query) {
};
}
+ function postForwardingGet() {
+ var tenantForwarding = $filter('filter')($scope.forwarding.data, { 'tenant-id': $scope.endpoint.data.tenant });
+
+ if (tenantForwarding && tenantForwarding.length) {
+ $scope.forwarding.data = tenantForwarding[0];
+ $scope.filterNetworkDomainIds('l2-l3-forwarding:subnet');
+ }
+
+ if ($scope.endpoint && $scope.endpoint.data['context-type']) {
+ $scope.filterContextIds($scope.endpoint.data['context-type']);
+ }
+ }
+
+ function populateScopeAfterTenantSelected() {
+ populateEpgsListOfChoosenTenant();
+ }
}
});