module/node
module/src/main/resources/gbp/node_modules
module/src/main/resources/gbp/vendor
+module/src/main/resources/gbp/node/
-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();
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
* @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,
};
}
*
* @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;
- });
- }
-
/**
*
*/
}
/**
- *
- * @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;
}
/**
function init() {
$scope.rootTenants.clearData();
$scope.rootTenants.get('config');
+ $state.go('main.gbp.index.resolvedPolicy');
+ $scope.endpointSgtList.get();
+
+
}
/**
parent: angular.element(document.body),
scope: $scope,
locals: {
- chainName: chainName,
- },
+ chainName: chainName
+ }
});
}
* 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');
}
}
}
$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();
}
}
parent: angular.element(document.body),
scope: $scope,
locals: {
- endpoint: endpointData,
- },
+ endpoint: endpointData
+ }
});
}
$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
+.h100 {
+ height:100%
+}
+
+.w100 {
+ width:100%
+}
+
.gbpUiGlobalWrapper {
background: #ffffff;
margin-bottom: 0!important;
.gbpUiGlobalWrapper .main {
top: 0px;
+ height: 100%;
}
.gbpUiWrapper {
#graph-container {
padding-left: 0;
+ background-color: #ffffff;
}
/* $mdDialog.confirm */
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 {
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
+++ /dev/null
-.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
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');
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;
*/
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;
scalable: true,
nodeConfig: {
label: 'model.label',
- iconType: 'model.icon',
+ //iconType: 'model.icon',
+ iconType: 'unlinked',
color: function (node, model) {
return topoColors.getItem('forwarding-box');
}
<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"
-<div class="main" ui-view></div>
+<div class="main" ui-view layout="row" flex></div>
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,
$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() {
}
$scope.endpoint.post(function () {
$scope.closeDialog();
+ $scope.broadcastFromRoot('endpointChanged');
}, function () {
} );
}
function createFilterFor(query) {
return function filterFn(epg) {
- return (epg.indexOf(query) === 0);
+ return (epg.toLowerCase().indexOf(query.toLowerCase()) === 0);
};
}
<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
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
],
},
};
- return restObj.customPOST(reqData).then(function (data) {
- successCallback(data);
+ return restObj.customPOST(reqData).then(function () {
+ (successCallback() || angular.noop)();
}, function () {
});
function setData(data) {
var self = this;
+ self.clearData();
data && data.forEach(function (dataElement) {
self.data.push(EndpointService.createObject(dataElement));
});
});
}
- 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)();
});
}
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;
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) {
$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);
- });
}
});
</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>
<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>
--- /dev/null
+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;
+});
--- /dev/null
+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;
+});
+++ /dev/null
-<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>
+++ /dev/null
-<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
--- /dev/null
+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;
+});
$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();
angular.module('app.gbp').service('ResolvedPolicyService', ResolvedPolicyService);
- ResolvedPolicyService.$inject = ['Restangular'];
+ ResolvedPolicyService.$inject = [];
- function ResolvedPolicyService(Restangular) {
+ function ResolvedPolicyService() {
/* methods */
this.createObject = createObject;
/* 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;
}
}
-<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>
+++ /dev/null
-<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>
--- /dev/null
+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';
+ }
+});
--- /dev/null
+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;
+ }
+ }
+});
--- /dev/null
+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
--- /dev/null
+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);
+ }
+});
<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">
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
+++ /dev/null
-<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
/* @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;
$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;
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'));
function SfcService(Restangular) {
/* methods */
this.createObject = createObject;
+ this.getSfTypeShort = getSfTypeShort;
/**
* Sfc constructor
*/
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
return obj;
}
+
+ function getSfTypeShort(sfType) {
+ return sfType.replace('service-function-type:', '').trim();
+ }
}
return SfcService;
}
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()));
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;
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;
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;
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;
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 {
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
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);
}
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<>();
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);
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));
}
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);
}
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);
}
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);
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));
}
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);
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));
}
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);
}
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)));
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);
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));
}
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);
}
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);
}
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);
}
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();
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));
}
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);
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();
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));
}
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);
}
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)));
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);
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));
}
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);
}
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);
}
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);
}
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);
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);
}
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);
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));
}
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);
}
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();
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));
}
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);
}
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<>();
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);
}
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);
}
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();
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));
}
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();
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
+}