Sidepanel - templates, controllers
[groupbasedpolicy.git] / groupbasedpolicy-ui / module / src / main / resources / gbp / resolved-policy / resolved-policy-list.service.js
index 0d724089b86cd956c17978c6811b90550edb4551..84f57d455b2074062bc9a252becd0c4dbc6befaa 100644 (file)
@@ -8,7 +8,6 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
     function ResolvedPolicyListService($filter, Restangular, ResolvedPolicyService) {
         /* methods */
         this.createList = createList;
-        this.generateLinkId = generateLinkId;
 
 
         function ResolvedPolicyList() {
@@ -29,26 +28,36 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
             function setData(data) {
                 var self = this;
 
-                data && data.forEach(function (dataElement) {
-                    self.data.push(ResolvedPolicyList.createObject(dataElement));
-                });
+                if (data) {
+                    data.forEach(function (dataElement) {
+                        self.data.push(ResolvedPolicyService.createObject(dataElement));
+                    });
+                }
             }
 
+            /**
+             * Clears data property of ResolvedPolicyList object
+             */
             function clearData() {
                 var self = this;
                 self.data = [];
             }
 
+            /**
+             * Reads data from operational datastore and filters it by tenant property if available
+             * @param tenant
+             * @param successCallback
+             */
             function get(tenant, successCallback) {
                 var self = this;
 
                 var restObj = Restangular.one('restconf').one('operational').one('resolved-policy:resolved-policies');
 
-                return restObj.get().then(function(data) {
-                    if(tenant) {
+                return restObj.get().then(function (data) {
+                    if (tenant) {
                         self.data = $filter('filter')(data['resolved-policies']['resolved-policy'], {
                             'consumer-tenant-id': tenant,
-                            'provider-tenant-id': tenant
+                            'provider-tenant-id': tenant,
                         });
                     }
                     else {
@@ -59,15 +68,19 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
                 });
             }
 
+            /**
+             * Process resolved policies and returns object with epgs and contracts properties
+             * @returns {{epgs: {}, contracts: {}}}
+             */
             function aggregateResolvedPolicies() {
                 var self = this,
-                    result = {epgs: {}, contracts: {}};
+                    result = { epgs: {}, contracts: {} };
 
-                self.data.forEach(function(rp) {
+                self.data.forEach(function (rp) {
                     processEpg(result, rp, 'consumer');
                     processEpg(result, rp, 'provider');
 
-                    if(rp.hasOwnProperty('policy-rule-group-with-endpoint-constraints')) {
+                    if (rp.hasOwnProperty('policy-rule-group-with-endpoint-constraints')) {
                         processConstraints(
                             result,
                             rp['policy-rule-group-with-endpoint-constraints'],
@@ -81,11 +94,17 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
 
             }
 
+            /**
+             * Checks if exists object in returnValue.epgs and if not, creates one
+             * @param returnValue
+             * @param resolvedPolicyItem
+             * @param type
+             */
             function processEpg(returnValue, resolvedPolicyItem, type) {
-                if(!returnValue.epgs.hasOwnProperty(resolvedPolicyItem[type+'-epg-id'])) {
-                    returnValue.epgs[resolvedPolicyItem[type+'-epg-id']] = {
-                        'provided-contracts' : [],
-                        'consumed-contracts':[]
+                if (!returnValue.epgs.hasOwnProperty(resolvedPolicyItem[type + '-epg-id'])) {
+                    returnValue.epgs[resolvedPolicyItem[type + '-epg-id']] = {
+                        'provided-contracts': [],
+                        'consumed-contracts': [],
                     };
                 }
 
@@ -93,18 +112,25 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
 
             }
 
+            /**
+             * Process policy-rule-group-with-endpoint-constraints from resolved-policy.
+             * Creates contracts and updates epgs with contract objects
+             * @param returnValue
+             * @param constraints
+             * @param providerEpgId
+             * @param consumerEpgId
+             */
             function processConstraints(returnValue, constraints, providerEpgId, consumerEpgId) {
                 constraints.forEach(function (element) {
                     element['policy-rule-group'].forEach(function (el) {
                         var linkId = generateLinkId(el['contract-id'], providerEpgId, consumerEpgId);
 
-                        updateEpg(returnValue, el['contract-id'], providerEpgId, 'provided');
-                        updateEpg(returnValue, el['contract-id'], consumerEpgId, 'consumed');
-
                         if (!returnValue.contracts.hasOwnProperty(linkId)) {
                             returnValue.contracts[linkId] = {
                                 'contract-id': el['contract-id'],
-                                'subjects': {}
+                                'linkId': linkId,
+                                'subjects': {},
+                                'type': '',
                             };
                         }
 
@@ -112,29 +138,65 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
                             returnValue.contracts[linkId].subjects[el['subject-name']] = { 'resolved-rule': [] };
                         }
 
-                        returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'].push(el['resolved-rule']);
+                        returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'] =
+                            returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'].concat(el['resolved-rule']);
+
+                        Object.keys(returnValue.contracts[linkId].subjects).forEach(function(key) {
+                            returnValue.contracts[linkId].type =
+                                getContractType(returnValue.contracts[linkId].subjects[key]) ? 'chain' : 'allow';
+                        })
+
+                        updateEpg(returnValue, returnValue.contracts[linkId], providerEpgId, 'provided');
+                        updateEpg(returnValue, returnValue.contracts[linkId], consumerEpgId, 'consumed');
                     });
                 });
             }
 
-            function updateEpg(returnValue, contractId, epgId, epgType) {
-                returnValue.epgs[epgId][epgType+'-contracts'].push(contractId);
+            /**
+             * Updates epgobject with contract object
+             * @param returnValue
+             * @param contract
+             * @param epgId
+             * @param epgType
+             */
+            function updateEpg(returnValue, contract, epgId, epgType) {
+                returnValue.epgs[epgId][epgType + '-contracts'].push(contract);
             }
         }
 
-        function generateLinkId(contractId, providerEpgId, consumerEpgId) {
-            return contractId + '_' + providerEpgId + '_' + consumerEpgId;
-        }
-
+        /**
+         * Creates ResolvedPolicyList object
+         * @param data
+         * @returns {ResolvedPolicyList}
+         */
         function createList(data) {
             var obj = new ResolvedPolicyList();
 
-            if(data) {
+            if (data) {
                 obj.setData(data);
             }
 
             return obj;
         }
+
+        /**
+         * creates linkId string from input parameters
+         * @param contractId
+         * @param providerEpgId
+         * @param consumerEpgId
+         * @returns {string}
+         */
+        function generateLinkId(contractId, providerEpgId, consumerEpgId) {
+            return contractId + '_' + providerEpgId + '_' + consumerEpgId;
+        }
+
+        function getContractType(subject) {
+            return subject['resolved-rule'].some(function(s) {
+                return s.action.some(function (a) {
+                    return a['action-definition-id'] === 'Action-Chain';
+                });
+            });
+        }
     }
 
     return ResolvedPolicyListService;