1 define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.service'], function () {
4 angular.module('app.gbp').controller('RootGbpCtrl', RootGbpCtrl);
6 RootGbpCtrl.$inject = ['$state', '$rootScope', '$scope', '$filter', '$mdDialog', 'RootGbpService',
7 'TenantListService', 'EpgListService', 'ResolvedPolicyService', 'NextTopologyService', 'EndpointsListService'];
9 function RootGbpCtrl($state, $rootScope, $scope, $filter, $mdDialog, RootGbpService,
10 TenantListService, EpgListService, ResolvedPolicyService, NextTopologyService, EndpointsListService) {
12 $scope.apiType = 'operational';
13 $scope.activeObject = null;
14 $scope.endpoints = EndpointsListService.createList();
15 $scope.rootTenant = null;
16 $scope.rootTenants = TenantListService.createList();
17 $scope.resolvedPolicy = {};
18 $scope.selectedNode = {};
19 $scope.sidePanelObject = {};
20 $scope.sidePanelPage = false;
21 $scope.sidePanelPageEndpoint = false;
22 $scope.stateUrl = null;
23 $scope.topologyData = {nodes: [], links: []};
24 $scope.viewPath = 'src/app/gbp/';
26 var resolvedPolicies = ResolvedPolicyService.createObject();
27 resolvedPolicies.get(fillTopologyData);
30 $scope.fillTopologyData = fillTopologyData;
31 $scope.broadcastFromRoot = broadcastFromRoot;
32 $scope.closeSidePanel = closeSidePanel;
33 $scope.openSfcDialog = openSfcDialog;
34 $scope.openSidePanel = openSidePanel;
35 $scope.setRootTenant = setRootTenant;
36 $scope.toggleExpanded = toggleExpanded;
37 $scope.openSidePanelContract = openSidePanelContract;
38 $scope.openSidePanelChild = openSidePanelChild;
39 $scope.deselectEpg = deselectEpg;
40 $scope.deselectContract = deselectContract;
41 $scope.openSidePanelTpl = openSidePanelTpl;
42 $scope.getObjectsCount = getObjectsCount;
43 $scope.expandAll = expandAll;
44 $scope.collapseAll = collapseAll;
45 $scope.highlightNode = highlightNode;
46 $scope.highlightLink = highlightLink;
47 $scope.fadeAll = fadeAll;
48 $scope.rootOpenEndpointDialog = rootOpenEndpointDialog;
49 $scope.rootDeleteEndpointDialog = rootDeleteEndpointDialog;
50 $scope.getEndpointsList = getEndpointsList;
52 RootGbpService.setMainClass();
62 function broadcastFromRoot(eventName, val) {
63 $scope.$broadcast(eventName, val);
69 function closeSidePanel() {
70 if($scope.sidePanelPage) {
71 $scope.sidePanelPage = false;
80 function collapseAll(arr) {
81 arr.forEach(function(element) {
82 element.expanded = false;
92 * @returns {{id: string, source: *, target: *, tenant: *}}
94 function createLink( source, target, contract, tenant) {
96 'id': generateLinkId(contract, source, target),
107 * @returns {{id: *, tenantId: *, node-id: *, label: *}}
109 function createNode(nodeName, tenantId) {
112 'tenantId' : tenantId,
121 function deselectContract() {
123 $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
125 var obj = Object.keys($scope.resolvedPolicy).map(function(k) {
126 var obj = $scope.resolvedPolicy[k];
132 $scope.sidePanelObject = obj;
133 $scope.selectedNode = null;
134 $scope.activeObject = 'contract';
140 function deselectEpg() {
144 $scope.sidePanelPage = 'resolved-policy/epg-sidepanel';
145 elements = EpgListService.createList();
146 elements.get($scope.apiType, $scope.rootTenant);
147 $scope.sidePanelObject = elements;
148 $scope.selectedNode = null;
149 $scope.activeObject = 'epg';
156 function expandAll(arr) {
157 arr.forEach(function(element) {
158 element.expanded = true;
166 $rootScope.nxTopology && NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
173 function fillResolvedPolicy(data) {
174 if(data['policy-rule-group-with-endpoint-constraints']) {
175 processPolicyRuleGroupWithEpConstraints(
176 data['policy-rule-group-with-endpoint-constraints'],
177 data['provider-epg-id'],
178 data['consumer-epg-id']);
186 function fillTopologyData() {
187 if($scope.rootTenant) {
188 var topoData = {nodes: [], links: [],},
189 filteredResolvedPolicies = $filter('filter')(resolvedPolicies.data, {
190 'consumer-tenant-id': $scope.rootTenant,
191 'provider-tenant-id': $scope.rootTenant
195 filteredResolvedPolicies && filteredResolvedPolicies.forEach(function(rp) {
196 if(rp['consumer-tenant-id'] === $scope.rootTenant) {
197 topoData.nodes.push(createNode(rp['consumer-epg-id'], rp['consumer-tenant-id']));
199 topoData.nodes.push(createNode(rp['provider-epg-id'], rp['provider-tenant-id']));
201 fillResolvedPolicy(rp);
202 topoData.links = getContracts(rp);
205 $scope.topologyData = topoData;
206 $scope.topologyLoaded = true;
213 * @param providerEpgId
214 * @param consumerEpgId
217 function generateLinkId(contractId, providerEpgId, consumerEpgId) {
218 return contractId + '_' + providerEpgId + '_' + consumerEpgId;
226 function getContracts(data) {
229 if( data['policy-rule-group-with-endpoint-constraints'] &&
230 data['policy-rule-group-with-endpoint-constraints'][0]['policy-rule-group']) {
231 data['policy-rule-group-with-endpoint-constraints'][0]['policy-rule-group'].forEach(function(prg) {
234 data['provider-epg-id'],
235 data['consumer-epg-id'],
251 function getObjectsCount(obj) {
253 return Object.keys(obj).length;
262 function highlightNode(node) {
263 NextTopologyService.highlightNode($rootScope.nxTopology, node);
270 function highlightLink(link) {
271 NextTopologyService.highlightLink($rootScope.nxTopology, link);
278 $scope.rootTenants.clearData();
279 $scope.rootTenants.get('config');
286 function openSfcDialog(chainName) {
288 clickOutsideToClose: true,
289 controller: 'SfcTopologyController',
291 templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
292 parent: angular.element(document.body),
295 chainName: chainName,
302 * Sets '$scope.sidePanelPage' to true. This variable is watched in index.tpl.html template
303 * and opens/closes side panel
305 function openSidePanel(page, object, cbk) {
306 if(object.constructor.name == 'Epg') {
307 $scope.endpoints.clearData();
308 $scope.endpoints.getByEpg(object.data.id);
309 $scope.activeObject = 'epg';
312 $scope.activeObject = 'contract';
314 var samePage = page === $scope.sidePanelPage;
316 $scope.selectedNode = object;
318 $scope.sidePanelCbk = cbk;
319 $scope.sidePanelPage = page;
320 $scope.sidePanelObject = object;
322 if ( samePage && $scope.sidePanelCbk) {
323 $scope.sidePanelCbk();
331 function openSidePanelContract(idElement) {
332 var obj = $filter('filter')(Object.keys($scope.resolvedPolicy).map(function(k) {
333 var obj = $scope.resolvedPolicy[k];
337 }), {'contract-id': idElement});
339 $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
340 $scope.sidePanelObject = obj[0];
341 $scope.selectedNode = obj[0];
342 $scope.activeObject = 'contract';
344 NextTopologyService.highlightLink($rootScope.nxTopology, obj[0].linkId);
352 function openSidePanelChild(index, type) {
355 $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
356 $scope.subjectIndex = index;
359 $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
360 $scope.clauseIndex = index;
363 $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
364 $scope.ruleIndex = index;
373 function openSidePanelTpl(tpl) {
376 $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
379 $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
382 $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
385 $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
393 * @param providerEpgId
394 * @param consumerEpgId
396 function processPolicyRuleGroupWithEpConstraints(data, providerEpgId, consumerEpgId) {
397 data.forEach(function(element) {
398 element['policy-rule-group'].forEach(function(el) {
399 var linkId = generateLinkId(el['contract-id'], providerEpgId, consumerEpgId);
401 $scope.resolvedPolicy = {};
403 if(!$scope.resolvedPolicy.hasOwnProperty(linkId)) {
404 $scope.resolvedPolicy[linkId] = {
405 'contract-id': el['contract-id'],
410 if(!$scope.resolvedPolicy[linkId].subjects.hasOwnProperty(el['subject-name'])) {
411 $scope.resolvedPolicy[linkId].subjects[el['subject-name']] = {'resolved-rule': []};
414 $scope.resolvedPolicy[linkId].subjects[el['subject-name']]['resolved-rule'].push(el['resolved-rule']);
422 function setRootTenant() {
423 $scope.broadcastFromRoot('ROOT_TENANT_CHANGED');
425 if($scope.stateUrl.startsWith('/resolved-policy')) {
427 if($scope.sidePanelPage) {
428 if($scope.activeObject == 'epg')
430 else if($scope.activeObject == 'contract')
437 * fills $scope.stateUrl with loaded url
438 * It's called on $viewContentLoaded event
440 function setStateUrl() {
441 $scope.stateUrl = $state.current.url;
444 if($scope.stateUrl.startsWith('/resolved-policy')) {
453 function toggleExpanded(element) {
454 if(typeof element !== 'string') {
456 element.expanded = false;
458 element.expanded = true;
462 function rootOpenEndpointDialog(operation, endpointData) {
463 $scope.disableKeyFieldsEditing = operation === 'edit';
465 clickOutsideToClose: true,
466 controller: 'AddEndpointController',
468 templateUrl: $scope.viewPath + 'endpoints/dialog-add-endpoint.tpl.html',
469 parent: angular.element(document.body),
472 endpoint: endpointData,
477 function rootDeleteEndpointDialog(endpointData) {
478 var confirm = $mdDialog.confirm()
479 .title('Delete endpoint')
480 .textContent('Do you want to delete endpoint?')
484 $mdDialog.show(confirm).then(function () {
485 endpointData.deleteEndpoint(function () {
493 function getEndpointsList() {
494 $scope.endpoints.clearData();
495 $scope.endpoints.getByEpg($scope.selectedNode.data.id);
498 /* event listeners */
500 * Event fired after content loaded, setStateUrl function is called to fill stateUrl method
502 $scope.$on('$viewContentLoaded', setStateUrl);