Merge "Tests for NeutronMapper, NeutronNetworkAware"
authorMartin Sunal <msunal@cisco.com>
Thu, 7 Jul 2016 14:41:17 +0000 (14:41 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 7 Jul 2016 14:41:17 +0000 (14:41 +0000)
41 files changed:
groupbasedpolicy-ui/.gitignore
groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.css
groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.css.orig [deleted file]
groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.module.js
groupbasedpolicy-ui/module/src/main/resources/gbp/common/topology/next_topology.directive.js
groupbasedpolicy-ui/module/src/main/resources/gbp/common/topology/next_topology.service.js
groupbasedpolicy-ui/module/src/main/resources/gbp/common/views/index.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/common/views/root.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/add-endpoint.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/dialog-add-endpoint.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/endpoint.service.js
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/endpoints-list.service.js
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/endpoints.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/endpoints.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/side_panel_endpoints_detail.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/sxp-mapping-list.service.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/sxp-mapping.service.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/contract-sidepanel.tpl.html [deleted file]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/epg-sidepanel.tpl.html [deleted file]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy-list.service.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy.service.js
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/rule-sidepanel.tpl.html [deleted file]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/contract-list-sidepanel.controller.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/contract-sidepanel.controller.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/epg-list-sidepanel.controller.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/epg-sidepanel.controller.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/clause-sidepanel.tpl.html [moved from groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/clause-sidepanel.tpl.html with 58% similarity]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/contract-list-sidepanel.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/contract-sidepanel.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/epg-list-sidepanel.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/epg-sidepanel.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/rule-sidepanel.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/subject-sidepanel.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/subject-sidepanel.tpl.html [deleted file]
groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/sfc.service.js
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/mapper/destination/DestinationMapperUtils.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/mapper/destination/DestinationMapperFlowsTest.java

index 78add0be686d0b772e7955a654017779987169f2..91325d4290205260fb9e144961c7b2a2daadf382 100644 (file)
@@ -1,3 +1,4 @@
 module/node
 module/src/main/resources/gbp/node_modules
 module/src/main/resources/gbp/vendor
+module/src/main/resources/gbp/node/
index cb04cc439c2a993a5e671af3e0ee9ec800d09b60..cef32943f1942d9cb757f6ea225f8d52c2352ee0 100644 (file)
@@ -1,53 +1,50 @@
-define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.service'], function () {
+define([
+    'app/gbp/common/gbp.service',
+    'app/gbp/resolved-policy/resolved-policy-list.service',
+    'app/gbp/endpoints/sxp-mapping-list.service'
+], function () {
     'use strict';
 
     angular.module('app.gbp').controller('RootGbpCtrl', RootGbpCtrl);
 
-    RootGbpCtrl.$inject = ['$state', '$rootScope', '$scope', '$filter', '$mdDialog', 'RootGbpService',
-        'TenantListService', 'EpgListService', 'ResolvedPolicyService', 'NextTopologyService', 'EndpointsListService'];
+    RootGbpCtrl.$inject = ['$filter', '$mdDialog', '$rootScope', '$scope', '$state',
+        'EndpointsListService', 'NextTopologyService', 'ResolvedPolicyListService', 'RootGbpService',
+        'TenantListService', 'SxpMappingListService'];
 
-    function RootGbpCtrl($state, $rootScope, $scope, $filter, $mdDialog, RootGbpService,
-        TenantListService, EpgListService, ResolvedPolicyService, NextTopologyService, EndpointsListService) {
+    function RootGbpCtrl($filter, $mdDialog, $rootScope, $scope, $state,
+        EndpointsListService, NextTopologyService, ResolvedPolicyListService, RootGbpService,
+        TenantListService, SxpMappingListService) {
         /* properties */
         $scope.apiType = 'operational';
         $scope.activeObject = null;
         $scope.endpoints = EndpointsListService.createList();
+        $scope.endpointSgtList = SxpMappingListService.createList();
+        $scope.innerObj = {};
         $scope.rootTenant = null;
         $scope.rootTenants = TenantListService.createList();
         $scope.resolvedPolicy = {};
-        $scope.selectedNode = {};
-        $scope.sidePanelObject = {};
+        $scope.sidePanelObject = null;
         $scope.sidePanelPage = false;
         $scope.sidePanelPageEndpoint = false;
         $scope.stateUrl = null;
-        $scope.topologyData = {nodes: [], links: []};
+        $scope.topologyData = { nodes: [], links: [] };
         $scope.viewPath = 'src/app/gbp/';
 
-        var resolvedPolicies = ResolvedPolicyService.createObject();
-        resolvedPolicies.get(fillTopologyData);
+        var resolvedPolicies = ResolvedPolicyListService.createList();
+        getResolvedPolicies();
 
         /* methods */
-        $scope.fillTopologyData = fillTopologyData;
         $scope.broadcastFromRoot = broadcastFromRoot;
         $scope.closeSidePanel = closeSidePanel;
         $scope.openSfcDialog = openSfcDialog;
         $scope.openSidePanel = openSidePanel;
         $scope.setRootTenant = setRootTenant;
-        $scope.toggleExpanded = toggleExpanded;
-        $scope.openSidePanelContract = openSidePanelContract;
-        $scope.openSidePanelChild = openSidePanelChild;
-        $scope.deselectEpg = deselectEpg;
-        $scope.deselectContract = deselectContract;
-        $scope.openSidePanelTpl = openSidePanelTpl;
-        $scope.getObjectsCount = getObjectsCount;
-        $scope.expandAll = expandAll;
-        $scope.collapseAll = collapseAll;
+        $scope.fillTopologyData = fillTopologyData;
         $scope.highlightNode = highlightNode;
         $scope.highlightLink = highlightLink;
         $scope.fadeAll = fadeAll;
         $scope.rootOpenEndpointDialog = rootOpenEndpointDialog;
         $scope.rootDeleteEndpointDialog = rootDeleteEndpointDialog;
-        $scope.getEndpointsList = getEndpointsList;
 
         RootGbpService.setMainClass();
         init();
@@ -69,20 +66,11 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
         function closeSidePanel() {
             if($scope.sidePanelPage) {
                 $scope.sidePanelPage = false;
+                $scope.sidePanelObject = null;
                 $scope.fadeAll();
             }
         }
 
-        /**
-         *
-         * @param arr
-         */
-        function collapseAll(arr) {
-            arr.forEach(function(element) {
-                element.expanded = false;
-            });
-        }
-
         /**
          *
          * @param source
@@ -91,12 +79,14 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
          * @param tenant
          * @returns {{id: string, source: *, target: *, tenant: *}}
          */
-        function createLink( source, target, contract, tenant) {
+        function createLink( linkId, type) {
+            var linkIdParts = linkId.split('_');
             return {
-                'id': generateLinkId(contract, source, target),
-                'source': source,
-                'target': target,
-                'tenant': tenant,
+                'id': linkId,
+                'source': linkIdParts[1],
+                'target': linkIdParts[2],
+                'tenant': $scope.rootTenant,
+                'type': type,
             };
         }
 
@@ -104,61 +94,17 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
          *
          * @param nodeName
          * @param tenantId
-         * @returns {{id: *, tenantId: *, node-id: *, label: *}}
+         * @returns {Object}
          */
-        function createNode(nodeName, tenantId) {
+        function createNode(nodeName) {
             return {
                 'id': nodeName,
-                'tenantId' : tenantId,
+                'tenantId': $scope.rootTenant,
                 'node-id': nodeName,
                 'label': nodeName,
             };
         }
 
-        /**
-         *
-         */
-        function deselectContract() {
-            $scope.fadeAll();
-            $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
-
-            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;
-            $scope.activeObject = 'contract';
-        }
-
-        /**
-         *
-         */
-        function deselectEpg() {
-            $scope.fadeAll();
-            var elements;
-
-            $scope.sidePanelPage = 'resolved-policy/epg-sidepanel';
-            elements = EpgListService.createList();
-            elements.get($scope.apiType, $scope.rootTenant);
-            $scope.sidePanelObject = elements;
-            $scope.selectedNode = null;
-            $scope.activeObject = 'epg';
-        }
-
-        /**
-         *
-         * @param arr
-         */
-        function expandAll(arr) {
-            arr.forEach(function(element) {
-                element.expanded = true;
-            });
-        }
-
         /**
          *
          */
@@ -167,92 +113,28 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
         }
 
         /**
-         *
-         * @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']);
-            }
-
-        }
-
-        /**
-         *
+         * reads resolvedPolicies list, prepares nodes and links for topology and fills them
          */
         function fillTopologyData() {
-            if($scope.rootTenant) {
-                var topoData = {nodes: [], links: [],},
-                    filteredResolvedPolicies = $filter('filter')(resolvedPolicies.data, {
-                        'consumer-tenant-id': $scope.rootTenant,
-                        'provider-tenant-id': $scope.rootTenant
-                    });
-
-
-                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']));
+            var tempTopoData = {nodes: [], links: []};
+            $scope.resolvedPolicy = resolvedPolicies.aggregateResolvedPolicies();
 
-                    fillResolvedPolicy(rp);
-                    topoData.links = getContracts(rp);
-                });
+            tempTopoData.nodes = Object.keys($scope.resolvedPolicy.epgs).map(function (key) {
+                return createNode(key);
+            });
 
-                $scope.topologyData = topoData;
-                $scope.topologyLoaded = true;
-            }
-        }
+            tempTopoData.links = Object.keys($scope.resolvedPolicy.contracts).map(function (key) {
+                return createLink(key, $scope.resolvedPolicy.contracts[key].type);
+            });
 
-        /**
-         *
-         * @param contractId
-         * @param providerEpgId
-         * @param consumerEpgId
-         * @returns {string}
-         */
-        function generateLinkId(contractId, providerEpgId, consumerEpgId) {
-            return contractId + '_' + providerEpgId + '_' + consumerEpgId;
+            $scope.topologyData = tempTopoData;
+            $scope.topologyLoaded = true;
         }
 
-        /**
-         *
-         * @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']
-                        )
-                    )
-                });
+        function getResolvedPolicies() {
+            if($scope.rootTenant) {
+                resolvedPolicies.get($scope.rootTenant, fillTopologyData);
             }
-
-            return retVal;
-        }
-
-        /**
-         *
-         * @param obj
-         * @returns {*}
-         */
-        function getObjectsCount(obj) {
-            if(obj)
-                return Object.keys(obj).length;
-            else
-                return 0;
         }
 
         /**
@@ -277,6 +159,10 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
         function init() {
             $scope.rootTenants.clearData();
             $scope.rootTenants.get('config');
+            $state.go('main.gbp.index.resolvedPolicy');
+            $scope.endpointSgtList.get();
+
+
         }
 
         /**
@@ -292,8 +178,8 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
                 parent: angular.element(document.body),
                 scope: $scope,
                 locals: {
-                    chainName: chainName,
-                },
+                    chainName: chainName
+                }
             });
         }
 
@@ -302,133 +188,37 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
          * 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);
-                $scope.activeObject = 'epg';
-            }
-            else
-                $scope.activeObject = 'contract';
-
-            var samePage = page === $scope.sidePanelPage;
-
-            $scope.selectedNode = object;
-
-            $scope.sidePanelCbk = cbk;
+        function openSidePanel(page, object, type, element) {
             $scope.sidePanelPage = page;
             $scope.sidePanelObject = object;
 
-            if ( samePage &&  $scope.sidePanelCbk) {
-                $scope.sidePanelCbk();
-            }
-        }
-
-        /**
-         *
-         * @param idElement
-         */
-        function openSidePanelContract(idElement) {
-            var obj = $filter('filter')(Object.keys($scope.resolvedPolicy).map(function(k) {
-                var obj = $scope.resolvedPolicy[k];
-                obj.linkId = k;
-
-                return obj;
-            }), {'contract-id': idElement});
-
-            $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
-            $scope.sidePanelObject = obj[0];
-            $scope.selectedNode = obj[0];
-            $scope.activeObject = 'contract';
-
-            NextTopologyService.highlightLink($rootScope.nxTopology, obj[0].linkId);
-        }
-
-        /**
-         * .
-         * @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;
+                case 'subject':
+                    $scope.innerObj.subject = element;
+                    break;
+                case 'clause':
+                    $scope.innerObj.clause = element;
+                    break;
+                case 'rule':
+                    $scope.innerObj.rule = element;
+                    break;
+                default:
             }
         }
 
-        /**
-         *
-         * @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) {
-                    var linkId = generateLinkId(el['contract-id'], providerEpgId, consumerEpgId);
-
-                    $scope.resolvedPolicy = {};
-
-                    if(!$scope.resolvedPolicy.hasOwnProperty(linkId)) {
-                        $scope.resolvedPolicy[linkId] = {
-                            'contract-id': el['contract-id'],
-                            'subjects': {},
-                        };
-                    }
-
-                    if(!$scope.resolvedPolicy[linkId].subjects.hasOwnProperty(el['subject-name'])) {
-                        $scope.resolvedPolicy[linkId].subjects[el['subject-name']] = {'resolved-rule': []};
-                    }
-
-                    $scope.resolvedPolicy[linkId].subjects[el['subject-name']]['resolved-rule'].push(el['resolved-rule']);
-                });
-            });
-        }
-
         /**
          *
          */
         function setRootTenant() {
             $scope.broadcastFromRoot('ROOT_TENANT_CHANGED');
 
-            if($scope.stateUrl.startsWith('/resolved-policy')) {
-                fillTopologyData();
-                if($scope.sidePanelPage) {
-                    if($scope.activeObject == 'epg')
-                        deselectEpg();
-                    else if($scope.activeObject == 'contract')
-                        deselectContract();
+            if ($scope.stateUrl.startsWith('/resolved-policy')) {
+                getResolvedPolicies();
+                if($scope.sidePanelObject) {
+                    if($scope.sidePanelObject['contract-id'])
+                        openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel');
+                    else
+                        openSidePanel('resolved-policy/sidepanel/views/epg-list-sidepanel');
                 }
             }
         }
@@ -441,21 +231,8 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
             $scope.stateUrl = $state.current.url;
             closeSidePanel();
 
-            if($scope.stateUrl.startsWith('/resolved-policy')) {
-                fillTopologyData();
-            }
-        }
-
-        /**
-         *
-         * @param element
-         */
-        function toggleExpanded(element) {
-            if(typeof element !== 'string') {
-                if(element.expanded)
-                    element.expanded = false;
-                else
-                    element.expanded = true;
+            if ($scope.stateUrl.startsWith('/resolved-policy')) {
+                getResolvedPolicies();
             }
         }
 
@@ -469,8 +246,8 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
                 parent: angular.element(document.body),
                 scope: $scope,
                 locals: {
-                    endpoint: endpointData,
-                },
+                    endpoint: endpointData
+                }
             });
         }
 
@@ -483,18 +260,13 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
 
             $mdDialog.show(confirm).then(function () {
                 endpointData.deleteEndpoint(function () {
-                    getEndpointsList();
+                    $scope.$broadcast('endpointChanged');
                 });
             }, function () {
 
             });
         }
 
-        function getEndpointsList() {
-            $scope.endpoints.clearData();
-            $scope.endpoints.getByEpg($scope.selectedNode.data.id);
-        }
-
         /* event listeners */
         /**
          * Event fired after content loaded, setStateUrl function is called to fill stateUrl method
index e7dbd567e465c275619a553858bafea0599d84dd..b8ba13fdffb63c1d9f2a8753ac498a0557df3d54 100644 (file)
@@ -1,3 +1,11 @@
+.h100 {
+    height:100%
+}
+
+.w100 {
+    width:100%
+}
+
 .gbpUiGlobalWrapper {
     background: #ffffff;
     margin-bottom: 0!important;
@@ -7,6 +15,7 @@
 
 .gbpUiGlobalWrapper .main {
     top: 0px;
+    height: 100%;
 }
 
 .gbpUiWrapper {
@@ -94,6 +103,7 @@ svg g.node text {
 
 #graph-container {
     padding-left: 0;
+    background-color: #ffffff;
 }
 
 /* $mdDialog.confirm */
@@ -180,10 +190,17 @@ md-dialog-content > div:first-child {
     font-size: 13px;
     margin-bottom: 0 !important;
     vertical-align: middle;
+    max-height: 20px;
+    line-height: 20px;
 }
 
 .breadcrumbs .breadcrumb[role="button"] {
     color: rgb(33, 150, 243);
+    cursor: pointer;
+}
+
+.breadcrumb i {
+    font-size: 20px !important;
 }
 
 .layout-padding-r10 {
@@ -239,3 +256,97 @@ li > md-autocomplete-parent-scope > span {
     color: white;
     font-weight: normal;
 }
+
+md-input-container md-select md-select-value span {
+    font-weight: 500;
+    font-size: 14px;
+    font-style: inherit;
+    font-variant: inherit;
+    font-family: inherit;
+    letter-spacing: 0.010em;
+}
+
+#select_container_1 {
+    z-index:1001;
+}
+
+md-list-item.md-4-line .md-list-item-text h3{
+    font-size: 16px;
+    font-weight: 400;
+    letter-spacing: 0.010em;
+    margin: 0 0 0px 0;
+    line-height: 1.2em;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    color: rgba(0,0,0,0.87);
+}
+
+md-list-item.md-4-line .md-list-item-text p {
+    font-size: 14px;
+    font-weight: 500;
+    letter-spacing: 0.010em;
+    margin: 0 0 0 0;
+    line-height: 1.6em;
+    color: rgba(0,0,0,0.54);
+}
+
+
+md-list-item.md-4-line {
+    height: auto;
+    min-height: 100px;
+}
+
+section.legendBox{
+    position: absolute !important;
+    right: 0;
+    top: 0;
+    z-index: 1;
+    width: 200px;
+}
+
+section.legendBox ul li {
+    list-style-type: none;
+}
+
+.reload-button i {
+    vertical-align: middle;
+}
+
+section.legendBox ul .line.green {
+    border-top: 2px solid #68bd6b;
+}
+
+section.legendBox ul .line.blue {
+    border-top: 2px solid #84a3ff;
+}
+
+section.legendBox ul .line {
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: top;
+    zoom: 1;
+    margin: 9px 5px 0 0;
+    width: 50px;
+}
+
+.margin-lr0 {
+    margin-right: 0 !important;
+    margin-left: 0 !important;
+}
+
+.popover-title {
+    color: black;
+}
+
+.popover-content span {
+    color: black;
+}
+
+.popover-content h5 {
+    color: black;
+}
+
+.n-topology-nav-setting > span {
+    color: #999999;
+}
\ No newline at end of file
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.css.orig b/groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.css.orig
deleted file mode 100644 (file)
index af3d301..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-.gbpUiGlobalWrapper {
-    background: #ffffff;
-    margin-bottom: 0!important;
-    min-height: 100%;
-    padding: 0px;
-}
-
-.gbpUiGlobalWrapper .main {
-    top: 0px;
-}
-
-.gbpUiWrapper {
-    background-color: #414042;
-}
-
-.gbpUiWrapper .pageContent {
-    margin: 0px;
-    padding: 0px;
-    width: 100%;
-    height: 100%;
-}
-
-.gbpUiWrapper .side-panel {
-    width: 400px;
-    color: #000 ! important;
-    border: 1px solid #000;
-}
-
-.gbpUiWrapper .h100 {
-    height: 100%;
-}
-
-.gbpUiWrapper.w100 {
-    width: 100%;
-}
-
-.gbpUiWrapper.flt-r {
-    float: right;
-}
-
-/* LAYOUT */
-.layout-padding-lr15 {
-    padding: 0 15px;
-}
-
-/* TABLES */
-.gbpUiWrapper .md-table span {
-    color: rgba(0,0,0,.87);
-}
-.gbpUiWrapper .md-table-pagination span {
-    color: rgba(0,0,0,.87);
-    font-weight: normal;
-}
-.gbpUiWrapper button.md-button.md-icon-button.w85 {
-    width: 85px;
-}
-
-/* BUTTONS */
-.gbpUiWrapper button.md-primary span {
-    color: rgb(33,150,243);
-}
-.gbpUiWrapper button .md-icon {
-    width: 30px;
-}
-
-/* DIALOG */
-.gbpDialogWrapper button.md-primary span {
-    color: rgba(0,0,0,0.87);
-}
-.gbpDialogWrapper button.md-primary[disabled] span {
-    color: rgba(0,0,0,0.26);
-}
-
-svg g.node text {
-    pointer-events: auto !important;
-}
-
-.expander md-content {
-    line-height: 15px;
-    width: 100%;
-}
-
-.expander .md-list-item-inner {
-    flex-flow: row wrap;
-}
-
-.expand-button {
-    min-width: 0px !important;
-    min-height: 0px !important;
-    margin-top: 0 !important;
-    margin-bottom: 0 !important;
-    line-height: normal !important;
-}
-
-#graph-container {
-    padding-left: 0;
-}
-
-/* $mdDialog.confirm */
-md-dialog button span {
-    color: #000;
-}
-
-md-sidenav span {
-    color: inherit !important;
-}
-
-div.md-primary.md-subheader.ng-scope > div > span > span {
-  color: rgb(33,150,243);
-}
-
-.md-subheader {
-    font-weight: bold !important;
-}
-
-md-sidenav > md-toolbar > div > h2 > span {
-    margin: 20px 0;
-    color: #666;
-}
-
-span.flex-35 > strong {
-    color: rgba(0,0,0,0.87);
-}
-
-span.ng-binding.flex {
-    color: rgba(0,0,0,0.87);
-}
-
-md-select:not([disabled]) .md-select-value .md-text {
-       color: black;
-}
-
-.md-input-has-value label {
-    color: rgba(0,0,0,0.54);
-}
-
-md-select-value span {
-       color: rgba(0,0,0,0.26);
-    font-weight: bold;
-    margin-bottom: 5px;
-    line-height: 1.428571429;
-}
-
-md-select-value span div {
-    font-weight: normal;
-}
-
-.md-chips {
-        padding: 0 0 0 0 !important;
-}
-
-md-dialog-content > div:first-child {
-    padding-top: 20px;
-    padding-bottom: 20px;
-}
-
-.gbpUiGlobalWrapper .md-locked-open {
-    width: 500px;
-    min-width: 500px;
-}
-
-.breadcrumbs {
-    display: inline-block;
-    font-size: 16px;
-    font-weight: 500;
-    line-height: 1em;
-    padding-left: 0;
-    margin: 10px 0;
-}
-
-.breadcrumbs .breadcrumb {
-    display: inline-block;
-    color: rgba(0,0,0,.54);
-    background-color: transparent;
-    padding: 0;
-    font-size: 13px;
-    margin-bottom: 0 !important;
-    vertical-align: middle;
-}
-
-.breadcrumbs .breadcrumb[role="button"] {
-    color: rgb(33, 150, 243);
-}
-
-<<<<<<< HEAD
-.layout-padding-r10 {
-    padding-right: 10px;
-}
-
-.layout-padding-b15 {
-    padding-bottom: 15px;
-}
-
-.order {
-    color: #000 !important;
-    margin: 0;
-}
-
-.status-circle.allow {
-    color: green;
-}
-
-.status-circle.require-contract {
-    color: orange;
-}
-=======
-md-ink-bar {
-    background: red !important;
-}
-
-md-tab-item > span {
-    color: rgba(0,0,0,0.54);
-}
-
-md-tab-item.md-tab.ng-scope.ng-isolate-scope.md-ink-ripple.md-active > span {
-    color: rgb(16,108,200);
-}
-
-.layout-padding-lr15.ng-scope.layout-column > div {
-    padding-top: 15px;
-}
-
-div.md-primary.md-subheader > div > span > span {
-    color: rgb(33,150,243);
-}
->>>>>>> c391bea... Endpoints
index b341b9b67599d8f35d729ba738e9c32327d3199a..b5217026382a0becc82e9f639b253bbd2b9f6e3a 100644 (file)
@@ -37,6 +37,10 @@ define([
         NavHelperProvider.addControllerUrl('app/gbp/policy/policy.controller');
         NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/resolved-policy.controller');
         NavHelperProvider.addControllerUrl('app/gbp/sfc/dialog-sfc-topology.controller');
+        NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/epg-sidepanel.controller');
+        NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/epg-list-sidepanel.controller');
+        NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/contract-sidepanel.controller');
+        NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/sidepanel/contract-list-sidepanel.controller');
         NavHelperProvider.addControllerUrl('app/gbp/tenant/add-tenant.controller');
         NavHelperProvider.addControllerUrl('app/gbp/tenant/tenant.controller');
 
index a3feac5f9d7647a4da20c8fa870ee6f4e4f494d3..4eebf31884cc28cf10ee0b66fc5447281f71c411 100644 (file)
@@ -1,17 +1,17 @@
 define(['next-ui'], function() {
 
-       var NextTopology = function(NextTopologyService){
-               return {
-                       restrict: 'E',
-                       scope: {
-                               topologyData: '=',
-                               cbkFunctions: '=?',
-                               dictionaries: '=?',
-                               topo: '=?',
-                topoColors: '=?'
-                       },
-                       template: '<div id="graph-container" class="col-md-12"></div>',
-                       link: function(scope) {
+       var NextTopology = function (NextTopologyService){
+        return {
+                           restrict: 'E',
+                scope: {
+                    topologyData: '=',
+                    cbkFunctions: '=?',
+                    dictionaries: '=?',
+                    topo: '=?',
+                    topoColors: '=?'
+                },
+                           template: '<div id="graph-container" class="col-md-12"></div>',
+                           link: function(scope) {
                                var saveTopoInterval = null;
 
                                scope.topo = null;
@@ -311,11 +311,12 @@ define(['next-ui'], function() {
                                 */
 
                                 this.setProviderStyleLine();
+                                                               this.set('color', this.getColor());
                                                        },
                                                        // generate the color for a link
                                                        getColor: function(){
                                                                // get color depend on status
-                                                               var color = NextTopologyService.getLinkColor(this.model()._data.status, scope.topoColors);
+                                                               var color = this.model()._data.type === 'chain' ? '#3366ff' : '#009900';
                                                                // make it available outside next
                                                                this.model()._data.linkColor = color;
                                                                return color;
index 4b18baaaae85733b5c621470789cc4873d45d637..f9e5dd9497267e98f8e209fe8abe32dde98bcdb7 100644 (file)
@@ -16,7 +16,8 @@ define(['next-ui'], function () {
                         scalable: true,
                         nodeConfig: {
                             label: 'model.label',
-                            iconType: 'model.icon',
+                            //iconType: 'model.icon',
+                            iconType: 'unlinked',
                             color: function (node, model) {
                                 return topoColors.getItem('forwarding-box');
                             }
index aad507554942ff04598289f169e98f57a93e0a74..4184d60bbfb3bc18c0b60286e43c33a01d95727f 100644 (file)
@@ -13,8 +13,8 @@
                 <md-button ng-click="closeSidePanel()" ng-href="#/gbp/index/resolved-policy">Resolved Policy</md-button>
                 <md-button ng-click="closeSidePanel()" ng-href="#/gbp/index/endpoints">Endpoints</md-button>
                 <span flex></span>
-                <md-button ng-if="('main.gbp.index.resolvedPolicy' | isState) && rootTenant" ng-click="deselectEpg()" ng-href="">Endpoint-groups</md-button>
-                <md-button ng-if="('main.gbp.index.resolvedPolicy' | isState) && rootTenant" ng-click="deselectContract()" ng-href="">Contracts</md-button>
+                <md-button ng-if="('main.gbp.index.resolvedPolicy' | isState) && rootTenant" ng-click="openSidePanel('resolved-policy/sidepanel/views/epg-list-sidepanel')" ng-href="">Endpoint-groups</md-button>
+                <md-button ng-if="('main.gbp.index.resolvedPolicy' | isState) && rootTenant" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" ng-href="">Contracts</md-button>
                 <md-input-container style="margin-right: 10px;">
                     <md-select ng-model="rootTenant"
                                placeholder="select tenant"
index b5c9f540be454dee6d38d15bd958beb0ea77f07c..8eb8679ad3d969296b768735fb35ccbf525aefdb 100644 (file)
@@ -1 +1 @@
-<div class="main" ui-view></div>
+<div class="main" ui-view layout="row" flex></div>
index 33262bfa3c5d57c59752f6331daa8f2e887a43a3..baeb00e08f80f0dcba595b26ea6bfe89b801bbef 100644 (file)
@@ -6,12 +6,15 @@ define([
 
     angular.module('app.gbp').controller('AddEndpointController', AddEndpointController);
 
-    AddEndpointController.$inject = ['$filter', '$mdDialog', '$scope', 'EndpointService', 'endpoint', 'ForwardingService', 'TenantService'];
+    AddEndpointController.$inject = ['$state', '$filter', '$mdDialog', '$scope', 'EndpointService', 'endpoint', 'ForwardingService'];
     /* @ngInject */
-    function AddEndpointController($filter, $mdDialog, $scope, EndpointService, endpoint, ForwardingService, TenantService) {
+    function AddEndpointController($state, $filter, $mdDialog, $scope, EndpointService, endpoint, ForwardingService) {
         /* properties */
 
         $scope.endpoint = endpoint ? endpoint : EndpointService.createObject();
+        if (!$scope.endpoint.data.tenant) {
+            $scope.endpoint.data.tenant = $scope.rootTenant ? $scope.rootTenant : null;
+        }
         $scope.epgsChips = {
             selectedItem: null,
             searchText: null,
@@ -36,12 +39,15 @@ define([
         $scope.searchEpgs = searchEpgs;
         $scope.populateScopeAfterTenantSelected = populateScopeAfterTenantSelected;
 
+        populateScopeAfterTenantSelected();
+
         /* Implementations */
         $scope.forwarding.get(postForwardingGet);
 
         function closeDialog(){
             $mdDialog.cancel();
-            $scope.getEndpointsList();
+            if($state.current.name == 'main.gbp.index.endpoints')
+                $scope.getEndpointsList();
         }
 
         function save() {
@@ -53,6 +59,7 @@ define([
             }
             $scope.endpoint.post(function () {
                 $scope.closeDialog();
+                $scope.broadcastFromRoot('endpointChanged');
             }, function () {
             } );
         }
@@ -81,7 +88,7 @@ define([
 
         function createFilterFor(query) {
             return function filterFn(epg) {
-                return (epg.indexOf(query) === 0);
+                return (epg.toLowerCase().indexOf(query.toLowerCase()) === 0);
             };
         }
 
index 84b167ec8ce54cfc1600a0920dbcfabb8b8282ac..a53e560a7034d95c161aa443a53254b09c016c79 100644 (file)
                                 <label>Context Type</label>
                                 <md-select name="contextTypeSelect" ng-model="endpoint.data['context-type']"
                                            ng-change="filterContextIds(endpoint.data['context-type'])"
-                                           aria-label="Context type select">
+                                           aria-label="Context type select"
+                                           ng-required="true">
                                     <md-option ng-repeat="contextType in ['l2-l3-forwarding:l2-bridge-domain', 'l2-l3-forwarding:l2-flood-domain', 'l2-l3-forwarding:l3-context']"
-                                               ng-value="contextType"
-                                               ng-required="true">
+                                               ng-value="contextType">
                                         {{ contextType }}
                                     </md-option>
                                 </md-select>
+                                <div ng-messages="endpointForm.contextTypeSelect.$error" ng-show="endpointForm.contextTypeSelect.$touched">
+                                    <div ng-message="required">Required field</div>
+                                </div>
                             </md-input-container>
                             <md-input-container flex ng-if="forwardingContexts.length">
                                 <label>Context Id</label>
                                 <md-select name="contextIdSelect" ng-model="endpoint.data['context-id']"
-                                           aria-label="Context Id select">
+                                           aria-label="Context Id select"
+                                           ng-required="true">
                                     <md-option ng-repeat="contextId in forwardingContexts"
-                                               ng-value="contextId['context-id']"
-                                               ng-required="true">
+                                               ng-value="contextId['context-id']">
                                         {{ contextId['context-id'] }}
                                     </md-option>
                                 </md-select>
+                                <div ng-messages="endpointForm.contextIdSelect.$error" ng-show="endpointForm.contextIdSelect.$touched">
+                                    <div ng-message="required">Required field</div>
+                                </div>
                             </md-input-container>
                             <md-input-container flex ng-if="!forwardingContexts.length">
                                 <label>Context Id</label>
                         <div layout="row">
                             <md-input-container flex>
                                 <label>Address Type</label>
-                                <md-select ng-model="endpoint.data['address-type']" aria-label="Address Type select">
+                                <md-select name="AddressType" ng-model="endpoint.data['address-type']" aria-label="Address Type select" ng-required="true">
                                     <md-option ng-repeat="addressType in ['l2-l3-forwarding:mac-address-type', 'l2-l3-forwarding:ip-prefix-type']"
-                                               ng-value="addressType"
-                                               ng-required="true">
+                                               ng-value="addressType">
                                         {{ addressType }}
                                     </md-option>
                                 </md-select>
-                                <div ng-messages="endpointForm['address-type'].$error">
+                                <div ng-messages="endpointForm.AddressType.$error" ng-show="endpointForm.AddressType.$touched">
                                     <div ng-message="required">Required field</div>
                                 </div>
                             </md-input-container>
                                         {{ NetworkDomainId['network-domain-id'] }}
                                     </md-option>
                                 </md-select>
-                                <div ng-messages="endpointForm.networkDomainIdSelect.$error">
-                                    <div ng-message="required">Required field.</div>
-                                </div>
                             </md-input-container>
                             <md-input-container flex ng-if="!forwardingNetworkDomainIds.length">
                                 <label>Network Containment - Network Domain Id</label>
                                 <input name="networkDomainIdInput" ng-model="endpoint.data['network-containment']['network-domain-id']"/>
-                                <div ng-messages="endpointForm.networkDomainIdInput.$error">
-                                    <div ng-message="required">Required field.</div>
-                                </div>
                             </md-input-container>
                         </div>
                         <div layout="row">
                                 <md-chips
                                                name="epgs"
                                                ng-model="endpoint.data['endpoint-group']"
-                                    md-require-match = "true"
                                                md-autocomplete-snap
                                                flex>
                                                <md-autocomplete
index fca475366c59a1621b46144b49b3925cc7a138a8..53a38f556cd99a2ee0c32fdc42f8aed27074b92a 100644 (file)
@@ -23,8 +23,20 @@ define([], function () {
             this.setData = setData;
             this.post = post;
             this.deleteEndpoint = deleteEndpoint;
+            this.getEndpointContextTypeAcronym = getEndpointContextTypeAcronym;
 
             /* Implementation */
+
+            function getEndpointContextTypeAcronym() {
+                switch(this.data['context-type']) {
+                    case 'l2-l3-forwarding:l2-bridge-domain':
+                        return 'L2B';
+                    case 'l2-l3-forwarding:l2-flood-domain':
+                        return 'L2F';
+                    default:
+                        return 'L3';
+                }
+            }
             /**
              * fills Endpoint object with data
              * @param data
@@ -88,8 +100,8 @@ define([], function () {
                             ],
                         },
                     };
-                return restObj.customPOST(reqData).then(function (data) {
-                    successCallback(data);
+                return restObj.customPOST(reqData).then(function () {
+                    (successCallback() || angular.noop)();
                 }, function () {
 
                 });
index fc0bfac4988611bd0cb5109f5616ba12baf6892a..94cc6a14c50303a49f0c8a8f49496c7d7a7eca66 100644 (file)
@@ -28,6 +28,7 @@ define([], function () {
             function setData(data) {
                 var self = this;
 
+                self.clearData();
                 data && data.forEach(function (dataElement) {
                     self.data.push(EndpointService.createObject(dataElement));
                 });
@@ -48,21 +49,24 @@ define([], function () {
                 });
             }
 
-            function getByEpg(epg) {
+            function getByEpg(epg, successCallback) {
                 /* jshint validthis:true */
                 var self = this;
                 var restObj = Restangular.one('restconf').one('operational').one('base-endpoint:endpoints');
 
                 return restObj.get().then(function (data) {
+                    //var endpoints = $filter('filter')(data.endpoints['address-endpoints']['address-endpoint'], {'endpoint-group': epg.id});
                     var endpoints = $filter('filter')(data.endpoints['address-endpoints']['address-endpoint'].map(function(endpoint) {
                         return endpoint;
                     }),
                         function(ep) {
-                            if(ep['endpoint-group'].indexOf(epg) != -1)
+                            if(ep['endpoint-group'].indexOf(epg.id) != -1)
                                 return true;
                         }
                     );
                     self.setData(endpoints);
+
+                    (successCallback || angular.noop)();
                 });
             }
 
index d49bec84ff469faaded2cbc06911c4202dc97ec0..967886ff4ed7083a4b0052dc28d4d5d9ffbe329b 100644 (file)
@@ -6,9 +6,9 @@ define([
 
     angular.module('app.gbp').controller('EndpointsController', EndpointsController);
 
-    EndpointsController.$inject = ['$scope', '$mdDialog', 'EndpointsListService', 'EndpointService'];
+    EndpointsController.$inject = ['$scope', '$mdDialog', 'EndpointsListService'];
 
-    function EndpointsController($scope, $mdDialog, EndpointsListService, EndpointService) {
+    function EndpointsController($scope, $mdDialog, EndpointsListService) {
         /* properties */
         $scope.endpoints = EndpointsListService.createList();
         $scope.disableKeyFieldsEditing = false;
@@ -29,6 +29,9 @@ define([
         function getEndpointsList() {
             $scope.endpoints.clearData();
             $scope.rootTenant ? $scope.endpoints.getByTenantId($scope.rootTenant) : $scope.endpoints.get($scope.rootTenant);
+
+            $scope.endpointSgtList.clearData();
+            $scope.endpointSgtList.get();
         }
 
         function openEndpointDialog(operation, endpointData) {
@@ -65,13 +68,5 @@ define([
         $scope.$on('ROOT_TENANT_CHANGED', function () {
             $scope.getEndpointsList();
         });
-
-        $scope.$on('openEndpointDialog', function(event, obj) {
-            openEndpointDialog('edit', obj);
-        });
-
-        $scope.$on('deleteEndpointDialog', function(event, obj) {
-            deleteEndpointDialog(obj);
-        });
     }
 });
index e3e6f78d55bff3063c2fc4e823c923a22a380d3e..32948063e8b97b74dacedba8fef2e8f9a26a2e97 100644 (file)
@@ -16,9 +16,9 @@
             </thead>
             <tbody md-body>
             <tr md-row ng-repeat="endpoint in endpoints.data | filter: endpointsTableQuery.filter  | orderBy : endpointsTableQuery.order | limitTo: endpointsTableQuery.limit : (endpointsTableQuery.page -1) * endpointsTableQuery.limit">
-                <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint.data, null);">{{ endpoint.data['context-id'] }}</td>
-                <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint.data, null);">{{ endpoint.data.address }}</td>
-                <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint.data, null);">{{ endpoint.data.tenant }}</td>
+                <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint, null);">{{ endpoint.data['context-id'] }}</td>
+                <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint, null);">{{ endpoint.data.address }}</td>
+                <td md-cell class="pointer" ng-click="openSidePanel('endpoints/side_panel_endpoints_detail', endpoint, null);">{{ endpoint.data.tenant }}</td>
                 <td md-cell>
                     <span ng-repeat="epg in endpoint.data['endpoint-group']">{{epg}}<span ng-if="!$last">, </span>
                     </span>
index c1876566cbe7a7cdb6736416a523208b24d959b2..5f32b957a3dc0302c23e1df5211a4a61251765a5 100644 (file)
@@ -1,49 +1,52 @@
 <md-content>
     <md-subheader class="md-primary">Endpoint properties</md-subheader>
-    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.tenant.length">
-        <span flex="35"><strong>Tenant</strong></span><span flex>{{ sidePanelObject.tenant }}</span>
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data.tenant.length">
+        <span flex="35"><strong>Tenant</strong></span><span flex>{{ sidePanelObject.data.tenant }}</span>
     </div>
-    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject['endpoint-group'].length">
-        <span flex="35"><strong>Endpoint group</strong></span><span ng-repeat="epg in sidePanelObject['endpoint-group']">{{epg}}<span ng-if="!$last">, </span>
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['endpoint-group'].length">
+        <span flex="35"><strong>Endpoint group</strong></span><span ng-repeat="epg in sidePanelObject.data['endpoint-group']">{{epg}}<span ng-if="!$last">, </span>
         </span>
     </div>
     <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
     <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
-        <span flex="35"><strong>Context type</strong></span><span flex>{{ sidePanelObject['context-type'] }}</span>
+        <span flex="35"><strong>Context type</strong></span><span flex>{{ sidePanelObject.data['context-type'] }}</span>
     </div>
     <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
-        <span flex="35"><strong>Context Id</strong></span><span flex>{{ sidePanelObject['context-id'] }}</span>
+        <span flex="35"><strong>Context Id</strong></span><span flex>{{ sidePanelObject.data['context-id'] }}</span>
     </div>
     <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
     <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
-        <span flex="35"><strong>Address type</strong></span><span flex>{{ sidePanelObject['address-type'] }}</span>
+        <span flex="35"><strong>Address type</strong></span><span flex>{{ sidePanelObject.data['address-type'] }}</span>
     </div>
     <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row">
-        <span flex="35"><strong>Address</strong></span><span flex>{{ sidePanelObject.address }}</span>
+        <span flex="35"><strong>Address</strong></span><span flex>{{ sidePanelObject.data.address }}</span>
     </div>
     <md-divider style="margin-bottom: 10px; margin-top: 10px;"></md-divider>
-    <md-subheader class="md-secondary" ng-if="sidePanelObject['network-containment']['network-domain-type'].length">Network domain</md-subheader>
-    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject['network-containment']['network-domain-id'].length">
-        <span flex="35"><strong>Id</strong></span><span flex>{{ sidePanelObject['network-containment']['network-domain-id'] }}</span>
+    <md-subheader class="md-secondary" ng-if="sidePanelObject.data['network-containment']['network-domain-type'].length">Network domain</md-subheader>
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['network-containment']['network-domain-id'].length">
+        <span flex="35"><strong>Id</strong></span><span flex>{{ sidePanelObject.data['network-containment']['network-domain-id'] }}</span>
     </div>
-    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject['network-containment']['network-domain-type'].length">
-        <span flex="35"><strong>type</strong></span><span flex>{{ sidePanelObject['network-containment']['network-domain-type'] }}</span>
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['network-containment']['network-domain-type'].length">
+        <span flex="35"><strong>type</strong></span><span flex>{{ sidePanelObject.data['network-containment']['network-domain-type'] }}</span>
     </div>
-    <md-subheader class="md-secondary"></md-subheader>
-    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.condition.length">
-        <span flex="35"><strong>Condition</strong></span><span ng-repeat="cndt in sidePanelObject.condition">{{cndt}}<span ng-if="!$last">, </span>
+    <!-- <md-subheader class="md-secondary"></md-subheader> -->
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data.condition.length">
+        <span flex="35"><strong>Condition</strong></span><span ng-repeat="cndt in sidePanelObject.data.condition">{{cndt}}<span ng-if="!$last">, </span>
         </span>
     </div>
-    <section ng-if="sidePanelObject['absolute-location']['internal-node'].length || sidePanelObject['absolute-location']['internal-node-connector'].length">
+    <section ng-if="sidePanelObject.data['absolute-location']['internal-node'].length || sidePanelObject.data['absolute-location']['internal-node-connector'].length">
         <label class=".md-subhead">Absolute Location</label>
-        <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject['absolute-location']['internal-node']">
-            <span flex="35"><strong>Internal node</strong></span><span flex>{{ sidePanelObject['absolute-location']['internal-node'] }}</span>
+        <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['absolute-location']['internal-node']">
+            <span flex="35"><strong>Internal node</strong></span><span flex>{{ sidePanelObject.data['absolute-location']['internal-node'] }}</span>
         </div>
-        <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject['absolute-location']['internal-node-connector']">
-            <span flex="35"><strong>Internal node connector</strong></span><span flex>{{ sidePanelObject['absolute-location']['internal-node-connector'] }}</span>
+        <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data['absolute-location']['internal-node-connector']">
+            <span flex="35"><strong>Internal node connector</strong></span><span flex>{{ sidePanelObject.data['absolute-location']['internal-node-connector'] }}</span>
         </div>
     </section>
-    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.timestamp">
-        <span flex="35"><strong>Timestamp</strong></span><span flex>{{ sidePanelObject.timestamp | date: 'short'}}</span>
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="sidePanelObject.data.timestamp">
+        <span flex="35"><strong>Timestamp</strong></span><span flex>{{ sidePanelObject.data.timestamp | date: 'short'}}</span>
+    </div>
+    <div layout="row" class="layout-padding-lr15 .layout-padding-b15 layout-row" ng-if="endpointSgtList.findSgtsForEndpoint(sidePanelObject).length">
+        <span flex="35"><strong>SGT</strong></span><span>{{ endpointSgtList.findSgtsForEndpoint(sidePanelObject) }}</span>
     </div>
 <md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/sxp-mapping-list.service.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/sxp-mapping-list.service.js
new file mode 100644 (file)
index 0000000..4a3f3db
--- /dev/null
@@ -0,0 +1,73 @@
+define(['app/gbp/endpoints/sxp-mapping.service'], function () {
+    'use strict';
+
+    angular.module('app.gbp').service('SxpMappingListService', SxpMappingListService);
+
+    SxpMappingListService.$inject = ['$filter', 'Restangular', 'SxpMappingService'];
+
+    function SxpMappingListService($filter, Restangular, SxpMappingService) {
+        /* methods */
+        this.createList = createList;
+
+        function EndpointsSgtList() {
+            /* properties */
+            this.data = [];
+
+            /* methods */
+            this.setData = setData;
+            this.get = get;
+            this.clearData = clearData;
+            this.findSgtsForEndpoint = findSgtsForEndpoint;
+
+            /* Implementation */
+            /**
+             * fills EndpointsSgtList object with data
+             * @param data
+             */
+            function setData(data) {
+                var self = this;
+
+                data && data.forEach(function (dataElement) {
+                    self.data.push(SxpMappingService.createObject(dataElement));
+                });
+            }
+
+            function clearData() {
+                var self = this;
+                self.data = [];
+            }
+
+            function get() {
+                /* jshint validthis:true */
+                var self = this;
+                var restObj = Restangular.one('restconf').one('config').one('sxp-mapper-model:sxp-mapper');
+
+                return restObj.get().then(function (data) {
+                    self.setData(data['sxp-mapper']['endpoint-policy-template-by-sgt']);
+                });
+            }
+
+            function findSgtsForEndpoint(EPobject) {
+                var self = this,
+                    result = self.data.map(function (ele) {
+                    // properties correction
+                    var condition = ele.data.conditions === undefined ? [] : ele.data.conditions,
+                        epg = ele.data['endpoint-groups'] === undefined ? [] : ele.data['endpoint-groups'];
+
+                    return condition.length==EPobject.data.condition.length && condition.every(function(v,i) { return ($.inArray(v,EPobject.data.condition) != -1)}) &&
+                           epg.length==EPobject.data['endpoint-group'].length && epg.every(function(v,i) { return ($.inArray(v,EPobject.data['endpoint-group']) != -1)}) &&
+                           angular.equals(ele.data.tenant, EPobject.data.tenant) ? ele.data.sgt : false;
+                }).filter(Boolean);
+                return result.toString();
+            }
+        }
+
+        function createList() {
+            var obj = new EndpointsSgtList();
+
+            return obj;
+        }
+    }
+
+    return SxpMappingListService;
+});
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/sxp-mapping.service.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/endpoints/sxp-mapping.service.js
new file mode 100644 (file)
index 0000000..569228b
--- /dev/null
@@ -0,0 +1,53 @@
+define([], function () {
+    'use strict';
+
+    angular.module('app.gbp').service('SxpMappingService', SxpMappingService);
+
+    function SxpMappingService() {
+        /* methods */
+        this.createObject = createObject;
+
+        /**
+         * EndpointSgt constructor
+         * @constructor
+         */
+        function EndpointSgt() {
+            /* properties */
+            this.data = {};
+
+            /* methods */
+            this.setData = setData;
+
+            /* Implementation */
+            /**
+             * fills EndpointSgt object with data
+             * @param data
+             */
+
+            function setData(data) {
+                this.data = {};
+                this.data.sgt = data.sgt;
+                this.data['endpoint-groups'] = data['endpoint-groups'];
+                this.data.conditions = data.conditions;
+                this.data.tenant = data.tenant;
+            }
+        }
+
+        /**
+         * creates EndpointSgt object and fills it with data if available
+         * @param data
+         * @returns {EndpointSgt}
+         */
+        function createObject(data) {
+            var obj = new EndpointSgt();
+
+            if (data) {
+                obj.setData(data);
+            }
+
+            return obj;
+        }
+    }
+
+    return SxpMappingService;
+});
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/contract-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/contract-sidepanel.tpl.html
deleted file mode 100644 (file)
index bff602d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<md-content flex>
-       <div ng-if="selectedNode == null">
-               <div layout="row" class="layout-padding-lr15 layout-row">
-                       <ul class="breadcrumbs">
-                               <li class="breadcrumb">Contracts</li>
-                       </ul>
-               </div>
-               <md-divider></md-divider>
-               <md-divider></md-divider>
-           <md-subheader class="md-primary">Contracts list ({{sidePanelObject.length}})</md-subheader>
-           <md-list>
-               <ng-repeat ng-repeat="contract in sidePanelObject">
-                       <md-list-item ng-click="openSidePanel('resolved-policy/contract-sidepanel', contract, null)"
-                                                         ng-mouseenter="highlightLink(contract.linkId)"
-                                                         ng-mouseleave="fadeAll()">
-                               {{contract['contract-id']}}
-                       </md-list-item>
-               </ng-repeat>
-           </md-list>
-       </div>
-       <div ng-if="selectedNode">
-               <div layout="row" class="layout-padding-lr15 layout-row">
-                       <ul class="breadcrumbs">
-                               <li class="breadcrumb" ng-click="deselectContract()" role="button">Contracts</li>
-                               <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                               <li class="breadcrumb">{{selectedNode['contract-id']}}</li>
-                       </ul>
-               </div>
-               <md-divider></md-divider>
-               <md-divider></md-divider>
-               <md-subheader class="md-primary">Contract info</md-subheader>
-               <div layout="row" class="layout-padding-lr15 layout-padding-b15 layout-row">
-                   <span flex="50" class="flex-50"><strong>Contract ID</strong></span>
-                   <span flex="" class="ng-binding flex">{{selectedNode['contract-id']}}</span>
-               </div>
-               <md-divider></md-divider>
-               <md-subheader class="md-primary">Subject list ({{getObjectsCount(selectedNode.subjects)}})</md-subheader>
-           <md-list>
-               <ng-repeat ng-repeat="(key, value) in selectedNode.subjects">
-                       <md-list-item ng-click="openSidePanelChild(key, 'subject')">
-                               {{key}}
-                       </md-list-item>
-               </ng-repeat>
-           </md-list>
-       </div>
-</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/epg-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/epg-sidepanel.tpl.html
deleted file mode 100644 (file)
index bcbc96a..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-<md-content>
-       <div ng-if="selectedNode == null">
-               <div layout="row" class="layout-padding-lr15 layout-row">
-                       <ul class="breadcrumbs">
-                               <li class="breadcrumb">Endpoint-groups</li>
-                       </ul>
-               </div>
-               <md-divider></md-divider>
-               <md-divider></md-divider>
-           <md-subheader class="md-primary">Endpoint-groups ({{sidePanelObject.data.length}})</md-subheader>
-           <md-list>
-               <ng-repeat ng-repeat="epg in sidePanelObject.data">
-                       <md-list-item ng-click="openSidePanel('resolved-policy/epg-sidepanel', epg, null)" ng-mouseenter="highlightNode(epg.data.id)" ng-mouseleave="fadeAll()">
-                               {{epg.data.id}}
-                       </md-list-item>
-               </ng-repeat>
-           </md-list>
-       </div>
-       <div ng-if="selectedNode">
-               <div layout="row" class="layout-padding-lr15 layout-row">
-                       <ul class="breadcrumbs">
-                               <li class="breadcrumb" ng-click="deselectEpg()" role="button">Endpoint-groups</li>
-                               <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                               <li class="breadcrumb">{{selectedNode.data.id}}</li>
-                       </ul>
-               </div>
-               <md-divider></md-divider>
-               <md-divider></md-divider>
-               <md-subheader class="md-primary">Endpoint-group info</md-subheader>
-               <div layout="row" class="layout-padding-lr15 layout-row">
-                   <span flex="50" class="flex-50"><strong>Endpoint-group ID</strong></span>
-                   <span flex="" class="ng-binding flex">{{sidePanelObject.data.id}}</span>
-               </div>
-               <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
-                   <span flex="50" class="flex-50"><strong>intra-group-policy</strong></span>
-                   <span flex="" class="ng-binding flex">
-                       <i ng-class="sidePanelObject.data['intra-group-policy']" class="fa fa-circle status-circle flex-5" flex="5">
-                               <md-tooltip md-direction="right">
-                                       {{sidePanelObject.data['intra-group-policy']}}
-                               </md-tooltip>
-                       </i>
-                   </span>
-               </div>
-               <md-divider></md-divider>
-               <div ng-if="sidePanelObject.data['provider-named-selector']">
-                   <md-subheader class="md-primary">Provider-named selectors ({{sidePanelObject.data['provider-named-selector'].length}})</md-subheader>
-                   <md-list>
-                       <ng-repeat ng-repeat="providerNamedSelector in sidePanelObject.data['provider-named-selector']">
-                               <md-list-item class="expander" ng-click="openSidePanelContract(providerNamedSelector.contract[0])">
-                                       {{providerNamedSelector.name}}
-                                       <md-content class="md-whiteframe-2dp ng-scope layout-margin">
-                                               <div flex>
-                                                       <div layout="row" class="layout-row">
-                                                       <span flex="50" class="flex-50"><strong>Contract ID</strong></span>
-                                                               <span flex class="ng-binding flex">{{providerNamedSelector.contract[0]}}</span>
-                                                       </div>
-                                               </div>
-                                       </md-content>
-                               </md-list-item>
-                       </ng-repeat>
-                   </md-list>
-           </div>
-               <div ng-if="sidePanelObject.data['consumer-named-selector']">
-                   <md-subheader class="md-primary">Consumer-named selectors ({{sidePanelObject.data['consumer-named-selector'].length}})</md-subheader>
-                   <md-list>
-                       <ng-repeat ng-repeat="consumerNamedSelector in sidePanelObject.data['consumer-named-selector']">
-                               <md-list-item class="expander" ng-click="openSidePanelContract(consumerNamedSelector.contract[0]);">
-                                       {{consumerNamedSelector.name}}
-                                       <md-content class="md-whiteframe-2dp ng-scope layout-margin">
-                                               <div flex>
-                                                       <div layout="row" class="layout-row">
-                                                       <span flex="50" class="flex-50"><strong>Contract ID</strong></span>
-                                                               <span flex class="ng-binding flex">{{consumerNamedSelector.contract[0]}}</span>
-                                                       </div>
-                                               </div>
-                                       </md-content>
-                               </md-list-item>
-                       </ng-repeat>
-                   </md-list>
-           </div>
-           <md-divider></md-divider>
-           <md-subheader class="md-primary">
-               <div layout="row" class="layout-row">
-                       <span>Endpoints ({{endpoints.data.length}})</span>
-                       <span class="flex" flex></span>
-                       <span ng-if="endpoints.data.length">
-                               <md-button class="md-button md-primary md-button md-ink-ripple expand-button" type="button" ng-click="expandAll(endpoints.data)" aria-label="Expand all">            
-                           <i class="fa fa-expand ng-scope"></i>
-                               <div class="md-ripple-container"></div>
-                               <md-tooltip md-direction="bottom">
-                                       Expand all
-                               </md-tooltip>
-                       </md-button>
-                       <md-button class="md-button md-primary md-button md-ink-ripple expand-button" type="button" ng-click="collapseAll(endpoints.data)" aria-label="Collapse all">
-                                       <i class="fa fa-compress ng-scope"></i>
-                           <div class="md-ripple-container"></div>
-                               <md-tooltip md-direction="bottom">
-                                       Collapse all
-                               </md-tooltip>
-                       </md-button>
-               </span>
-               </div>
-           </md-subheader>
-           <md-list class="expander">
-               <ng-repeat ng-repeat="endpoint in endpoints.data">
-               <md-button class="md-icon-button" ng-click="rootOpenEndpointDialog('edit', endpoint)">
-                   <md-icon>edit</md-icon>
-               </md-button>
-               <md-button class="md-icon-button" ng-click="rootDeleteEndpointDialog(endpoint)">
-                   <md-icon>delete</md-icon>
-               </md-button>
-                       <md-list-item ng-click="toggleExpanded(endpoint)">
-                               <span>{{endpoint.data['context-id']}}</span>
-                               <md-content ng-show="endpoint.expanded" class="md-whiteframe-2dp ng-scope layout-margin">
-                                       <div flex>
-                                               <div layout="row" class="layout-row">
-                                               <span flex="50" class="flex-50"><strong>Context Type</strong></span>
-                                                       <span flex class="ng-binding flex">{{endpoint.data['context-type']}}</span>
-                                               </div>
-                                               <div layout="row" class="layout-row">
-                                               <span flex="50" class="flex-50"><strong>Address</strong></span>
-                                                       <span flex class="ng-binding flex">{{endpoint.data.address}}</span>
-                                               </div>
-                                               <div layout="row" class="layout-row">
-                                               <span flex="50" class="flex-50"><strong>Address Type</strong></span>
-                                                       <span flex class="ng-binding flex">{{endpoint.data['address-type']}}</span>
-                                               </div>
-                                               <div layout="row" class="layout-row">
-                                               <span flex="50" class="flex-50"><strong>Network Domain ID</strong></span>
-                                                       <span flex class="ng-binding flex">{{endpoint.data['network-containment']['network-domain-id']}}</span>
-                                               </div>
-                                               <div layout="row" class="layout-row">
-                                               <span flex="50" class="flex-50"><strong>Network Domain Type</strong></span>
-                                                       <span flex class="ng-binding flex">{{endpoint.data['network-containment']['network-domain-type']}}</span>
-                                               </div>
-                                               </div>
-                               </md-content>
-                       </md-list-item>
-               </ng-repeat>
-           </md-list>
-    </div>
-</md-content>
\ No newline at end of file
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy-list.service.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy-list.service.js
new file mode 100644 (file)
index 0000000..84f57d4
--- /dev/null
@@ -0,0 +1,203 @@
+define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
+    'use strict';
+
+    angular.module('app.gbp').service('ResolvedPolicyListService', ResolvedPolicyListService);
+
+    ResolvedPolicyListService.$inject = ['$filter', 'Restangular', 'ResolvedPolicyService'];
+
+    function ResolvedPolicyListService($filter, Restangular, ResolvedPolicyService) {
+        /* methods */
+        this.createList = createList;
+
+
+        function ResolvedPolicyList() {
+            /* properties */
+            this.data = [];
+
+            /* methods */
+            this.aggregateResolvedPolicies = aggregateResolvedPolicies;
+            this.get = get;
+            this.clearData = clearData;
+            this.setData = setData;
+
+            /* Implementation */
+            /**
+             * fills ResolvedPolicyList object with data
+             * @param data
+             */
+            function setData(data) {
+                var self = this;
+
+                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) {
+                        self.data = $filter('filter')(data['resolved-policies']['resolved-policy'], {
+                            'consumer-tenant-id': tenant,
+                            'provider-tenant-id': tenant,
+                        });
+                    }
+                    else {
+                        self.data = data['resolved-policies']['resolved-policy'];
+                    }
+
+                    successCallback();
+                });
+            }
+
+            /**
+             * Process resolved policies and returns object with epgs and contracts properties
+             * @returns {{epgs: {}, contracts: {}}}
+             */
+            function aggregateResolvedPolicies() {
+                var self = this,
+                    result = { epgs: {}, contracts: {} };
+
+                self.data.forEach(function (rp) {
+                    processEpg(result, rp, 'consumer');
+                    processEpg(result, rp, 'provider');
+
+                    if (rp.hasOwnProperty('policy-rule-group-with-endpoint-constraints')) {
+                        processConstraints(
+                            result,
+                            rp['policy-rule-group-with-endpoint-constraints'],
+                            rp['provider-epg-id'],
+                            rp['consumer-epg-id']
+                        );
+                    }
+                });
+
+                return result;
+
+            }
+
+            /**
+             * 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': [],
+                    };
+                }
+
+
+
+            }
+
+            /**
+             * 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);
+
+                        if (!returnValue.contracts.hasOwnProperty(linkId)) {
+                            returnValue.contracts[linkId] = {
+                                'contract-id': el['contract-id'],
+                                'linkId': linkId,
+                                'subjects': {},
+                                'type': '',
+                            };
+                        }
+
+                        if (!returnValue.contracts[linkId].subjects.hasOwnProperty(el['subject-name'])) {
+                            returnValue.contracts[linkId].subjects[el['subject-name']] = { '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');
+                    });
+                });
+            }
+
+            /**
+             * 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);
+            }
+        }
+
+        /**
+         * Creates ResolvedPolicyList object
+         * @param data
+         * @returns {ResolvedPolicyList}
+         */
+        function createList(data) {
+            var obj = new ResolvedPolicyList();
+
+            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;
+});
index 9815e0c6af6515e5ff5b88bbd71a18d4c112ac57..bcfe04ccf3b36d8dd8c66cd68fa177beee92eddf 100644 (file)
@@ -12,42 +12,39 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
 
         $scope.cbkFunctions = {
             clickNode: function(node){
-                var epg = EpgService.createObject();
-
-                epg.get(node['_data-id'], node['_model']['_data']['tenantId'], 'operational', function() {
-                    $scope.openSidePanel('resolved-policy/epg-sidepanel', epg, null);
-                });
+                var epg = $scope.resolvedPolicy.epgs[node['_model']['_id']];
 
+                epg.id = node['_model']['_id'];
+                $scope.openSidePanel('resolved-policy/sidepanel/views/epg-sidepanel', epg);
                 $scope.$apply();
-                $scope.parentTenant = node['_model']['_data']['tenantId'];
 
-                NextTopologyService.highlightNode($rootScope.nxTopology, node['_data-id']);
+                NextTopologyService.highlightNode($rootScope.nxTopology, node['_model']['_id']);
             },
             clickLink: function(link){
-                var resolvedContract = $scope.resolvedPolicy[link['_model']['_data'].id];
-                resolvedContract.linkId = link['_model']['_data'].id;
-                $scope.openSidePanel('resolved-policy/contract-sidepanel', resolvedContract, null);
+                var resolvedContract = $scope.resolvedPolicy.contracts[link['_model']['_id']];
+                resolvedContract.linkId = link['_model']['_id'];
+                $scope.openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', resolvedContract);
                 $scope.$apply();
 
-                NextTopologyService.highlightLink($rootScope.nxTopology, link['_model']['_data'].id);
+                NextTopologyService.highlightLink($rootScope.nxTopology, link['_model']['_id']);
             },
             topologyGenerated: function(){
             }
         };
 
-        function openSfcDialog(chainName) {
-            $mdDialog.show({
-                clickOutsideToClose: true,
-                controller: 'SfcTopologyController',
-                preserveScope: true,
-                templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
-                parent: angular.element(document.body),
-                scope: $scope,
-                locals: {
-                    chainName: chainName,
-                },
-            });
-        }
+        //function openSfcDialog(chainName) {
+        //    $mdDialog.show({
+        //        clickOutsideToClose: true,
+        //        controller: 'SfcTopologyController',
+        //        preserveScope: true,
+        //        templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
+        //        parent: angular.element(document.body),
+        //        scope: $scope,
+        //        locals: {
+        //            chainName: chainName,
+        //        },
+        //    });
+        //}
 
         function reloadTopology() {
             $scope.fillTopologyData();
index b05dbfce4b67d83ba4ac1876cfc6a2786629312d..27045bc7555d1a11ed4ab2c2ddc5170af300dde6 100644 (file)
@@ -3,9 +3,9 @@ define([], function() {
 
     angular.module('app.gbp').service('ResolvedPolicyService', ResolvedPolicyService);
 
-    ResolvedPolicyService.$inject = ['Restangular'];
+    ResolvedPolicyService.$inject = [];
 
-    function ResolvedPolicyService(Restangular) {
+    function ResolvedPolicyService() {
         /* methods */
         this.createObject = createObject;
 
@@ -14,24 +14,30 @@ define([], function() {
             /* properties */
             this.data = {};
             /* methods */
-            this.get = get;
+            this.setData = setData;
 
             /* Implementation */
 
-            function get(successCallback) {
-                var self = this;
+            function setData(data) {
+                this.data['consumer-tenant-id'] = data['consumer-tenant-id'];
+                this.data['consumer-epg-id'] = data['consumer-epg-id'];
+                this.data['provider-tenant-id'] = data['provider-tenant-id'];
+                this.data['provider-epg-id'] = data['provider-epg-id'];
+                this.data['policy-rule-group-with-endpoint-constraints'] =
+                    data['policy-rule-group-with-endpoint-constraints'];
+            }
 
-                var restObj = Restangular.one('restconf').one('operational').one('resolved-policy:resolved-policies');
 
-                return restObj.get().then(function(data) {
-                    self.data = data['resolved-policies']['resolved-policy'];
-                    successCallback();
-                });
-            }
         }
 
-        function createObject() {
-            return new ResolvedPolicy();
+        function createObject(data) {
+            var obj = new ResolvedPolicy();
+
+            if (data) {
+                obj.setData(data);
+            }
+
+            return obj;
         }
     }
 
index 4aae3b924848ee4bdccc89be3cc246a96a710f0c..42cbf7e630662fdfffd7278fdd820b8b3dd1c715 100644 (file)
@@ -1,5 +1,15 @@
-<div id="topology-container">
-    <md-button md-no-ink class="md-primary reload-button" ng-click="fillTopologyData()"><i class="material-icons">sync</i> Reload topology</md-button>
+<div id="topology-container" flex>
+    <section class="legendBox">
+        <md-button md-no-ink class="md-primary reload-button" ng-click="reloadTopology()">
+            <i class="material-icons">sync</i> Reload topology
+        </md-button>
+        <ul>
+            <li class="item"><span class="line green"></span>Allow</li>
+            <li class="item"><span class="line blue"></span>Chain</li>
+        </ul>
+    </section>
+
     <next-topology topology-data="topologyData" cbk-functions="cbkFunctions" dictionaries="nxDict" topo="nxTopology"
-               topo-colors="nxTopoColors"></next-topology>
+               topo-colors="nxTopoColors">
+    </next-topology>
 </div>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/rule-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/rule-sidepanel.tpl.html
deleted file mode 100644 (file)
index 93ff718..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-<md-content flex>
-       <div layout="row" class="layout-padding-lr15 layout-row">
-               <ul class="breadcrumbs">
-                       <li class="breadcrumb" ng-click="deselectContract()" role="button">Contracts</li>
-                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb" ng-click="openSidePanelTpl('contract')" role="button">{{selectedNode['contract-id']}}</li>
-                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb" ng-click="openSidePanelTpl('subject')" role="button">{{subjectIndex}}</li>
-                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb">{{selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].name}}</li>
-               </ul>
-       </div>
-       <md-divider></md-divider>
-       <md-divider></md-divider>
-       <md-subheader class="md-primary">Rule info</md-subheader>
-       <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
-           <span flex="50" class="flex-50"><strong>Resolved rule name</strong></span>
-           <span flex="" class="ng-binding flex">{{selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].name}}</span>
-       </div>
-       <md-divider></md-divider>
-       <md-subheader class="md-primary">
-               <div layout="row" class="layout-row">
-                       <span>Actions ({{selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action.length}})</span>
-                       <span ng-if="selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action.length">
-               </span>
-       </div>
-       </md-subheader>
-    <md-list class="expander">
-               <md-list-item class="md-3-line" layout="row"
-                                         ng-repeat="action in selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action">
-                       <div layout-padding flex="10">
-                               <h3>{{action.order}}</h3>
-                               <md-tooltip md-direction="right">
-                                       Order
-                               </md-tooltip>
-                       </div>
-                       <div class="md-list-item-text" flex>
-                               <h3>{{action.name}}</h3>
-                               <p>Action definition ID: {{action['action-definition-id']}} </p>
-                               <p>Name: {{action.name}} </p>
-                       </div>
-                       <div ng-if="action['action-definition-id'] === 'Action-Chain'" flex="10">
-                               <md-button class="md-icon-button" ng-click="openSfcDialog(action.name)">
-                                       <md-icon>visibility</md-icon>
-                               </md-button>
-                       </div>
-               </md-list-item>
-    </md-list>
-       <md-divider></md-divider>
-       <md-subheader class="md-primary">
-               <div layout="row" class="layout-row">
-                       <span>Classifiers ({{selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].classifier.length}})</span>
-                       <span class="flex" flex></span>
-                       <span ng-if="selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].classifier.length">
-                               <md-button class="md-button md-primary md-button md-ink-ripple expand-button" type="button" ng-click="expandAll(selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].classifier)" aria-label="Expand all">
-                           <i class="fa fa-expand ng-scope"></i>
-                               <div class="md-ripple-container"></div>
-                               <md-tooltip md-direction="bottom">
-                                       Expand all
-                               </md-tooltip>
-                       </md-button>
-                       <md-button class="md-button md-primary md-button md-ink-ripple expand-button" type="button" ng-click="collapseAll(selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].classifier)" aria-label="Collapse all">
-                                       <i class="fa fa-compress ng-scope"></i>
-                           <div class="md-ripple-container"></div>
-                               <md-tooltip md-direction="bottom">
-                                       Collapse all
-                               </md-tooltip>
-                       </md-button>
-               </span>
-       </div>
-       </md-subheader>
-    <md-list class="expander">
-       <ng-repeat ng-repeat="classifier in selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].classifier">
-               <md-list-item ng-click="toggleExpanded(classifier)">
-                       {{classifier.name}}
-                       <md-content ng-show="classifier.expanded" class="md-whiteframe-2dp ng-scope layout-margin">
-                               <div flex>
-                                       <div layout="row" class="layout-row">
-                                       <span flex="50" class="flex-50"><strong>Classifier definition ID</strong></span>
-                                               <span flex class="ng-binding flex">{{classifier['classifier-definition-id']}}</span>
-                                               </div>
-                                       <div layout="row" class="layout-row">
-                                       <span flex="50" class="flex-50"><strong>Name</strong></span>
-                                               <span flex class="ng-binding flex">{{classifier.name}}</span>
-                                               </div>
-                                       <div layout="row" class="layout-row">
-                                       <span flex="50" class="flex-50"><strong>Connection tracking</strong></span>
-                                               <span flex class="ng-binding flex">{{classifier['connection-tracking']}}</span>
-                                               </div>
-                                       <div layout="row" class="layout-row">
-                                       <span flex="50" class="flex-50"><strong>Direction</strong></span>
-                                               <span flex class="ng-binding flex">{{classifier.direction}}</span>
-                                               </div>
-                                       <md-subheader class="md-primary">Parameters ({{classifier['parameter-value'].length}})</md-subheader>
-                                       <div layout="row" class="layout-row" ng-repeat="param in classifier['parameter-value']">
-                                       <span flex="50" class="flex-50"><strong>{{param.name}}</strong></span>
-                                               <span flex class="ng-binding flex">{{param['int-value']}}</span>
-                                               </div>
-                                       </div>
-                       </md-content>
-               </md-list-item>
-       </ng-repeat>
-    </md-list>
-</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/contract-list-sidepanel.controller.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/contract-list-sidepanel.controller.js
new file mode 100644 (file)
index 0000000..6692db0
--- /dev/null
@@ -0,0 +1,17 @@
+define([], function() {
+    'use strict';
+
+    angular.module('app.gbp').controller('ContractListSidePanelController', ContractListSidePanelController);
+
+    ContractListSidePanelController.$inject = ['$scope'];
+
+    function ContractListSidePanelController($scope) {
+        $scope.fadeAll();
+
+        $scope.sidePanelContracts = Object.keys($scope.resolvedPolicy.contracts).map(function (k) {
+            var ob = $scope.resolvedPolicy.contracts[k];
+            return ob;
+        });
+        $scope.activeObject = 'contract';
+    }
+});
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/contract-sidepanel.controller.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/contract-sidepanel.controller.js
new file mode 100644 (file)
index 0000000..bff499c
--- /dev/null
@@ -0,0 +1,23 @@
+define([], function() {
+    'use strict';
+
+    angular.module('app.gbp').controller('ContractSidePanelController', ContractSidePanelController);
+
+    ContractSidePanelController.$inject = ['$scope'];
+
+    function ContractSidePanelController($scope) {
+        $scope.getObjectsCount = getObjectsCount;
+
+        /**
+         *
+         * @param obj
+         * @returns {*}
+         */
+        function getObjectsCount(obj) {
+            if(obj)
+                return Object.keys(obj).length;
+            else
+                return 0;
+        }
+    }
+});
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/epg-list-sidepanel.controller.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/epg-list-sidepanel.controller.js
new file mode 100644 (file)
index 0000000..62f2832
--- /dev/null
@@ -0,0 +1,19 @@
+define([], function() {
+    'use strict';
+
+    angular.module('app.gbp').controller('EpgListSidePanelController', EpgListSidePanelController);
+
+    EpgListSidePanelController.$inject = ['$scope'];
+
+    function EpgListSidePanelController($scope) {
+        $scope.fadeAll();
+
+        $scope.sidePanelEpgs = Object.keys($scope.resolvedPolicy.epgs).map(function (k) {
+            var ob = $scope.resolvedPolicy.epgs[k];
+            ob.id = k;
+
+            return ob;
+        });
+        $scope.activeObject = 'epg';
+    }
+});
\ No newline at end of file
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/epg-sidepanel.controller.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/epg-sidepanel.controller.js
new file mode 100644 (file)
index 0000000..2746509
--- /dev/null
@@ -0,0 +1,19 @@
+define([], function() {
+    'use strict';
+
+    angular.module('app.gbp').controller('EpgSidePanelController', EpgSidePanelController);
+
+    EpgSidePanelController.$inject = ['$scope', 'EndpointsListService'];
+
+    function EpgSidePanelController($scope, EndpointsListService) {
+        $scope.endpoints = EndpointsListService.createList();
+
+        function getEndpoints() {
+            if($scope.sidePanelObject)
+                $scope.endpoints.getByEpg($scope.sidePanelObject);
+        }
+
+        $scope.$watch('sidePanelObject', getEndpoints);
+        $scope.$on('endpointChanged', getEndpoints);
+    }
+});
similarity index 58%
rename from groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/clause-sidepanel.tpl.html
rename to groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/clause-sidepanel.tpl.html
index 871bb09b6f1f4be3392d9051b31a166741911256..1f4cf06f8173a20001acae1474f2a555ae5c847d 100644 (file)
@@ -1,11 +1,11 @@
 <md-content flex>
        <div layout="row" class="layout-padding-lr15 layout-row">
                <ul class="breadcrumbs">
-                       <li class="breadcrumb" ng-click="deselectContract()" role="button">Contracts</li>
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
                        <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb" ng-click="openSidePanelTpl('contract')" role="button">{{selectedNode.data.id}}</li>
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', sidePanelObject)" role="button">{{sidePanelObject.data.id}}</li>
                        <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb">{{selectedNode.data.clause[clauseIndex].name}}</li>
+                       <li class="breadcrumb">{{sidePanelObject.data.clause[innerObj.clause].name}}</li>
                </ul>
        </div>
        <md-divider></md-divider>
        <md-subheader class="md-primary">Clause info</md-subheader>
        <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
            <span flex="50" class="flex-50"><strong>Clause name</strong></span>
-           <span flex="" class="ng-binding flex">{{selectedNode.data.clause[clauseIndex].name}}</span>
+           <span flex="" class="ng-binding flex">{{sidePanelObject.data.clause[innerObj.clause].name}}</span>
        </div>
        <md-divider></md-divider>
-       <md-subheader class="md-primary">Subject refs ({{selectedNode.data.clause[clauseIndex]['subject-refs'].length}})</md-subheader>
+       <md-subheader class="md-primary">Subject refs ({{sidePanelObject.data.clause[innerObj.clause]['subject-refs'].length}})</md-subheader>
     <md-list>
-       <ng-repeat ng-repeat="ref in selectedNode.data.clause[clauseIndex]['subject-refs']">
+       <ng-repeat ng-repeat="ref in sidePanelObject.data.clause[innerObj.clause]['subject-refs']">
                <md-list-item ng-click="toggleExpanded(ref)">
                        {{ref}}
                        <md-content ng-show="ref.expanded" class="md-whiteframe-2dp ng-scope flex layout-margin">
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/contract-list-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/contract-list-sidepanel.tpl.html
new file mode 100644 (file)
index 0000000..7594587
--- /dev/null
@@ -0,0 +1,18 @@
+<md-content ng-controller="ContractListSidePanelController">
+       <div layout="row" class="layout-padding-lr15 layout-row">
+               <ul class="breadcrumbs">
+                       <li class="breadcrumb">Contracts</li>
+               </ul>
+       </div>
+       <md-divider></md-divider>
+       <md-divider></md-divider>
+    <md-subheader class="md-primary">Contracts list ({{sidePanelContracts.length}})</md-subheader>
+    <md-list>
+               <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', contract)"
+                                         ng-mouseenter="highlightLink(contract.linkId)"
+                                         ng-mouseleave="fadeAll()"
+                                         ng-repeat="contract in sidePanelContracts">
+                       {{contract['contract-id']}}
+               </md-list-item>
+    </md-list>
+</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/contract-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/contract-sidepanel.tpl.html
new file mode 100644 (file)
index 0000000..e62a3c7
--- /dev/null
@@ -0,0 +1,25 @@
+<md-content ng-controller="ContractSidePanelController">
+       <div layout="row" class="layout-padding-lr15 layout-row">
+               <ul class="breadcrumbs">
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb">{{sidePanelObject['contract-id']}}</li>
+               </ul>
+       </div>
+       <md-divider></md-divider>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">Contract info</md-subheader>
+       <div layout="row" class="layout-padding-lr15 layout-padding-b15 layout-row">
+           <span flex="50" class="flex-50"><strong>Contract ID</strong></span>
+           <span flex="" class="ng-binding flex">{{sidePanelObject['contract-id']}}</span>
+       </div>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">Subject list ({{getObjectsCount(sidePanelObject.subjects)}})</md-subheader>
+    <md-list>
+       <ng-repeat ng-repeat="(key, value) in sidePanelObject.subjects">
+               <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/subject-sidepanel', sidePanelObject, 'subject', key)">
+                       {{key}}
+               </md-list-item>
+       </ng-repeat>
+    </md-list>
+</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/epg-list-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/epg-list-sidepanel.tpl.html
new file mode 100644 (file)
index 0000000..f1b197b
--- /dev/null
@@ -0,0 +1,18 @@
+<md-content ng-controller="EpgListSidePanelController">
+       <div layout="row" class="layout-padding-lr15 layout-row">
+               <ul class="breadcrumbs">
+                       <li class="breadcrumb">Endpoint-groups</li>
+               </ul>
+       </div>
+       <md-divider></md-divider>
+       <md-divider></md-divider>
+    <md-subheader class="md-primary">Endpoint-groups ({{sidePanelEpgs.length}})</md-subheader>
+    <md-list>
+               <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/epg-sidepanel', epg)"
+                          ng-mouseenter="highlightNode(epg.id)"
+                          ng-mouseleave="fadeAll()"
+                                                 ng-repeat="epg in sidePanelEpgs">
+                   {{epg.id}}
+               </md-list-item>
+    </md-list>
+</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/epg-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/epg-sidepanel.tpl.html
new file mode 100644 (file)
index 0000000..6f84f13
--- /dev/null
@@ -0,0 +1,71 @@
+<md-content ng-controller="EpgSidePanelController">
+       <div layout="row" class="layout-padding-lr15 layout-row">
+               <ul class="breadcrumbs">
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/epg-list-sidepanel')" role="button">Endpoint-groups</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb">{{sidePanelObject.id}}</li>
+               </ul>
+       </div>
+       <md-divider></md-divider>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">Endpoint-group info</md-subheader>
+       <div layout="row" class="layout-padding-lr15 layout-padding-b15 layout-row">
+           <span flex="50" class="flex-50"><strong>Endpoint-group ID</strong></span>
+           <span flex="" class="ng-binding flex">{{sidePanelObject.id}}</span>
+       </div>
+       <md-divider></md-divider>
+       <div ng-if="sidePanelObject['provided-contracts'].length">
+           <md-subheader class="md-primary">Provided contracts ({{sidePanelObject['provided-contracts'].length}})</md-subheader>
+           <md-list>
+            <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', providedContract);"
+                          ng-repeat="providedContract in sidePanelObject['provided-contracts']"
+                          ng-mouseenter="highlightLink(providedContract.linkId)"
+                          ng-mouseleave="highlightNode(sidePanelObject.id)"
+                          >
+                {{providedContract['contract-id']}}
+            </md-list-item>
+           </md-list>
+    </div>
+       <div ng-if="sidePanelObject['consumed-contracts'].length">
+           <md-subheader class="md-primary">Consumed contracts ({{sidePanelObject['consumed-contracts'].length}})</md-subheader>
+           <md-list>
+            <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', consumedContract);"
+                          ng-repeat="consumedContract in sidePanelObject['consumed-contracts']"
+                          ng-mouseenter="highlightLink(consumedContract.linkId)"
+                          ng-mouseleave="highlightNode(sidePanelObject.id)"
+                          >
+                {{consumedContract['contract-id']}}
+            </md-list-item>
+           </md-list>
+    </div>
+    <md-divider></md-divider>
+    <md-subheader class="md-primary">
+               <div layout="row" class="layout-row">
+                       <span>Endpoints ({{endpoints.data.length}})</span>
+       </div>
+    </md-subheader>
+    <md-list class="expander">
+               <md-list-item class="md-4-line" layout="row" ng-repeat="endpoint in endpoints.data">
+                       <div layout-padding flex="15">
+                               <h3>{{endpoint.getEndpointContextTypeAcronym()}}</h3>
+                               <md-tooltip md-direction="right">{{endpoint.data['context-type']}}</md-tooltip>
+                       </div>
+                       <div class="md-list-item-text" flex="60">
+                               <h3>{{endpoint.data['context-id']}}</h3>
+                               <p>Address: {{endpoint.data.address}} </p>
+                               <p>Network Domain: {{endpoint.data['network-containment']['network-domain-id']}} </p>
+                <p>SGT: {{endpointSgtList.findSgtsForEndpoint(endpoint)}} </p>
+                       </div>
+                       <div flex="10">
+                               <md-button class="md-icon-button" ng-click="rootOpenEndpointDialog('edit', endpoint)">
+                                       <md-icon>edit</md-icon>
+                               </md-button>
+                       </div>
+                       <div flex="10">
+                               <md-button class="md-icon-button" ng-click="rootDeleteEndpointDialog(endpoint)">
+                                       <md-icon>delete</md-icon>
+                               </md-button>
+                       </div>
+               </md-list-item>
+    </md-list>
+</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/rule-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/rule-sidepanel.tpl.html
new file mode 100644 (file)
index 0000000..31bc120
--- /dev/null
@@ -0,0 +1,74 @@
+<md-content flex>
+       <div layout="row" class="layout-padding-lr15 layout-row">
+               <ul class="breadcrumbs">
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', sidePanelObject)" role="button">{{sidePanelObject['contract-id']}}</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/subject-sidepanel', sidePanelObject)" role="button">{{innerObj.subject}}</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb">{{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].name}}</li>
+               </ul>
+       </div>
+       <md-divider></md-divider>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">Rule info</md-subheader>
+       <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
+           <span flex="50" class="flex-50"><strong>Resolved rule name</strong></span>
+           <span flex="" class="ng-binding flex">{{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].name}}</span>
+       </div>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">
+               <div layout="row" class="layout-row">
+                       <span>Actions ({{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].action.length}})</span>
+                       <span ng-if="sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].action.length">
+               </span>
+       </div>
+       </md-subheader>
+    <md-list>
+               <md-list-item class="md-4-line" layout="row"
+                                         ng-repeat="action in sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].action">
+                       <div layout-padding flex="10">
+                               <h3>{{action.order}}</h3>
+                               <md-tooltip md-direction="right">
+                                       Order
+                               </md-tooltip>
+                       </div>
+                       <div class="md-list-item-text" flex>
+                               <h3>{{action.name}}</h3>
+                               <p>Action definition ID: {{action['action-definition-id']}} </p>
+                               <p ng-if="action['action-definition-id'] === 'Action-Chain'">Parameter name: {{action['parameter-value'][0].name}} </p>
+                <p ng-if="action['action-definition-id'] === 'Action-Chain'">Parameter value: {{action['parameter-value'][0]['string-value']}} </p>
+                       </div>
+                       <div ng-if="action['action-definition-id'] === 'Action-Chain'" flex="10">
+                               <md-button class="md-icon-button margin-lr0" ng-click="openSfcDialog(action['parameter-value'][0]['string-value'])">
+                                       <md-icon>visibility</md-icon>
+                               </md-button>
+                       </div>
+               </md-list-item>
+    </md-list>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">
+               <div layout="row" class="layout-row">
+                       <span>Classifiers ({{sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].classifier.length}})</span>
+                       <span class="flex" flex></span>
+       </div>
+       </md-subheader>
+    <md-list class="expander">
+               <md-list-item ng-repeat="classifier in sidePanelObject.subjects[innerObj.subject]['resolved-rule'][innerObj.rule].classifier"
+                                         class="md-4-line">
+            <div layout-padding flex="15">
+                <h3>{{classifier.direction}}</h3>
+                <md-tooltip md-direction="right">
+                    Direction
+                </md-tooltip>
+            </div>
+                       <div class="md-list-item-text" flex="80">
+                               <h3>{{classifier.name}}</h3>
+                               <p>Classifier definition ID: {{classifier['classifier-definition-id']}} </p>
+                               <p>Connection tracking: {{classifier['connection-tracking']}} </p>
+                               <p ng-repeat="param in classifier['parameter-value']">{{param.name}}: {{param['int-value']}} </p>
+                       </div>
+               </md-list-item>
+    </md-list>
+</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/subject-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/sidepanel/views/subject-sidepanel.tpl.html
new file mode 100644 (file)
index 0000000..1ceceb3
--- /dev/null
@@ -0,0 +1,30 @@
+<md-content flex>
+       <div layout="row" class="layout-padding-lr15 layout-row">
+               <ul class="breadcrumbs">
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-list-sidepanel')" role="button">Contracts</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb" ng-click="openSidePanel('resolved-policy/sidepanel/views/contract-sidepanel', sidePanelObject)" role="button">{{sidePanelObject['contract-id']}}</li>
+                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
+                       <li class="breadcrumb">{{innerObj.subject}}</li>
+               </ul>
+       </div>
+       <md-divider></md-divider>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">Subject info</md-subheader>
+       <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
+           <span flex="50" class="flex-50"><strong>Subject name</strong></span>
+           <span flex="" class="ng-binding flex">{{innerObj.subject}}</span>
+       </div>
+       <md-divider></md-divider>
+       <md-subheader class="md-primary">Resolved rule list ({{sidePanelObject.subjects[innerObj.subject]['resolved-rule'].length}})</md-subheader>
+    <md-list>
+       <ng-repeat ng-repeat="(key, rule) in sidePanelObject.subjects[innerObj.subject]['resolved-rule'] | orderBy: 'order'">
+               <md-list-item ng-click="openSidePanel('resolved-policy/sidepanel/views/rule-sidepanel', sidePanelObject, 'rule', key)">
+                       <span class="layout-padding-r10">
+                           <h4 class="order">{{rule.order}}</h4>
+                       </span>
+                       <span>{{rule.name}}</span>
+               </md-list-item>
+       </ng-repeat>
+    </md-list>
+</md-content>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/subject-sidepanel.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/subject-sidepanel.tpl.html
deleted file mode 100644 (file)
index c91f82c..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<md-content flex>
-       <div layout="row" class="layout-padding-lr15 layout-row">
-               <ul class="breadcrumbs">
-                       <li class="breadcrumb" ng-click="deselectContract()" role="button">Contracts</li>
-                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb" ng-click="openSidePanelTpl('contract')" role="button">{{selectedNode['contract-id']}}</li>
-                       <li class="breadcrumb"><i class="material-icons">keyboard_arrow_right</i></li>
-                       <li class="breadcrumb">{{subjectIndex}}</li>
-               </ul>
-       </div>
-       <md-divider></md-divider>
-       <md-divider></md-divider>
-       <md-subheader class="md-primary">Subject info</md-subheader>
-       <div layout="row" class="layout-padding-lr15 layout-row layout-padding-b15">
-           <span flex="50" class="flex-50"><strong>Subject name</strong></span>
-           <span flex="" class="ng-binding flex">{{subjectIndex}}</span>
-       </div>
-       <md-divider></md-divider>
-       <md-subheader class="md-primary">Resolved rule list ({{selectedNode.subjects[subjectIndex]['resolved-rule'].length}})</md-subheader>
-    <md-list>
-       <ng-repeat ng-repeat="rule in selectedNode.subjects[subjectIndex]['resolved-rule'][0] | orderBy: 'order'">
-               <md-list-item ng-click="openSidePanelChild($index, 'rule')">
-                       <span class="layout-padding-r10">
-                           <h4 class="order">{{rule.order}}</h4>
-                       </span>
-                       <span>{{rule.name}}</span>
-               </md-list-item>
-       </ng-repeat>
-    </md-list>
-</md-content>
\ No newline at end of file
index 203f4c53a33d2f265719265fa1e549c460829381..6a64875ba99fd271bb7c04117e810b2018ca6865 100644 (file)
@@ -9,18 +9,7 @@ define([
     /* @ngInject */
     function SfcTopologyController($filter, $mdDialog, $scope, chainName, SfcService) {
         /* properties */
-        $scope.chain = SfcService.createObject({name: 'SFCGBP'});
-        $scope.topologyDataSfc = {nodes:[], links:[]};
-        $scope.cbkFunctionsSfc = {
-            clickNode: function(node){
-
-            },
-            clickLink: function(link){
-
-            },
-            topologyGenerated: function(){
-            }
-        };
+        $scope.chain = SfcService.createObject({name: chainName});
 
         /* methods */
         $scope.closeDialog = closeDialog;
@@ -38,52 +27,66 @@ define([
             $mdDialog.cancel();
         }
 
-        function fillTopologyDataSfc() {
-            var topoData = {nodes:[], links:[]};
-            $scope.chain.data['sfc-service-function'].forEach(function(sf) {
-                topoData.nodes.push({id: sf.name, 'node-id': sf.name, label: sf.name, type: sf.name});
-            })
-
-            $scope.topologyDataSfc = topoData;
+        function nodeTooltip() {
+            nx.define('MyNodeTooltip', nx.ui.Component, {
+                properties: {
+                    node: {},
+                    topology: {},
+                },
+                view: {
+                    content: [{
+                        tag: 'p',
+                        content: [{
+                            tag: 'label',
+                            content: '{#node.model.data.type}',
+                        }],
+                    }],
+                },
+            });
         }
 
         $scope.viewTopology = function() {
+            nodeTooltip();
             $scope.topologySfc = new nx.graphic.Topology({
                 height: 400,
                 width: 600,
                 scalable: true,
-                theme:'blue',
-                enableGradualScaling:true,
+                theme: 'blue',
+                enableGradualScaling: true,
                 nodeConfig: {
                     color: '#0386d2',
-                    label: 'model.label',
-                    //scale: 'model.scale',
-                    iconType: function(vertex) {
+                    //label: 'model.label',
+                    label: function (vertex) {
+                        return vertex.get().label + ' (' + vertex.get().type + ')';
+                    },
+                    scale: 'model.scale',
+                    iconType: function (vertex) {
                         var type = vertex.get().type;
                         switch (type) {
-                            case 'service-function-type:firewall':
+                            case 'firewall':
                                 return 'firewall';
-                            case 'service-function-type:dpi':
+                            case 'dpi':
                                 return 'accesspoint';
+                            case 'qos':
+                                return 'wlc';
                             default:
                                 return 'unknown';
                         }
-                    }
+                    },
                 },
                 linkConfig: {
                     label: 'model.label',
                     linkType: 'parallel',
                     color: '#0386d2',
-                    width: 5
+                    width: 5,
                 },
                 showIcon: true,
-                //dataProcessor: 'force',
-                //autoLayout: true,
                 enableSmartNode: false,
                 tooltipManagerConfig: {
+                    showLinkTooltip: false,
                     showNodeTooltip: false,
-                    showLinkTooltip: false
-                }
+                    //nodeTooltipContentClass: 'MyNodeTooltip',
+                },
             });
             $scope.app =  new nx.ui.Application;
 
@@ -94,20 +97,20 @@ define([
                 nodes.push({
                     id: sf.name,
                     label: sf.name,
-                    type: sf.type,
-                    x: 100*(index+1),
-                    y: 400
+                    type: SfcService.getSfTypeShort(sf.type),
+                    x: 100 * (index + 1),
+                    y: 400,
                 });
 
                 index>0 && links.push({
-                    source: index-1,
-                    target: index
+                    source: index - 1,
+                    target: index,
                 });
             })
 
             $scope.topologySfc.data({
                 nodes: nodes,
-                links: links
+                links: links,
             });
 
             $scope.app.container(document.getElementById('next-vpp-topo'));
index ff70793a0a5e1e63e4cd69538f4e05b59e9f6a59..935f7668c57ceae00f3c593728a87463a424b9f2 100644 (file)
@@ -8,6 +8,7 @@ define([], function () {
     function SfcService(Restangular) {
         /* methods */
         this.createObject = createObject;
+        this.getSfTypeShort = getSfTypeShort;
 
         /**
          * Sfc constructor
@@ -28,7 +29,9 @@ define([], function () {
              */
 
             function setData(data) {
-                this.data = data;
+                this.data.name = data.name;
+                this.data.symmetric = data.symmetric;
+                this.data['sfc-service-function'] = data['sfc-service-function'];
             }
             /**
              * gets one Sfc object from Restconf
@@ -67,6 +70,10 @@ define([], function () {
 
             return obj;
         }
+
+        function getSfTypeShort(sfType) {
+            return sfType.replace('service-function-type:', '').trim();
+        }
     }
 
     return SfcService;
index 48290785245513eb4efe33122d43157361fe21b8..aefa5ba6aa6a3ba170529f03b7f3cbce87bd6ee1 100644 (file)
@@ -62,7 +62,7 @@ class DestinationMapperUtils {
     }
 
     L3Context getL3ContextForSubnet(IndexedTenant indexedTenant, Subnet subnet) {
-        if (indexedTenant == null || subnet.getParent() == null) {
+        if (indexedTenant == null || subnet == null || subnet.getParent() == null) {
             return null;
         }
         return indexedTenant.resolveL3Context(new L2FloodDomainId(subnet.getParent().getValue()));
index 8605c94db5d9845f2efcf3578542648b3bea49a5..01de864bc0c0192c816da57414389d6b27dd92e1 100644 (file)
@@ -1,9 +1,45 @@
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.destination;
 
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyShort;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.ARP;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.IPv4;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.IPv6;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.RegMatch;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.addNxRegMatch;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.applyActionIns;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.bytesFromHexString;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.decNwTtlAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.ethernetMatch;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.gotoTableIns;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.groupAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpOpAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpShaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadArpSpaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadRegAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIPv4Action;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxLoadTunIdAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveArpShaToArpThaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveArpSpaToArpTpaAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxMoveEthSrcToEthDstAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.outputAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.setDlDstAction;
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.setDlSrcAction;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
 import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
 import org.opendaylight.groupbasedpolicy.dto.PolicyInfo;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
@@ -16,7 +52,6 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.OrdinalFactory;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.MapperUtilsTest;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
@@ -30,7 +65,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.M
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
@@ -39,6 +73,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.PolicyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
@@ -58,25 +93,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev14
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg7;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-import java.lang.reflect.Field;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.mockito.Mockito.*;
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.*;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ OrdinalFactory.class })
 public class DestinationMapperFlowsTest extends MapperUtilsTest {
 
     private DestinationMapperFlows flows;
+    private DestinationMapperUtils utils;
+    private Tenant tenant;
+    private IndexedTenant indexedTenant;
 
     @Before
     public void init() throws Exception {
@@ -85,9 +108,19 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         policyInfo = mock(PolicyInfo.class);
         ctx = mock(OfContext.class);
         ofWriter = mock(OfWriter.class);
+
         tableId = 3;
-        flows = new DestinationMapperFlows(new DestinationMapperUtils(ctx), NODE_ID, tableId);
-        resetPolicyOrdinalCounterValue();
+
+        tenant = buildTenant().build();
+        indexedTenant = new IndexedTenant(tenant);
+
+        when(ctx.getTenant(TENANT_ID)).thenReturn(indexedTenant);
+        when(ctx.getEndpointManager()).thenReturn(endpointManager);
+        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
+
+        utils = new DestinationMapperUtils(ctx);
+        flows = new DestinationMapperFlows(utils, NODE_ID, tableId);
+        OrdinalFactory.resetPolicyOrdinalValue();
     }
 
     @Test
@@ -141,14 +174,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         externalConnectors.add(new NodeConnectorId(CONNECTOR_0));
         externalConnectors.add(new NodeConnectorId(CONNECTOR_1));
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createExternalL2Flow(tableId, 100, endpointBuilder.build(), externalConnectors, ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -158,12 +185,12 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         Set<NodeConnectorId> externalConnectors = new HashSet<>();
         externalConnectors.add(new NodeConnectorId(OPENFLOW + CONNECTOR_0.getValue()));
         externalConnectors.add(new NodeConnectorId(OPENFLOW + CONNECTOR_1.getValue()));
-        Endpoint endpoint = endpointBuilder.build();
-
+        Endpoint endpoint = endpointBuilder.setTenant(tenant.getId()).build();
 
-        MatchBuilder matchBuilder = new MatchBuilder()
-                .setEthernetMatch(ethernetMatch(null, endpoint.getMacAddress(), null));
-        addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg4.class, (long) 3));
+        MatchBuilder matchBuilder =
+                new MatchBuilder().setEthernetMatch(ethernetMatch(null, endpoint.getMacAddress(), null));
+        OrdinalFactory.EndpointFwdCtxOrdinals ord = utils.getEndpointOrdinals(endpoint);
+        addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg4.class, (long) ord.getBdId()));
         Match match = matchBuilder.build();
 
         List<Action> applyActions = new ArrayList<>();
@@ -173,11 +200,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
 
         ArrayList<Instruction> instructions = new ArrayList<>();
         instructions.add(applyActionsIns);
@@ -188,14 +213,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         FlowId flowId = FlowIdUtils.newFlowId(tableId, "externalL2", match);
         Flow flow = buildFlow(flowId, tableId, 100, match, instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createExternalL2Flow(tableId, 100, endpointBuilder.build(), externalConnectors, ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -211,16 +230,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         externalConnectors.add(new NodeConnectorId(CONNECTOR_0));
         externalConnectors.add(new NodeConnectorId(CONNECTOR_1));
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createExternalL3RoutedFlow(tableId, 90, endpoint, gateway, l3AddressBuilder.build(), externalConnectors,
                 ofWriter);
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verifyZeroInteractions(ofWriter);
     }
 
@@ -236,16 +248,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         externalConnectors.add(new NodeConnectorId(CONNECTOR_0));
         externalConnectors.add(new NodeConnectorId(CONNECTOR_1));
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createExternalL3RoutedFlow(tableId, 90, endpoint, gateway, l3AddressBuilder.build(), externalConnectors,
                 ofWriter);
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verifyZeroInteractions(ofWriter);
     }
 
@@ -271,18 +276,16 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         applyActions.addAll(l3ApplyActions);
 
         MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, MAC_1, IPv4))
-                .setLayer3Match(new Ipv4MatchBuilder()
-                .setIpv4Destination(new Ipv4Prefix(IPV4_0.getValue() + IP_PREFIX_32)).build());
+            .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix(IPV4_0.getValue() + IP_PREFIX_32))
+                .build());
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
@@ -292,16 +295,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         FlowId flowid = FlowIdUtils.newFlowId(tableId, "externalL3", match);
         Flow flow = buildFlow(flowid, tableId, 90, match, instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createExternalL3RoutedFlow(tableId, 90, endpoint, gateway, l3AddressBuilder.build(), externalConnectors,
                 ofWriter);
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -327,18 +323,16 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         applyActions.addAll(l3ApplyActions);
 
         MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, MAC_1, IPv6))
-                .setLayer3Match(new Ipv6MatchBuilder()
-                .setIpv6Destination(new Ipv6Prefix(IPV6_1.getValue() + IP_PREFIX_128)).build());
+            .setLayer3Match(new Ipv6MatchBuilder().setIpv6Destination(new Ipv6Prefix(IPV6_1.getValue() + IP_PREFIX_128))
+                .build());
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 0));
         Match match = matchBuilder.build();
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
@@ -348,16 +342,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         FlowId flowid = FlowIdUtils.newFlowId(tableId, "externalL3", match);
         Flow flow = buildFlow(flowid, tableId, 90, match, instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createExternalL3RoutedFlow(tableId, 90, endpoint, gateway, l3AddressBuilder.build(), externalConnectors,
                 ofWriter);
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -366,15 +353,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1, MAC_0, CONNECTOR_0);
         Endpoint endpoint = endpointBuilder.build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createLocalL2Flow(tableId, 80, endpoint, ofWriter);
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verifyZeroInteractions(ofWriter);
     }
 
@@ -383,7 +363,7 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         NodeConnectorId connectorId = new NodeConnectorId(OPENFLOW + CONNECTOR_0.getValue());
         EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1, MAC_0, connectorId);
         endpointBuilder.setNetworkContainment(SUBNET_0);
-        Endpoint endpoint = endpointBuilder.build();
+        Endpoint endpoint = endpointBuilder.setTenant(tenant.getId()).build();
 
         List<Action> applyActions = new ArrayList<>();
         applyActions.add(nxLoadRegAction(NxmNxReg2.class, BigInteger.valueOf(1)));
@@ -392,11 +372,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
 
         ArrayList<Instruction> instructions = new ArrayList<>();
         instructions.add(applyActionsIns);
@@ -404,23 +382,17 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
         instructionsBuilder.setInstruction(instructions);
 
-        MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, endpoint.getMacAddress(),
-                null));
-        addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg4.class, (long) 3));
+        MatchBuilder matchBuilder =
+                new MatchBuilder().setEthernetMatch(ethernetMatch(null, endpoint.getMacAddress(), null));
+        OrdinalFactory.EndpointFwdCtxOrdinals ord = utils.getEndpointOrdinals(endpoint);
+        addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg4.class, (long) ord.getBdId()));
         Match match = matchBuilder.build();
 
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "localL2", match), tableId, 80, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createLocalL2Flow(tableId, 80, endpoint, ofWriter);
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -457,12 +429,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         destSubnetBuilder.setId(SUBNET_1);
         Subnet destSubnet = destSubnetBuilder.build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-
         flows.createLocalL3RoutedFlow(tableId, 80, endpoint, null, localSubnet, destSubnet, ofWriter);
-        verify(ctx, times(1)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -487,12 +455,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         destSubnetBuilder.setParent(L2FD_ID);
         Subnet destSubnet = destSubnetBuilder.build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-
         flows.createLocalL3RoutedFlow(tableId, 80, endpoint, null, localSubnet, destSubnet, ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -518,14 +482,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         l3AddressBuilder.setIpAddress(null);
         L3Address l3Address = l3AddressBuilder.build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createLocalL3RoutedFlow(tableId, 80, endpoint, l3Address, localSubnet, destSubnet, ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -568,17 +526,16 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
 
         MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, destMac, IPv4))
-                .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix(IPV4_0.getValue() + IP_PREFIX_32)).build());
+            .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix(IPV4_0.getValue() + IP_PREFIX_32))
+                .build());
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
@@ -587,14 +544,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "localL3", match), tableId, 80, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createLocalL3RoutedFlow(tableId, 80, endpoint, l3Address, localSubnet, destSubnet, ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -604,7 +555,7 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         MacAddress destMac = DestinationMapper.ROUTER_MAC;
         OfOverlayContextBuilder ofOverlayContextBuilder = new OfOverlayContextBuilder();
         ofOverlayContextBuilder.setNodeConnectorId(connectorId);
-        EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1,MAC_1, connectorId);
+        EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1, MAC_1, connectorId);
         endpointBuilder.addAugmentation(OfOverlayContext.class, ofOverlayContextBuilder.build());
         endpointBuilder.setTenant(getTestIndexedTenant().getTenant().getId());
         endpointBuilder.setNetworkContainment(SUBNET_0);
@@ -637,17 +588,16 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
 
         MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, destMac, IPv6))
-                .setLayer3Match(new Ipv6MatchBuilder().setIpv6Destination(new Ipv6Prefix(IPV6_1.getValue() + IP_PREFIX_128)).build());
+            .setLayer3Match(new Ipv6MatchBuilder().setIpv6Destination(new Ipv6Prefix(IPV6_1.getValue() + IP_PREFIX_128))
+                .build());
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
@@ -656,14 +606,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "localL3", match), tableId, 80, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createLocalL3RoutedFlow(tableId, 80, endpoint, l3Address, localSubnet, destSubnet, ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -671,15 +615,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
     public void createRemoteL2Flow_exceptionCaught() {
         EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1, MAC_1, CONNECTOR_0);
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createRemoteL2Flow(tableId, 70, endpointBuilder.build(), null, null, new NodeConnectorId(CONNECTOR_1),
                 ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -687,8 +625,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
     public void createRemoteL2Flow_ipV4() {
         NodeConnectorId connectorId = new NodeConnectorId(OPENFLOW + CONNECTOR_1.getValue());
         IpAddress ipAddress = new IpAddress(IPV4_0);
-        EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_1, CONNECTOR_0);
-        EndpointBuilder peerEndpointBuilder = buildEndpoint(IPV4_1, MAC_0, CONNECTOR_1);
+        Endpoint endpoint = buildEndpoint(IPV4_0, MAC_1, CONNECTOR_0).setTenant(tenant.getId()).build();
+        Endpoint peerEndpoint = buildEndpoint(IPV4_1, MAC_0, CONNECTOR_1).build();
 
         List<Action> applyActions = new ArrayList<>();
         applyActions.add(nxLoadRegAction(NxmNxReg2.class, BigInteger.valueOf(1)));
@@ -698,11 +636,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
 
         int order = 0;
         Instruction applyActionsIns = new InstructionBuilder().setOrder(order++)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(order)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(order).setInstruction(gotoTableIns(tableId)).build();
 
         ArrayList<Instruction> instructions = new ArrayList<>();
         instructions.add(applyActionsIns);
@@ -710,23 +646,16 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
         instructionsBuilder.setInstruction(instructions);
 
-        MatchBuilder matchBuilder = new MatchBuilder()
-                .setEthernetMatch(ethernetMatch(null, MAC_0, null));
-        addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg4.class, (long) 3));
+        MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, MAC_0, null));
+        OrdinalFactory.EndpointFwdCtxOrdinals ord = utils.getEndpointOrdinals(endpoint);
+        addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg4.class, (long) ord.getBdId()));
         Match match = matchBuilder.build();
 
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "remoteL2", match), tableId, 70, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
+        flows.createRemoteL2Flow(tableId, 70, endpoint, peerEndpoint, ipAddress, connectorId, ofWriter);
 
-        flows.createRemoteL2Flow(tableId, 70, endpointBuilder.build(), peerEndpointBuilder.build(), ipAddress,
-                connectorId, ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -737,15 +666,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1, MAC_1, CONNECTOR_0);
         EndpointBuilder peerEndpointBuilder = buildEndpoint(IPV6_2, MAC_0, CONNECTOR_0);
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createRemoteL2Flow(tableId, 70, endpointBuilder.build(), peerEndpointBuilder.build(), ipAddress,
                 connectorId, ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -774,14 +697,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         localSubnetBuilder.setParent(L2FD_ID);
         Subnet localSubnet = localSubnetBuilder.build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, null, destSubnet, null, null, localSubnet, ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(2)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -802,14 +719,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         localSubnetBuilder.setParent(L2FD_ID);
         Subnet localSubnet = localSubnetBuilder.build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, null, destSubnet, null, null, localSubnet, ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -817,11 +728,10 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
     public void createRemoteL3RoutedFlow_incorrectPortId() {
         IpAddress ipAddress = new IpAddress(IPV4_0);
         NodeConnectorId connectorId = new NodeConnectorId(CONNECTOR_0);
-        EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1,MAC_1,CONNECTOR_0);
+        EndpointBuilder endpointBuilder = buildEndpoint(IPV6_1, MAC_1, CONNECTOR_0);
         endpointBuilder.setNetworkContainment(SUBNET_0);
         Endpoint endpoint = endpointBuilder.build();
 
-
         SubnetBuilder destSubnetBuilder = new SubnetBuilder();
         destSubnetBuilder.setId(SUBNET_1);
         destSubnetBuilder.setParent(L2FD_ID);
@@ -832,15 +742,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         localSubnetBuilder.setVirtualRouterIp(new IpAddress(IPV4_1));
         Subnet localSubnet = localSubnetBuilder.build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, null, destSubnet, ipAddress, connectorId, localSubnet,
                 ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -877,11 +781,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         applyActions.add(nxLoadTunIPv4Action(IPV4_1.getValue(), false));
         applyActions.addAll(l3ApplyActions);
         Instruction applyActionsIns = new InstructionBuilder().setOrder(0)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(1)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(1).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
@@ -889,22 +791,17 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         instructionsBuilder.setInstruction(l3instructions);
 
         MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, routerMac, IPv4))
-                .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix(IPV4_1.getValue() + IP_PREFIX_32)).build());
+            .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix(IPV4_1.getValue() + IP_PREFIX_32))
+                .build());
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
 
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "remoteL3", match), tableId, 60, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
+        flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, l3Address, destSubnet, ipAddress, connectorId,
+                localSubnet, ofWriter);
 
-        flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, l3Address, destSubnet, ipAddress, connectorId, localSubnet,
-                ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(eq(NODE_ID), eq(tableId), eq(flow));
     }
 
@@ -929,15 +826,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         localSubnetBuilder.setVirtualRouterIp(new IpAddress(IPV4_1));
         Subnet localSubnet = localSubnetBuilder.build();
 
-        when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
+        flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, l3Address, destSubnet, ipAddress, connectorId,
+                localSubnet, ofWriter);
 
-        flows.createRemoteL3RoutedFlow(tableId, 60, endpoint, l3Address, destSubnet, ipAddress, connectorId, localSubnet,
-                ofWriter);
-        verify(ctx, times(4)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verifyZeroInteractions(ofWriter);
     }
 
@@ -959,8 +850,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         subnetBuilder.setVirtualRouterIp(new IpAddress(IPV4_0));
 
         MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null, null, ARP))
-                .setLayer3Match(new ArpMatchBuilder().setArpOp(1)
-                        .setArpTargetTransportAddress(new Ipv4Prefix(IPV4_0.getValue() + IP_PREFIX_32)).build());
+            .setLayer3Match(new ArpMatchBuilder().setArpOp(1)
+                .setArpTargetTransportAddress(new Ipv4Prefix(IPV4_0.getValue() + IP_PREFIX_32))
+                .build());
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
 
@@ -983,10 +875,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "routerarp", match), tableId, 50, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
         flows.createRouterArpFlow(50, tenant, subnetBuilder.build(), ofWriter);
 
-        verify(ctx, times(1)).getEndpointManager();
         verify(ofWriter, times(1)).writeFlow(any(NodeId.class), anyShort(), eq(flow));
     }
 
@@ -998,11 +888,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         subnetBuilder.setParent(L2FD_ID);
         subnetBuilder.setVirtualRouterIp(new IpAddress(IPV6_1));
 
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-
         flows.createRouterArpFlow(50, tenant, subnetBuilder.build(), ofWriter);
 
-        verify(ctx, times(1)).getEndpointManager();
         verifyZeroInteractions(ofWriter);
     }
 
@@ -1012,21 +899,10 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_1, CONNECTOR_1);
         endpointBuilder.setTenant(buildTenant().getId());
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         OrdinalFactory.EndpointFwdCtxOrdinals ordinals = utils.getEndpointOrdinals(endpointBuilder.build());
 
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(1)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
-
-        MatchBuilder matchBuilder = new MatchBuilder()
-                .setEthernetMatch(new EthernetMatchBuilder()
-                        .setEthernetDestination(new EthernetDestinationBuilder().setAddress(MAC_0)
-                                .setMask(MAC_0).build())
-                        .build());
+        MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(new EthernetMatchBuilder()
+            .setEthernetDestination(new EthernetDestinationBuilder().setAddress(MAC_0).setMask(MAC_0).build()).build());
         addNxRegMatch(matchBuilder, FlowUtils.RegMatch.of(NxmNxReg5.class, (long) ordinals.getFdId()));
         Match match = matchBuilder.build();
         List<Action> actions = new ArrayList<>();
@@ -1061,10 +937,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         localSubnetBuilder.setParent(L2FD_ID);
         Subnet localSubnet = localSubnetBuilder.build();
 
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-
         flows.createL3PrefixFlow(tableId, 30, gatewayEp.build(), null, tenant, localSubnet, null, ofWriter);
-        verify(ctx, times(1)).getEndpointManager();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -1094,11 +968,9 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         externalPorts.add(new NodeConnectorId(CONNECTOR_0));
         externalPorts.add(new NodeConnectorId(CONNECTOR_1));
 
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-
         flows.createL3PrefixFlow(tableId, 30, gatewayEpBuilder.build(), null, tenant, localSubnet, externalPorts,
                 ofWriter);
-        verify(ctx, times(1)).getEndpointManager();
+
         verifyZeroInteractions(ofWriter);
     }
 
@@ -1130,19 +1002,17 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         applyActions.add(nxLoadRegAction(NxmNxReg7.class, BigInteger.valueOf(1)));
         applyActions.addAll(l3ApplyActions);
         Instruction applyActionsIns = new InstructionBuilder().setOrder(0)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(1)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(1).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
         instructionsBuilder.setInstruction(l3instructions);
 
-        MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null,
-                DestinationMapper.ROUTER_MAC, IPv4));
+        MatchBuilder matchBuilder =
+                new MatchBuilder().setEthernetMatch(ethernetMatch(null, DestinationMapper.ROUTER_MAC, IPv4));
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
 
@@ -1150,15 +1020,8 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "L3prefix", match), tableId, 30 + prefixLength, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
+        flows.createL3PrefixFlow(tableId, 30, gatewayEp.build(), l3Prefix, tenant, localSubnet, null, ofWriter);
 
-        flows.createL3PrefixFlow(tableId, 30, gatewayEp.build(), l3Prefix, tenant, localSubnet, null,
-                ofWriter);
-        verify(ctx, times(3)).getTenant(any(TenantId.class));
-        verify(ctx, times(2)).getEndpointManager();
-        verify(ctx, times(1)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(any(NodeId.class), anyShort(), eq(flow));
     }
 
@@ -1204,19 +1067,17 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         applyActions.add(nxLoadRegAction(NxmNxReg7.class, BigInteger.valueOf(0)));
         applyActions.addAll(l3ApplyActions);
         Instruction applyActionsIns = new InstructionBuilder().setOrder(0)
-                .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
-                .build();
-        Instruction gotoTable = new InstructionBuilder().setOrder(1)
-                .setInstruction(gotoTableIns(tableId))
-                .build();
+            .setInstruction(applyActionIns(applyActions.toArray(new Action[applyActions.size()])))
+            .build();
+        Instruction gotoTable = new InstructionBuilder().setOrder(1).setInstruction(gotoTableIns(tableId)).build();
         ArrayList<Instruction> l3instructions = new ArrayList<>();
         l3instructions.add(applyActionsIns);
         l3instructions.add(gotoTable);
         InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
         instructionsBuilder.setInstruction(l3instructions);
 
-        MatchBuilder matchBuilder = new MatchBuilder().setEthernetMatch(ethernetMatch(null,
-                DestinationMapper.ROUTER_MAC, IPv6));
+        MatchBuilder matchBuilder =
+                new MatchBuilder().setEthernetMatch(ethernetMatch(null, DestinationMapper.ROUTER_MAC, IPv6));
         addNxRegMatch(matchBuilder, RegMatch.of(NxmNxReg6.class, (long) 5));
         Match match = matchBuilder.build();
 
@@ -1224,23 +1085,10 @@ public class DestinationMapperFlowsTest extends MapperUtilsTest {
         Flow flow = buildFlow(FlowIdUtils.newFlowId(tableId, "L3prefix", match), tableId, 30 + prefixLength, match,
                 instructionsBuilder.build()).build();
 
-        when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
-        when(ctx.getEndpointManager()).thenReturn(endpointManager);
-        when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
-
         flows.createL3PrefixFlow(tableId, 30, gatewayEpBuilder.build(), l3Prefix, tenant, localSubnet, externalPorts,
                 ofWriter);
 
-        verify(ctx, times(6)).getTenant(any(TenantId.class));
-        verify(ctx, times(3)).getEndpointManager();
-        verify(ctx, times(2)).getCurrentPolicy();
         verify(ofWriter, times(1)).writeFlow(any(NodeId.class), anyShort(), eq(flow));
     }
 
-    private void resetPolicyOrdinalCounterValue() throws  Exception {
-        // TODO find better way, maybe fixed test method order?
-        Field field = OrdinalFactory.class.getDeclaredField("policyOrdinal");
-        field.setAccessible(true);
-        field.set(null, new AtomicInteger(1));
-    }
-}
\ No newline at end of file
+}