2 'app/gbp/common/gbp.service',
3 'app/gbp/resolved-policy/resolved-policy-list.service',
4 'app/gbp/endpoints/sxp-mapping-list.service'
8 angular.module('app.gbp').controller('RootGbpCtrl', RootGbpCtrl);
10 RootGbpCtrl.$inject = ['$filter', '$mdDialog', '$rootScope', '$scope', '$state',
11 'EndpointsListService', 'NextTopologyService', 'ResolvedPolicyListService', 'RootGbpService',
12 'TenantListService', 'SxpMappingListService'];
14 function RootGbpCtrl($filter, $mdDialog, $rootScope, $scope, $state,
15 EndpointsListService, NextTopologyService, ResolvedPolicyListService, RootGbpService,
16 TenantListService, SxpMappingListService) {
18 $scope.apiType = 'operational';
19 $scope.activeObject = null;
20 $scope.endpoints = EndpointsListService.createList();
21 $scope.endpointSgtList = SxpMappingListService.createList();
22 $scope.rootTenant = null;
23 $scope.rootTenants = TenantListService.createList();
24 $scope.resolvedPolicy = {};
25 $scope.selectedNode = {};
26 $scope.sidePanelObject = {};
27 $scope.sidePanelPage = false;
28 $scope.sidePanelPageEndpoint = false;
29 $scope.stateUrl = null;
30 $scope.topologyData = { nodes: [], links: [] };
31 $scope.viewPath = 'src/app/gbp/';
33 var resolvedPolicies = ResolvedPolicyListService.createList();
34 getResolvedPolicies();
37 $scope.broadcastFromRoot = broadcastFromRoot;
38 $scope.closeSidePanel = closeSidePanel;
39 $scope.openSfcDialog = openSfcDialog;
40 $scope.openSidePanel = openSidePanel;
41 $scope.setRootTenant = setRootTenant;
42 $scope.toggleExpanded = toggleExpanded;
43 $scope.openSidePanelContract = openSidePanelContract;
44 $scope.openSidePanelChild = openSidePanelChild;
45 $scope.deselectEpg = deselectEpg;
46 $scope.deselectContract = deselectContract;
47 $scope.openSidePanelTpl = openSidePanelTpl;
48 $scope.getObjectsCount = getObjectsCount;
49 $scope.expandAll = expandAll;
50 $scope.collapseAll = collapseAll;
51 $scope.highlightNode = highlightNode;
52 $scope.highlightLink = highlightLink;
53 $scope.fadeAll = fadeAll;
54 $scope.rootOpenEndpointDialog = rootOpenEndpointDialog;
55 $scope.rootDeleteEndpointDialog = rootDeleteEndpointDialog;
56 $scope.getEndpointsList = getEndpointsList;
58 RootGbpService.setMainClass();
68 function broadcastFromRoot(eventName, val) {
69 $scope.$broadcast(eventName, val);
75 function closeSidePanel() {
76 if($scope.sidePanelPage) {
77 $scope.sidePanelPage = false;
86 function collapseAll(arr) {
87 arr.forEach(function (element) {
88 element.expanded = false;
98 * @returns {{id: string, source: *, target: *, tenant: *}}
100 function createLink( linkId) {
101 var linkIdParts = linkId.split('_');
104 'source': linkIdParts[1],
105 'target': linkIdParts[2],
106 'tenant': $scope.rootTenant
116 function createNode(nodeName) {
119 'tenantId': $scope.rootTenant,
128 function deselectContract() {
130 $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
132 $scope.sidePanelObject = Object.keys($scope.resolvedPolicy.contracts).map(function (k) {
133 var ob = $scope.resolvedPolicy.contracts[k];
139 $scope.selectedNode = null;
140 $scope.activeObject = 'contract';
146 function deselectEpg() {
148 $scope.sidePanelPage = 'resolved-policy/epg-sidepanel';
150 $scope.sidePanelObject = Object.keys($scope.resolvedPolicy.epgs).map(function (k) {
151 var ob = $scope.resolvedPolicy.epgs[k];
156 $scope.selectedNode = null;
157 $scope.activeObject = 'epg';
164 function expandAll(arr) {
165 arr.forEach(function (element) {
166 element.expanded = true;
174 $rootScope.nxTopology && NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
178 * reads resolvedPolicies list, prepares nodes and links for topology and fills them
180 function fillTopologyData() {
181 var tempTopoData = {nodes: [], links: []};
183 $scope.resolvedPolicy = resolvedPolicies.aggregateResolvedPolicies();
184 console.log('resolved and aggregated', $scope.resolvedPolicy);
186 tempTopoData.nodes = Object.keys($scope.resolvedPolicy.epgs).map(function (key) {
187 return createNode(key);
190 tempTopoData.links = Object.keys($scope.resolvedPolicy.contracts).map(function (key) {
191 return createLink(key);
194 $scope.topologyData = tempTopoData;
195 $scope.topologyLoaded = true;
203 function getObjectsCount(obj) {
205 return Object.keys(obj).length;
210 function getResolvedPolicies() {
211 if($scope.rootTenant) {
212 resolvedPolicies.get($scope.rootTenant, fillTopologyData);
220 function highlightNode(node) {
221 NextTopologyService.highlightNode($rootScope.nxTopology, node);
228 function highlightLink(link) {
229 NextTopologyService.highlightLink($rootScope.nxTopology, link);
236 $scope.rootTenants.clearData();
237 $scope.rootTenants.get('config');
238 $state.go('main.gbp.index.resolvedPolicy');
239 $scope.endpointSgtList.get();
246 function openSfcDialog(chainName) {
248 clickOutsideToClose: true,
249 controller: 'SfcTopologyController',
251 templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
252 parent: angular.element(document.body),
262 * Sets '$scope.sidePanelPage' to true. This variable is watched in index.tpl.html template
263 * and opens/closes side panel
265 function openSidePanel(page, object, cbk) {
266 var samePage = page === $scope.sidePanelPage;
268 $scope.selectedNode = object;
270 $scope.sidePanelCbk = cbk;
271 $scope.sidePanelPage = page;
272 $scope.sidePanelObject = object;
274 if ( samePage && $scope.sidePanelCbk) {
275 $scope.sidePanelCbk();
283 function openSidePanelContract(idElement) {
284 var obj = $filter('filter')(Object.keys($scope.resolvedPolicy.contracts).map(function (k) {
285 var obj = $scope.resolvedPolicy.contracts[k];
289 }), { 'contract-id': idElement });
291 $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
292 $scope.sidePanelObject = obj[0];
293 $scope.selectedNode = obj[0];
294 $scope.activeObject = 'contract';
296 NextTopologyService.highlightLink($rootScope.nxTopology, obj[0].linkId);
304 function openSidePanelChild(index, type) {
307 $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
308 $scope.subjectIndex = index;
311 $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
312 $scope.clauseIndex = index;
315 $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
316 $scope.ruleIndex = index;
325 function openSidePanelTpl(tpl) {
328 $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
331 $scope.sidePanelPage = 'resolved-policy/subject-sidepanel';
334 $scope.sidePanelPage = 'resolved-policy/clause-sidepanel';
337 $scope.sidePanelPage = 'resolved-policy/rule-sidepanel';
345 function setRootTenant() {
346 $scope.broadcastFromRoot('ROOT_TENANT_CHANGED');
348 if ($scope.stateUrl.startsWith('/resolved-policy')) {
349 getResolvedPolicies()
350 if($scope.sidePanelPage) {
351 if($scope.activeObject == 'epg')
353 else if($scope.activeObject == 'contract')
360 * fills $scope.stateUrl with loaded url
361 * It's called on $viewContentLoaded event
363 function setStateUrl() {
364 $scope.stateUrl = $state.current.url;
367 if ($scope.stateUrl.startsWith('/resolved-policy')) {
368 getResolvedPolicies()
376 function toggleExpanded(element) {
377 if (typeof element !== 'string') {
378 element.expanded = !element.expanded;
382 function rootOpenEndpointDialog(operation, endpointData) {
383 $scope.disableKeyFieldsEditing = operation === 'edit';
385 clickOutsideToClose: true,
386 controller: 'AddEndpointController',
388 templateUrl: $scope.viewPath + 'endpoints/dialog-add-endpoint.tpl.html',
389 parent: angular.element(document.body),
392 endpoint: endpointData
397 function rootDeleteEndpointDialog(endpointData) {
398 var confirm = $mdDialog.confirm()
399 .title('Delete endpoint')
400 .textContent('Do you want to delete endpoint?')
404 $mdDialog.show(confirm).then(function () {
405 endpointData.deleteEndpoint(function () {
413 function getEndpointsList() {
414 $scope.endpoints.clearData();
415 $scope.endpoints.getByEpg($scope.selectedNode.data.id);
417 /* event listeners */
419 * Event fired after content loaded, setStateUrl function is called to fill stateUrl method
421 $scope.$on('$viewContentLoaded', setStateUrl);