1 define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
4 angular.module('app.gbp').service('ResolvedPolicyListService', ResolvedPolicyListService);
6 ResolvedPolicyListService.$inject = ['$filter', 'Restangular', 'ResolvedPolicyService'];
8 function ResolvedPolicyListService($filter, Restangular, ResolvedPolicyService) {
10 this.createList = createList;
13 function ResolvedPolicyList() {
18 this.aggregateResolvedPolicies = aggregateResolvedPolicies;
20 this.clearData = clearData;
21 this.setData = setData;
25 * fills ResolvedPolicyList object with data
28 function setData(data) {
32 data.forEach(function (dataElement) {
33 self.data.push(ResolvedPolicyService.createObject(dataElement));
39 * Clears data property of ResolvedPolicyList object
41 function clearData() {
47 * Reads data from operational datastore and filters it by tenant property if available
49 * @param successCallback
51 function get(tenant, successCallback) {
54 var restObj = Restangular.one('restconf').one('operational').one('resolved-policy:resolved-policies');
56 return restObj.get().then(function (data) {
58 self.data = $filter('filter')(data['resolved-policies']['resolved-policy'], {
59 'consumer-tenant-id': tenant,
60 'provider-tenant-id': tenant,
64 self.data = data['resolved-policies']['resolved-policy'];
72 * Process resolved policies and returns object with epgs and contracts properties
73 * @returns {{epgs: {}, contracts: {}}}
75 function aggregateResolvedPolicies() {
77 result = { epgs: {}, contracts: {} };
79 self.data.forEach(function (rp) {
80 processEpg(result, rp, 'consumer');
81 processEpg(result, rp, 'provider');
83 if (rp.hasOwnProperty('policy-rule-group-with-endpoint-constraints')) {
86 rp['policy-rule-group-with-endpoint-constraints'],
87 rp['provider-epg-id'],
98 * Checks if exists object in returnValue.epgs and if not, creates one
100 * @param resolvedPolicyItem
103 function processEpg(returnValue, resolvedPolicyItem, type) {
104 if (!returnValue.epgs.hasOwnProperty(resolvedPolicyItem[type + '-epg-id'])) {
105 returnValue.epgs[resolvedPolicyItem[type + '-epg-id']] = {
106 'provided-contracts': [],
107 'consumed-contracts': [],
116 * Process policy-rule-group-with-endpoint-constraints from resolved-policy.
117 * Creates contracts and updates epgs with contract objects
120 * @param providerEpgId
121 * @param consumerEpgId
123 function processConstraints(returnValue, constraints, providerEpgId, consumerEpgId) {
124 constraints.forEach(function (element) {
125 element['policy-rule-group'].forEach(function (el) {
126 var linkId = generateLinkId(el['contract-id'], providerEpgId, consumerEpgId);
128 if (!returnValue.contracts.hasOwnProperty(linkId)) {
129 returnValue.contracts[linkId] = {
130 'contract-id': el['contract-id'],
137 if (!returnValue.contracts[linkId].subjects.hasOwnProperty(el['subject-name'])) {
138 returnValue.contracts[linkId].subjects[el['subject-name']] = { 'resolved-rule': [] };
141 returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'] =
142 returnValue.contracts[linkId].subjects[el['subject-name']]['resolved-rule'].concat(el['resolved-rule']);
144 Object.keys(returnValue.contracts[linkId].subjects).forEach(function(key) {
145 returnValue.contracts[linkId].type =
146 getContractType(returnValue.contracts[linkId].subjects[key]) ? 'chain' : 'allow';
149 updateEpg(returnValue, returnValue.contracts[linkId], providerEpgId, 'provided');
150 updateEpg(returnValue, returnValue.contracts[linkId], consumerEpgId, 'consumed');
156 * Updates epgobject with contract object
162 function updateEpg(returnValue, contract, epgId, epgType) {
163 returnValue.epgs[epgId][epgType + '-contracts'].push(contract);
168 * Creates ResolvedPolicyList object
170 * @returns {ResolvedPolicyList}
172 function createList(data) {
173 var obj = new ResolvedPolicyList();
183 * creates linkId string from input parameters
185 * @param providerEpgId
186 * @param consumerEpgId
189 function generateLinkId(contractId, providerEpgId, consumerEpgId) {
190 return contractId + '++' + providerEpgId + '++' + consumerEpgId;
193 function getContractType(subject) {
194 return subject['resolved-rule'].some(function(s) {
195 return s.action.some(function (a) {
196 return a['action-definition-id'] === 'Action-Chain';
202 return ResolvedPolicyListService;