From af9fd0080712a9da94bc91671ab29be642c370aa Mon Sep 17 00:00:00 2001 From: Juraj Sebin Date: Thu, 14 May 2015 14:15:06 +0200 Subject: [PATCH] GBP UI initial commit added GBP UI dlux module added groupbasedpolicy-ui feature and bundle Change-Id: I0ee3cb740d6a2164122a66eb6f4e04f61071e563 Signed-off-by: Juraj Sebin --- commons/parent/pom.xml | 2 + features/pom.xml | 18 +- features/src/main/resources/features.xml | 12 + groupbasedpolicy-ui/bundle/pom.xml | 99 + .../OSGI-INF/blueprint/blueprint.xml | 18 + groupbasedpolicy-ui/module/pom.xml | 25 + .../src/main/resources/gbp/gbp.controller.js | 2533 +++++++++++++++++ .../module/src/main/resources/gbp/gbp.css | 187 ++ .../module/src/main/resources/gbp/gbp.less | 231 ++ .../src/main/resources/gbp/gbp.module.js | 58 + .../src/main/resources/gbp/gbp.services.js | 2153 ++++++++++++++ .../resources/gbp/views/action-ref.tpl.html | 27 + .../main/resources/gbp/views/actions.tpl.html | 46 + .../gbp/views/classifier-ref.tpl.html | 41 + .../resources/gbp/views/classifiers.tpl.html | 51 + .../main/resources/gbp/views/clause.tpl.html | 34 + .../src/main/resources/gbp/views/cns.tpl.html | 34 + .../resources/gbp/views/contracts.tpl.html | 44 + .../main/resources/gbp/views/docs.tpl.html | 4 + .../resources/gbp/views/endpoint.tpl.html | 102 + .../src/main/resources/gbp/views/epg.tpl.html | 62 + .../main/resources/gbp/views/gateway.tpl.html | 25 + .../main/resources/gbp/views/index.tpl.html | 156 + .../main/resources/gbp/views/l2l3.tpl.html | 171 ++ .../resources/gbp/views/l3-endpoint.tpl.html | 126 + .../resources/gbp/views/parts/crud.tpl.html | 16 + .../resources/gbp/views/parts/param.tpl.html | 5 + .../src/main/resources/gbp/views/pns.tpl.html | 37 + .../main/resources/gbp/views/prefix.tpl.html | 21 + .../main/resources/gbp/views/root.tpl.html | 1 + .../main/resources/gbp/views/rules.tpl.html | 35 + .../resources/gbp/views/subjects.tpl.html | 30 + .../main/resources/gbp/views/tenants.tpl.html | 36 + groupbasedpolicy-ui/pom.xml | 31 + pom.xml | 3 +- 35 files changed, 6472 insertions(+), 2 deletions(-) create mode 100755 groupbasedpolicy-ui/bundle/pom.xml create mode 100755 groupbasedpolicy-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100755 groupbasedpolicy-ui/module/pom.xml create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.css create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.module.js create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/action-ref.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/actions.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifier-ref.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifiers.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/clause.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/cns.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/contracts.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/docs.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/endpoint.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/epg.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/gateway.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/l2l3.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/l3-endpoint.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/crud.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/param.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/pns.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/prefix.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/root.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/rules.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/subjects.tpl.html create mode 100755 groupbasedpolicy-ui/module/src/main/resources/gbp/views/tenants.tpl.html create mode 100755 groupbasedpolicy-ui/pom.xml diff --git a/commons/parent/pom.xml b/commons/parent/pom.xml index 79a878b85..ce8104f1e 100644 --- a/commons/parent/pom.xml +++ b/commons/parent/pom.xml @@ -36,6 +36,8 @@ 0.1.0-SNAPSHOT 0.5.0-SNAPSHOT 1.1.0-SNAPSHOT + 0.2.0-SNAPSHOT + 1.4.0 diff --git a/features/pom.xml b/features/pom.xml index 9bf94657e..8f9a2bdae 100644 --- a/features/pom.xml +++ b/features/pom.xml @@ -124,7 +124,16 @@ features xml - + + + + org.opendaylight.dlux + features-dlux + ${dlux.version} + features + xml + + org.opendaylight.groupbasedpolicy @@ -146,6 +155,13 @@ org.opendaylight.groupbasedpolicy ui-backend + + + + org.opendaylight.groupbasedpolicy + groupbasedpolicy-ui-bundle + ${project.version} + diff --git a/features/src/main/resources/features.xml b/features/src/main/resources/features.xml index 22d1beab7..8e0f8c70b 100644 --- a/features/src/main/resources/features.xml +++ b/features/src/main/resources/features.xml @@ -29,6 +29,9 @@ mvn:org.opendaylight.sfc/features-sfc-netconf/${sfc.version}/xml/features mvn:org.opendaylight.controller/features-restconf/${restconf.version}/xml/features + + + mvn:org.opendaylight.dlux/features-dlux/${dlux.version}/xml/features mvn:org.opendaylight.sfc/features-sfc-ovs/${sfc.version}/xml/features mvn:org.opendaylight.sfc/features-sfcofl2/${sfc.version}/xml/features @@ -115,4 +118,13 @@ mvn:org.opendaylight.groupbasedpolicy/ui-backend/${project.version} mvn:org.opendaylight.groupbasedpolicy/ui-backend-config/${project.version}/xml/config + + + + odl-dlux-core + odl-dlux-yangvisualizer + mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-ui-bundle/${project.version} + diff --git a/groupbasedpolicy-ui/bundle/pom.xml b/groupbasedpolicy-ui/bundle/pom.xml new file mode 100755 index 000000000..a964ce910 --- /dev/null +++ b/groupbasedpolicy-ui/bundle/pom.xml @@ -0,0 +1,99 @@ + + + 4.0.0 + + org.opendaylight.groupbasedpolicy + commons.groupbasedpolicy + 0.2.0-SNAPSHOT + ../../commons/parent + + org.opendaylight.groupbasedpolicy + groupbasedpolicy-ui-bundle + groupbasedpolicy-ui-bundle + bundle + + + org.osgi + org.osgi.core + + + org.osgi + org.osgi.compendium + + + org.apache.felix + org.osgi.compendium + ${apache.felix.osgi.compendium.version} + + + org.slf4j + jcl-over-slf4j + + + org.opendaylight.dlux + loader + ${dlux.version} + + + org.opendaylight.groupbasedpolicy + groupbasedpolicy-ui-module + ${dlux.version} + + + + + + target/generated-resources + + + src/main/resources + + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.6 + + + + unpack-loader-resources + + unpack-dependencies + + generate-resources + + ${project.build.directory}/generated-resources + org.opendaylight.dlux + groupbasedpolicy-ui-module + META-INF\/** + true + false + + + + + + org.apache.felix + maven-bundle-plugin + true + + + org.osgi.service.http, + org.osgi.framework;version="1.0.0", + org.opendaylight.dlux.loader, + org.slf4j + + + + + + + + + scm:git:ssh://git.opendaylight.org:29418/dlux.git + scm:git:ssh://git.opendaylight.org:29418/dlux.git + HEAD + https://wiki.opendaylight.org/view/OpenDaylight_dlux:Main + + diff --git a/groupbasedpolicy-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/groupbasedpolicy-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100755 index 000000000..2c96999f4 --- /dev/null +++ b/groupbasedpolicy-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + src/app/gbp/gbp.css + + + + diff --git a/groupbasedpolicy-ui/module/pom.xml b/groupbasedpolicy-ui/module/pom.xml new file mode 100755 index 000000000..317c64789 --- /dev/null +++ b/groupbasedpolicy-ui/module/pom.xml @@ -0,0 +1,25 @@ + + + + 4.0.0 + + org.opendaylight.groupbasedpolicy + commons.groupbasedpolicy + 0.2.0-SNAPSHOT + ../../commons/parent + + + groupbasedpolicy-ui-module + ${project.artifactId} + GBP UI Module Resources + ${dlux.version} + jar + + diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js new file mode 100755 index 000000000..47e0f276f --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js @@ -0,0 +1,2533 @@ +var modules = ['app/gbp/gbp.module', + 'app/gbp/gbp.services' + ]; + + +define(modules, function(gbp) { + + gbp.register.controller('gbpCtrl', ['$scope', '$rootScope', '$http', '$timeout', 'PGNServices', 'TopoServices', 'GBPTenantServices', 'GBPConstants', 'DesignGbpFactory', + function ($scope, $rootScope, $http, $timeout, PGNServices, TopoServices, GBPTenantServices, GBPConstants, DesignGbpFactory) { + $rootScope['section_logo'] = 'logo_yangui'; + $scope.view_path = 'src/app/gbp/views/'; + $scope.topologyData = { nodes: [], links: [] }; + $scope.topologyType = null; + $scope.legend = {}; + $scope.showLegend = false; + + var reloadShowLegend = function() { + $scope.showLegend = !$.isEmptyObject($scope.legend); + }; + + $scope.settingsSigma = { + defaultLabelColor: '#fff', + doubleClickEnabled: false, + labelThreshold: 8 + }; + + $scope.settingsAtlas = { + adjustSizes: true, + gravity: 0.2 + }; + + $scope.viewTopo = { + box: false, + button: false + }; + + $scope.view = { + slider : true, + basic : true, + policy: false, + tenants : false, + l2l3 : false, + epg : false, + contracts : false, + docs : false, + groupMenu: false, + classifiers: false, + actions: false + }; + + // TENANTS + $scope.tenantList = []; + $scope.selectedTenant = null; + $scope.tenantDisplayLabel = ['name' , 'id']; + + $scope.mandatoryProperties = []; + $scope.loadTopology = function(type, args) { + if ( $scope.selectedTenant ) { + + $scope.topologyData = { nodes: [], links: [] }; + $scope.topologyType = type; + + TopoServices.loadTopology(type, function(nodes, links) { + $scope.topologyData = { nodes: nodes, links: links }; + $scope.viewTopo.box = true; + $scope.viewTopo.button = type !== 'L2L3' && type !== null ? true : false; + $scope.legend = TopoServices.getLegend(type); + reloadShowLegend(); + }, function() { + $scope.legend = {}; + reloadShowLegend(); + }, args); + + } + }; + + $scope.toggleExpanded = function(expand, show) { + $scope.view[expand] = show ? true : !$scope.view[expand]; + for ( var property in $scope.view ) { + $scope.view[property] = expand !== property ? false : $scope.view[expand]; + } + + $scope.$broadcast('EV_INIT'+expand.toUpperCase()); + }; + + $scope.topologyCustfunc = function(sigmaIstance, getSlowDownNum, dragListener, resize){ + + sigmaIstance.bind('clickStage', function(e){ + sigmaIstance.killForceAtlas2(); + }); + + // Bind the events: + // sigmaIstance.bind('overNode outNode clickNode doubleClickNode rightClickNode', function(e) { + // console.log(e.type, e.data.node.label, e.data.captor); + // }); + // sigmaIstance.bind('overEdge outEdge clickEdge doubleClickEdge rightClickEdge', function(e) { + // console.log(e.type, e.data.edge, e.data.captor); + // }); + // sigmaIstance.bind('clickStage', function(e) { + // console.log(e.type, e.data.captor); + // }); + // sigmaIstance.bind('doubleClickStage rightClickStage', function(e) { + // console.log(e.type, e.data.captor); + // }); + + }; + + $scope.setTenant = function() { + $scope.$broadcast('GBP_TENANT_RELOAD'); + if($scope.selectedTenant) { + $scope.loadTopology($scope.topologyType, { tenantId: $scope.selectedTenant.id }); + } + }; + + $scope.loadTenants = function() { + GBPTenantServices.load( + function(tenants) { + $scope.tenantList = tenants; + }, + function(){ + //TODO error + }); + + DesignGbpFactory.setMainClass(); + }; + + $scope.sendReloadEventFromRoot = function(eventName) { + $scope.$broadcast(eventName); + }; + + $scope.getDisplayLabelsFromCtrl = function(eventName, val) { + $scope.$broadcast(eventName, val); + }; + + $scope.validateMandatory = function(newObj, mandatoryProps){ + var ret = true, + notFilledProps = []; + + mandatoryProps.forEach(function(el){ + if(newObj[el] === '' || newObj[el] === null || newObj[el] === undefined){ + notFilledProps.push(el); + ret = false; + } + }); + + return {'status' : ret, 'notFilledProps' : notFilledProps}; + }; + + $scope.getDisplayLabel = function(obj, labelArray){ + var ret = ''; + + if((typeof labelArray) === 'string'){ + ret = obj[labelArray]; + } else if (angular.isFunction(labelArray)) { + ret = labelArray(obj); + } else { + labelArray.some(function(labelParam) { + if(angular.isFunction(labelParam)) { + ret = labelParam(obj); + } else if(obj.hasOwnProperty(labelParam)) { + ret = obj[labelParam]; + } + return ret; + }); + } + + return ret; + }; + + $scope.validateForm = function(form) { + return form.$valid; + }; + + $scope.loadTenants(); + + $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){ + $scope.loadTenants(); + }); + }]); + + gbp.register.controller('topoDataCtrl',['$scope', 'TopoServices', function($scope, TopoServices){ + $scope.showTable = false; + + $scope.getConsProvLabel = function(edge){ + return TopoServices.getConsProvLabel(edge, $scope.topologyData); + }; + + $scope.show = function(){ + $scope.showTable = true; + }; + + $scope.close = function(){ + $scope.showTable = false; + }; + + }]); + + + gbp.register.controller('crudCtrl',['$scope', function($scope){ + $scope.selectedObj = null; + $scope.label = ''; + + $scope.add = function() { + $scope.selectedObj = null; + $scope.showForm(); + }; + + $scope.modify = function() { + $scope.$emit('PGN_EDIT_ELEM'); + }; + + $scope.init = function(label) { + $scope.label = label; + }; + + $scope.$on('EV_SET_SEL_CLASS', function(event, selObj){ + $scope.selectedObj = selObj; + }); + }]); + + gbp.register.controller('contractCtrl', ['$scope','GBPContractServices', '$filter', function($scope, GBPContractServices, $filter){ + $scope.list = []; + $scope.contractView = false; + $scope.selectedContract = null; + $scope.newContractObj = GBPContractServices.createObj(); + $scope.displayLabel = 'id'; + $scope.crudLabel = 'Contract list'; + + var path = null, + mandatoryProperties = []; + + $scope.init = function() { + if ( $scope.selectedTenant ) { + $scope.selectedContract = null; + path = GBPContractServices.createPathObj($scope.selectedTenant.id); + + GBPContractServices.load(path, function(data){ + $scope.list = data; + // $scope.$broadcast('GBP_CONTRACT_RELOAD'); + $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD'); + }, function(){ + + }); + } + }; + + $scope.save = function(){ + var resp = $scope.validateMandatory($scope.newContractObj, mandatoryProperties); + if(resp.status){ + path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.newContractObj.id); + GBPContractServices.send(path, $scope.newContractObj, function(data){ + $scope.init(); + $scope.contractView = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + }else{ + alert($filter('translate')('GBP_MANDATORY_NOT_FILLED')+': '+resp.notFilledProps.join(', ')); + } + }; + + $scope.delete = function() { + if ( $scope.selectedContract ) { + path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id); + GBPContractServices.delete(path, function(data){ + $scope.init(); + $scope.selectedContract = null; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reloadNewObj = function() { + $scope.newContractObj = GBPContractServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedContract = selectedObj; + if($scope.contractView) { + angular.copy(selectedObj, $scope.newContractObj); + } + $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD'); + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.contractView = true; + $scope.selectedContract = null; + }; + + $scope.close = function(){ + $scope.contractView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if(!event.defaultPrevented) { + if ( $scope.selectedContract ) { + $scope.contractView = true; + angular.copy($scope.selectedContract, $scope.newContractObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(event){ + $scope.init(); + }); + + $scope.$on('GBP_CONTRACTS_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('clauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', + function($scope, GBPClauseServices, GBPSubjectServices){ + $scope.list = []; + $scope.selectedClause = null; + $scope.newClauseObj = GBPClauseServices.createObj(); + $scope.view = { + clause: false, + edit: false + }; + $scope.displayLabel = 'name'; + $scope.crudLabel = 'Clause list'; + + $scope.subjects = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects); + + var path = null; + + //move to separate ctrl \/ + $scope.addNewElem = function(templateObj) { + if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) { + var objToPush = templateObj || ""; + $scope.newClauseObj['subject-refs'].push(objToPush); + } + }; + + $scope.deleteElemAt = function(index) { + if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) { + $scope.newClauseObj['subject-refs'].splice(index, 1); + } + }; + + $scope.updateAt = function(index, value) { + if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) { + $scope.newClauseObj['subject-refs'][index] = value; + } + }; + //move to separate ctrl /\ + + var loadSubjects = function() { + $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects); + + GBPSubjectServices.load(path, function(data){ + $scope.subjects.options = data; + }, function(){ + //TODO: error cbk + }); + }; + + $scope.init = function() { + if ( $scope.selectedContract ) { + path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id); + + GBPClauseServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.clauseForm)){ + path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newClauseObj.name); + GBPClauseServices.send(path, $scope.newClauseObj, function(data){ + $scope.init(); + $scope.view.clause = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if ( $scope.selectedClause ) { + path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedClause.name); + GBPClauseServices.delete(path, function(data){ + $scope.init(); + $scope.selectedClause = null; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reloadNewObj = function() { + $scope.newClauseObj = GBPClauseServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedClause = selectedObj; + if($scope.view.clause) { + angular.copy(selectedObj, $scope.newClauseObj); + } + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.view.clause = true; + $scope.view.edit = false; + $scope.selectedClause = null; + }; + + $scope.close = function(){ + $scope.view.clause = false; + $scope.view.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedClause ) { + $scope.view.clause = true; + $scope.view.edit = true; + angular.copy($scope.selectedClause, $scope.newClauseObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_CONTRACT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_SUBJECT_RELOAD',function(){ + loadSubjects(); + }); + }]); + + gbp.register.controller('subjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){ + $scope.list = []; + $scope.selectedSubject = null; + $scope.newSubjectObj = GBPSubjectServices.createObj(); + $scope.displayLabel = 'name'; + $scope.view = { + subject : false, + edit : false + }; + $scope.crudLabel = 'Subject list'; + + + var path = null, + mandatoryProperties = ['order']; + + $scope.init = function() { + if ( $scope.selectedContract ) { + $scope.selectedSubject = null; + path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id); + + GBPSubjectServices.load(path, function(data){ + $scope.list = data; + $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.subjectForm)){ + path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newSubjectObj.name); + GBPSubjectServices.send(path, $scope.newSubjectObj, function(data){ + $scope.init(); + $scope.view.subject = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if ( $scope.selectedSubject ) { + path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name); + GBPSubjectServices.delete(path, function(data){ + $scope.init(); + $scope.selectedSubject = null; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reloadNewObj = function() { + $scope.newSubjectObj = GBPSubjectServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedSubject = selectedObj; + if($scope.view.subject) { + angular.copy(selectedObj, $scope.newSubjectObj); + } + $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD'); + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.view.subject = true; + $scope.view.edit = false; + $scope.selectedSubject = null; + }; + + $scope.close = function(){ + $scope.view.subject = false; + $scope.view.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedSubject ) { + $scope.view.subject = true; + $scope.view.edit = true; + angular.copy($scope.selectedSubject, $scope.newSubjectObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_CONTRACT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('ruleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){ + $scope.list = []; + $scope.selectedRule = null; + $scope.newRuleObj = GBPRuleServices.createObj(); + $scope.displayLabel = 'name'; + $scope.view = { + rule : false, + edit : false + }; + $scope.crudLabel = 'Rule list'; + + var path = null, + mandatoryProperties = ['order']; + + $scope.init = function() { + if ( $scope.selectedSubject ) { + $scope.selectedRule = null; + path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name); + + GBPRuleServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.rulesForm)){ + path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.newRuleObj.name); + GBPRuleServices.send(path, $scope.newRuleObj, function(data){ + $scope.init(); + $scope.view.rule = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if ( $scope.selectedRule ) { + path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name); + GBPRuleServices.delete(path, function(data){ + $scope.init(); + $scope.selectedRule = null; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reloadNewObj = function() { + $scope.newRuleObj = GBPRuleServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedRule = selectedObj; + if($scope.view.rule) { + angular.copy(selectedObj, $scope.newRuleObj); + } + $scope.$broadcast('GBP_RULE_RELOAD'); + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.view.rule = true; + $scope.view.edit = false; + $scope.selectedRule = null; + }; + + $scope.close = function(){ + $scope.view.rule = false; + $scope.view.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedRule ) { + $scope.view.rule = true; + $scope.view.edit = true; + angular.copy($scope.selectedRule, $scope.newRuleObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_SUBJECT_RELOAD',function(){ + $scope.init(); + }); + }]); + + gbp.register.controller('actionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){ + $scope.list = []; + $scope.selectedActionRef = null; + $scope.newActionRefObj = GBPActionRefsServices.createObj(); + $scope.displayLabel = 'name'; + $scope.view = { + actionRef : false, + edit : false + }; + $scope.crudLabel = 'Action ref list'; + + $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel}; + + var path = null, + mandatoryProperties = ['order']; + + var actionInstanceNamesLoad = function() { + var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id); + GBPActionInstanceServices.load(actionInstancePath, function(data){ + $scope.actionInstanceNames.options = data; + },function(){ + //TODO: error cbk + }); + }; + + $scope.init = function() { + if ( $scope.selectedRule ) { + $scope.selectedActionRef = null; + path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name); + + GBPActionRefsServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + + actionInstanceNamesLoad(); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.actionRefForm)){ + path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newActionRefObj.name); + GBPActionRefsServices.send(path, $scope.newActionRefObj, function(data){ + $scope.init(); + $scope.view.actionRef = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if ( $scope.selectedActionRef ) { + path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedActionRef.name); + GBPActionRefsServices.delete(path, function(data){ + $scope.init(); + $scope.selectedActionRef = null; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reloadNewObj = function() { + $scope.newActionRefObj = GBPActionRefsServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedActionRef = selectedObj; + if($scope.view.actionRef) { + angular.copy(selectedObj, $scope.newActionRefObj); + } + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.view.actionRef = true; + $scope.view.edit = false; + $scope.selectedActionRef = null; + }; + + $scope.close = function(){ + $scope.view.actionRef = false; + $scope.view.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedActionRef ) { + $scope.view.actionRef = true; + $scope.view.edit = true; + angular.copy($scope.selectedActionRef, $scope.newActionRefObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_RULE_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_ACTION_INSTANCE_RELOAD',function(){ + actionInstanceNamesLoad(); + }); + }]); + + gbp.register.controller('classifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){ + $scope.list = []; + $scope.selectedClassifierRef = null; + $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); + $scope.displayLabel = 'name'; + $scope.view = { + classifierRef : false, + edit : false + }; + + $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel}; + + $scope.formDirections = ['in', 'out', 'bidirectional']; + $scope.formConnectionTracking = ['normal', 'reflexive']; + + $scope.crudLabel = 'Classifier ref list'; + + var path = null; + + var instanceNamesLoad = function() { + var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id); + GBPClassifierInstanceServices.load(classifierInstancePath, function(data){ + $scope.instanceNames.options = data; + },function(){ + //TODO: error cbk + }); + }; + + $scope.init = function() { + if ( $scope.selectedRule ) { + $scope.selectedClassifierRef = null; + path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name); + + + + GBPClassifierRefsServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + + instanceNamesLoad(); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.classifierRefForm)){ + path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newClassifierRefObj.name); + GBPClassifierRefsServices.send(path, $scope.newClassifierRefObj, function(data){ + $scope.init(); + $scope.view.classifierRef = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if ( $scope.selectedClassifierRef ) { + path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedClassifierRef.name); + GBPClassifierRefsServices.delete(path, function(data){ + $scope.init(); + $scope.selectedClassifierRef = null; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reloadNewObj = function() { + $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedClassifierRef = selectedObj; + if($scope.view.classifierRef) { + angular.copy(selectedObj, $scope.newClassifierRefObj); + } + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.view.classifierRef = true; + $scope.view.edit = false; + $scope.selectedClassifierRef = null; + }; + + $scope.close = function(){ + $scope.view.classifierRef = false; + $scope.view.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedClassifierRef ) { + $scope.view.classifierRef = true; + $scope.view.edit = true; + angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_RULE_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_CLASSIFIER_INSTANCE_RELOAD',function(){ + instanceNamesLoad(); + }); + }]); + + gbp.register.controller('tenantCtrl', ['$scope', 'GBPTenantServices', '$filter', function($scope, GBPTenantServices, $filter){ + $scope.list = []; + $scope.tenantView = false; + $scope.selectedTenantObj = null; + $scope.newTenantObj = GBPTenantServices.createObj(); + $scope.displayLabel = ['name' , 'id']; + $scope.crudLabel = 'Tenants list'; + + $scope.init = function() { + GBPTenantServices.load( + function(data) { + $scope.list = data; + $scope.newTenantObj = GBPTenantServices.createObj(); + $scope.selectedTenantObj = null; + }, + function(){ + //TODO error + }); + }; + + $scope.save = function(){ + if($scope.validateForm($scope.tenantForm)){ + path = GBPTenantServices.createPathObj($scope.newTenantObj.id); + GBPTenantServices.send(path, $scope.newTenantObj, function(data){ + $scope.init(); + $scope.tenantView = false; + $scope.$emit('GBP_GLOBAL_TENANT_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenantObj) { + path = GBPTenantServices.createPathObj($scope.selectedTenantObj.id); + + GBPTenantServices.delete(path, function(data){ + $scope.init(); + $scope.tenantView = false; + $scope.$emit('GBP_GLOBAL_TENANT_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reload = function(selectedObj) { + $scope.selectedTenantObj = selectedObj; + if ($scope.tenantView) { + angular.copy(selectedObj, $scope.newTenantObj); + } + }; + + $scope.showForm = function() { + $scope.newTenantObj = GBPTenantServices.createObj(); + $scope.selectedTenantObj = null; + $scope.tenantView = true; + }; + + $scope.close = function(){ + $scope.tenantView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedTenantObj ) { + $scope.tenantView = true; + angular.copy($scope.selectedTenantObj, $scope.newTenantObj); + } + event.defaultPrevented = true; + } + }); + + // $scope.$on('GBP_TENANT_RELOAD',function(){ + // $scope.init(); + // }); + }]); + + gbp.register.controller('epgCtrl',['$scope', 'GBPEpgServices', 'GBPContractServices', '$filter', + function($scope, GBPEpgServices, GBPContractServices, $filter){ + $scope.selectedEpg = null; + $scope.newEpgObj = GBPEpgServices.createObj(); + $scope.epgView = false; + $scope.displayLabel = ['name', 'id']; + $scope.crudLabel = 'Group list'; + + $scope.igpOpts = ['allow', 'require-contract']; + + $scope.contracts = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contracts); + + $scope.list = []; + + var loadContracts = function() { + GBPContractServices.load(path, function(data){ + $scope.contracts.options = data; + }, function(){ + //TODO: error cbk + }); + }; + + var mandatoryProperties = ['name']; + + $scope.init = function() { + if ($scope.selectedTenant) { + path = GBPEpgServices.createPathObj($scope.selectedTenant.id); + + GBPEpgServices.load(path, function(data){ + $scope.list = data; + // $scope.$broadcast('GBP_EPG_RELOAD'); + $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD'); + }, function(){ + //TODO: error cbk + }); + + loadContracts(); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.epgForm)){ + path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.newEpgObj.id); + GBPEpgServices.send(path, $scope.newEpgObj, function(data){ + $scope.init(); + $scope.epgView = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedEpg) { + path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id); + GBPEpgServices.delete(path, function(data){ + $scope.init(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.epgView = true; + $scope.reloadNewObj(); + $scope.selectedEpg = null; + }; + + $scope.reloadNewObj = function() { + $scope.newEpgObj = GBPEpgServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedEpg = selectedObj; + if($scope.epgView) { + angular.copy(selectedObj, $scope.newEpgObj); + } + $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD'); + }; + + $scope.close = function(){ + $scope.epgView = false; + }; + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedEpg ) { + $scope.epgView = true; + angular.copy($scope.selectedEpg, $scope.newEpgObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_CONTRACT_RELOAD',function(){ + loadContracts(); + }); + + $scope.$on('GBP_EPG_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('cnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){ + $scope.list = []; + $scope.selectedCNS = null; + $scope.newCNSObj = GBPConNamedSelServices.createObj(); + $scope.view = { + cns: false, + edit: false + }; + $scope.displayLabel = 'name'; + $scope.crudLabel = 'Consumer named selectors list'; + + //move to separate ctrl \/ + $scope.addNewElem = function(templateObj) { + if($scope.newCNSObj && $scope.newCNSObj.contract) { + var objToPush = templateObj || ""; + $scope.newCNSObj.contract.push(objToPush); + } + }; + + $scope.deleteElemAt = function(index) { + if($scope.newCNSObj && $scope.newCNSObj.contract) { + $scope.newCNSObj.contract.splice(index, 1); + } + }; + + $scope.updateAt = function(index, value) { + if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) { + $scope.newCNSObj.contract[index] = value; + } + }; + //move to separate ctrl /\ + + $scope.init = function() { + if ($scope.selectedTenant && $scope.selectedEpg) { + path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id); + + GBPConNamedSelServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.cnsForm)){ + path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newCNSObj.name); + GBPConNamedSelServices.send(path, $scope.newCNSObj, function(data){ + $scope.init(); + $scope.view.cns = false; + + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedCNS) { + path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedCNS.name); + GBPConNamedSelServices.delete(path, function(data){ + $scope.init(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.selectedCNS = null; + $scope.view.cns = true; + $scope.view.edit = false; + }; + + $scope.reloadNewObj = function() { + $scope.newCNSObj = GBPConNamedSelServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedCNS = selectedObj; + if($scope.view.cns) { + angular.copy(selectedObj, $scope.newCNSObj); + } + }; + + $scope.close = function(){ + $scope.view.cns = false; + $scope.view.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedEpg ) { + $scope.view.cns = true; + $scope.view.edit = true; + angular.copy($scope.selectedCNS, $scope.newCNSObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_EPG_RELOAD',function(){ + $scope.init(); + }); + }]); + + gbp.register.controller('pnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){ + $scope.list = []; + $scope.selectedPNS = null; + $scope.newPNSObj = GBPProNamedSelServices.createObj(); + $scope.displayLabel = 'name'; + $scope.crudLabel = 'Provider named selectors list'; + $scope.view = { + pns: false, + edit: false + }; + + //move to separate ctrl \/ + $scope.addNewElem = function(templateObj) { + if($scope.newPNSObj && $scope.newPNSObj.contract) { + var objToPush = templateObj || ""; + $scope.newPNSObj.contract.push(objToPush); + } + }; + + $scope.deleteElemAt = function(index) { + if($scope.newPNSObj && $scope.newPNSObj.contract) { + $scope.newPNSObj.contract.splice(index, 1); + } + }; + + $scope.updateAt = function(index, value) { + if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) { + $scope.newPNSObj.contract[index] = value; + } + }; + //move to separate ctrl /\ + + $scope.init = function() { + if ($scope.selectedTenant && $scope.selectedEpg) { + path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id); + + GBPProNamedSelServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.pnsForm)){ + path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newPNSObj.name); + GBPProNamedSelServices.send(path, $scope.newPNSObj, function(data){ + $scope.init(); + $scope.view.pns = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedPNS) { + path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedPNS.name); + GBPProNamedSelServices.delete(path, function(data){ + $scope.init(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.reloadNewObj(); + $scope.view.pns = true; + $scope.view.edit = false; + $scope.selectedPNS = null; + }; + + $scope.reloadNewObj = function() { + $scope.newPNSObj = GBPProNamedSelServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedPNS = selectedObj; + if($scope.view.pns) { + angular.copy(selectedObj, $scope.newPNSObj); + } + }; + + $scope.close = function(){ + $scope.view.pns = false; + $scope.view.edit = false; + }; + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedEpg ) { + $scope.view.pns = true; + $scope.view.edit = true; + angular.copy($scope.selectedPNS, $scope.newPNSObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_EPG_RELOAD',function(){ + $scope.init(); + }); + }]); + + gbp.register.controller('l2FloodCtrl', ['$scope', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter', function($scope, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){ + $scope.list = []; + $scope.l2FloodView = false; + $scope.selectedL2Flood = null; + $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); + $scope.displayLabel = ['name', 'id']; + $scope.crudLabel = 'L2 Flood Domain list'; + + $scope.l2bridge = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L2BRIDGE_LABEL', $scope.l2bridge); + + var path = null; + + var loadL2BridgeList = function() { + GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(data){ + $scope.l2bridge.options = data; + }, function(){ + + }); + }; + + $scope.init = function() { + if ( $scope.selectedTenant ) { + path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id); + + GBPL2FloodDomainServices.load(path, function(data){ + $scope.list = data; + // clear objects + $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); + $scope.selectedL2Flood = null; + }, function(){ + + }); + + loadL2BridgeList(); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.l2FloodForm)){ + path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2FloodObj.id); + GBPL2FloodDomainServices.send(path, $scope.newL2FloodObj, function(data){ + $scope.init(); + $scope.l2FloodView = false; + $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedL2Flood) { + path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Flood.id); + GBPL2FloodDomainServices.delete(path, function(data){ + $scope.init(); + $scope.l2FloodView = false; + $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reload = function(selectedObj) { + $scope.selectedL2Flood = selectedObj; + if ($scope.l2FloodView) { + angular.copy(selectedObj, $scope.newL2FloodObj); + } + $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD'); + }; + + $scope.showForm = function() { + $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); + $scope.selectedL2Flood = null; + $scope.l2FloodView = true; + }; + + $scope.close = function(){ + $scope.l2FloodView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedL2Flood ) { + $scope.l2FloodView = true; + angular.copy($scope.selectedL2Flood, $scope.newL2FloodObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ + loadL2BridgeList(); + }); + + $scope.$on('GBP_L2FLOOD_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('l2BridgeCtrl', ['$scope', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ + $scope.list = []; + $scope.l2BridgeView = false; + $scope.selectedL2Bridge = null; + $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); + $scope.displayLabel = ['name', 'id']; + $scope.crudLabel = 'L2 Bridge Domain list'; + + $scope.l3context = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context); + + var path = null; + + var loadL3ContextList = function() { + GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){ + $scope.l3context.options = data; + //$scope.$broadcast('GBP_L2BRIDGE_RELOAD'); + }, function(){ + + }); + }; + + $scope.init = function() { + if ( $scope.selectedTenant ) { + path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id); + + GBPL2BridgeDomainServices.load(path, function(data){ + $scope.list = data; + $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); + $scope.selectedL2Bridge = null; + // $scope.$broadcast('GBP_L2BRIDGE_RELOAD'); + }, function(){ + + }); + + loadL3ContextList(); + } + }; + + + + $scope.save = function(){ + if($scope.validateForm($scope.l2BridgeForm)){ + path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2BridgeObj.id); + GBPL2BridgeDomainServices.send(path, $scope.newL2BridgeObj, function(data){ + $scope.init(); + $scope.l2BridgeView = false; + $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedL2Bridge) { + path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Bridge.id); + GBPL2BridgeDomainServices.delete(path, function(data){ + $scope.init(); + $scope.l2BridgeView = false; + $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reload = function(selectedObj) { + $scope.selectedL2Bridge = selectedObj; + if ($scope.l2BridgeView) { + angular.copy(selectedObj, $scope.newL2BridgeObj); + } + $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); + }; + + $scope.showForm = function() { + $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); + $scope.selectedL2Bridge = null; + $scope.l2BridgeView = true; + }; + + $scope.close = function(){ + $scope.l2BridgeView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedL2Bridge ) { + $scope.l2BridgeView = true; + angular.copy($scope.selectedL2Bridge, $scope.newL2BridgeObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ + loadL3ContextList(); + }); + + $scope.$on('GBP_L2BRIDGE_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('l3ContextCtrl', ['$scope', 'GBPL3ContextServices', '$filter', function($scope, GBPL3ContextServices, $filter){ //GBPContractServices + $scope.list = []; + $scope.l3ContextView = false; + $scope.selectedL3Context = null; + $scope.newL3ContextObj = GBPL3ContextServices.createObj(); + $scope.displayLabel = ['name', 'id']; + $scope.crudLabel = 'L3 Context list'; + + var path = null; + + $scope.init = function() { + if ( $scope.selectedTenant ) { + path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id); + + GBPL3ContextServices.load(path, function(data){ + $scope.list = data; + $scope.newL3ContextObj = GBPL3ContextServices.createObj(); + $scope.selectedL3Context = null; + }, function(){ + + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.l3ContextForm)){ + path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.newL3ContextObj.id); + GBPL3ContextServices.send(path, $scope.newL3ContextObj, function(data){ + $scope.init(); + $scope.l3ContextView = false; + $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedL3Context) { + path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.selectedL3Context.id); + GBPL3ContextServices.delete(path, function(data){ + $scope.init(); + $scope.l3ContextView = false; + $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reload = function(selectedObj) { + $scope.selectedL3Context = selectedObj; + if($scope.l3ContextView) { + angular.copy(selectedObj, $scope.newL3ContextObj); + } + $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD'); + }; + + $scope.showForm = function() { + $scope.newL3ContextObj = GBPL3ContextServices.createObj(); + $scope.selectedL3Context = null; + $scope.l3ContextView = true; + }; + + $scope.close = function(){ + $scope.l3ContextView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedL3Context ) { + $scope.l3ContextView = true; + angular.copy($scope.selectedL3Context, $scope.newL3ContextObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_L3CONTEXT_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('subnetCtrl', ['$scope', 'GBPSubnetServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPSubnetServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ + $scope.list = []; + $scope.subnetView = false; + $scope.selectedSubnet = null; + $scope.newSubnetObj = GBPSubnetServices.createObj(); + $scope.displayLabel = ['name', 'id']; + $scope.crudLabel = 'Subnet list'; + + $scope.l2L3List = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2L3List); + + + var path = null; + + var loadL2L3List = function() { + $scope.l2L3List.options = []; + + GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(l3ContextData){ + $scope.l2L3List.options = $scope.l2L3List.options.concat(l3ContextData); + }, function(){ + + }); + + GBPL2FloodDomainServices.load(GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id), function(l2FloodData){ + $scope.l2L3List.options = $scope.l2L3List.options.concat(l2FloodData); + }, function(){ + + }); + + GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(l2BridgeData){ + $scope.l2L3List.options = $scope.l2L3List.options.concat(l2BridgeData); + }, function(){ + + }); + }; + + $scope.init = function() { + if ( $scope.selectedTenant ) { + path = GBPSubnetServices.createPathObj($scope.selectedTenant.id); + + GBPSubnetServices.load(path, function(data){ + $scope.list = data; + $scope.newSubnetObj = GBPSubnetServices.createObj(); + $scope.selectedSubnet = null; + //$scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); + }, function(){ + + }); + + loadL2L3List(); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.subnetForm)){ + path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.newSubnetObj.id); + GBPSubnetServices.send(path, $scope.newSubnetObj, function(data){ + $scope.init(); + $scope.subnetView = false; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedSubnet) { + path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id); + GBPSubnetServices.delete(path, function(data){ + $scope.init(); + $scope.subnetView = false; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reload = function(selectedObj) { + $scope.selectedSubnet = selectedObj; + if($scope.subnetView) { + angular.copy(selectedObj, $scope.newSubnetObj); + } + $scope.sendReloadEventFromRoot('GBP_SUBNET_RELOAD'); + }; + + $scope.showForm = function() { + $scope.newSubnetObj = GBPSubnetServices.createObj(); + $scope.selectedSubnet = null; + $scope.subnetView = true; + }; + + $scope.close = function(){ + $scope.subnetView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedSubnet ) { + $scope.subnetView = true; + angular.copy($scope.selectedSubnet, $scope.newSubnetObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_GATEWAY_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ + loadL2L3List(); + }); + + $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ + loadL2L3List(); + }); + + $scope.$on('GBP_L2FLOOD_RELOAD',function(){ + loadL2L3List(); + }); + + $scope.$on('GBP_PREFIX_RELOAD',function(){ + $scope.init(); + }); + + }]); + + gbp.register.controller('gatewayCtrl', ['$scope', 'GBPGatewayServices', function($scope, GBPGatewayServices){ + $scope.list = []; + $scope.gatewayView = false; + $scope.selectedGateway = null; + $scope.newGatewayObj = GBPGatewayServices.createObj(); + $scope.displayLabel = 'gateway'; + $scope.crudLabel = 'Gateway list'; + $scope.view = { + gateway: false, + edit: false + }; + + + var path = null; + + $scope.init = function() { + if ( $scope.selectedTenant && $scope.selectedSubnet ) { + path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id); + + GBPGatewayServices.load(path, function(data){ + $scope.list = data; + $scope.newGatewayObj = GBPGatewayServices.createObj(); + $scope.view.gateway = false; + $scope.selectedGateway = null; + }, function(){ + + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.gatewayForm)){ + path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.newGatewayObj.gateway); + GBPGatewayServices.send(path, $scope.newGatewayObj, function(data){ + $scope.init(); + $scope.view.gateway = false; + $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) { + path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway); + GBPGatewayServices.delete(path, function(data){ + $scope.init(); + $scope.view.gateway = false; + $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.reload = function(selectedObj) { + $scope.selectedGateway = selectedObj; + angular.copy(selectedObj, $scope.newGatewayObj); + $scope.sendReloadEventFromRoot('GBP_GATEWAY_SET'); + }; + + $scope.showForm = function() { + $scope.newGatewayObj = GBPGatewayServices.createObj(); + $scope.view.gateway = true; + $scope.view.edit = false; + $scope.selectedGateway = null; + }; + + $scope.close = function(){ + $scope.view.gateway = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedGateway ) { + $scope.view.gateway = true; + $scope.view.edit = true; + angular.copy($scope.selectedGateway, $scope.newGatewayObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_SUBNET_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_PREFIX_RELOAD',function(){ + $scope.init(); + }); + }]); + + gbp.register.controller('prefixCtrl', ['$scope', 'GBPPrefixServices', function($scope, GBPPrefixServices){ + $scope.list = []; + $scope.selectedPrefix = null; + $scope.newPrefixObj = GBPPrefixServices.createObj(); + $scope.displayLabel = 'prefix'; + $scope.crudLabel = 'Prefix list'; + $scope.view = { + prefix: false, + edit: false + }; + + + var path = null; + + $scope.init = function() { + if ( $scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) { + path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway); + + GBPPrefixServices.load(path, function(data){ + $scope.list = data; + $scope.newPrefixObj = GBPPrefixServices.createObj(); + $scope.view.prefix = false; + $scope.selectedPrefix = null; + }, function(){ + + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.prefixForm)){ + path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.newPrefixObj.prefix); + GBPPrefixServices.send(path, $scope.newPrefixObj, function(data){ + $scope.init(); + $scope.view.prefix = false; + $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.selectedPrefix.prefix); + GBPPrefixServices.delete(path, function(data){ + $scope.init(); + $scope.view.prefix = false; + $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD'); + }, function(){ + //TODO: error cbk + }); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedPrefix = selectedObj; + angular.copy(selectedObj, $scope.newPrefixObj); + }; + + $scope.showForm = function() { + $scope.newPrefixObj = GBPPrefixServices.createObj(); + $scope.view.prefix = true; + $scope.view.edit = false; + $scope.selectedPrefix = null; + }; + + $scope.close = function(){ + $scope.view.prefix = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedPrefix ) { + $scope.view.prefix = true; + $scope.view.edit = true; + angular.copy($scope.selectedPrefix, $scope.newPrefixObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_GATEWAY_SET',function(){ + $scope.init(); + }); + }]); + + gbp.register.controller('renderersCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ //GBPContractServices + $scope.classifierDefinitions = {'options' : [], 'labels' : null}; + $scope.actionDefinitions = {'options' : [], 'labels' : null}; + + //reload on event? + + var loadDefinitions = function() { + GPBServices.getDefinitions(function(classifierDefs, actionDefs) { + $scope.classifierDefinitions.options = classifierDefs; + $scope.getDisplayLabelsFromCtrl('GBP_CLASSIFIERS_LABEL', $scope.classifierDefinitions); + + $scope.actionDefinitions.options = actionDefs; + $scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions); + }); + }; + + loadDefinitions(); + }]); + + gbp.register.controller('paramCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ + $scope.value = null; + + $scope.init = function(param, paramValues) { + $scope.parameter = param; + + if(paramValues) { + paramValues.forEach(function(p) { + if($scope.parameter.name === p.name) { + $scope.value = GPBServices.getInstanceParamValue(p); + } + }); + } + }; + + $scope.$on('GBP_SAVE_PARAM', function(event){ + if($scope.value !== '' && $scope.value !== null) { + $scope.addParam($scope.parameter.name, $scope.parameter.type, $scope.value); + } + }); + + $scope.$on('GBP_SET_PARAM_VALUE', function(event, name, intVal, strVal) { + console.info($scope.parameter, ' got GBP_SET_PARAM_VALUE', name, intVal, strVal, event); + + }); + }]); + + gbp.register.controller('classifiersCtrl', ['$scope', 'GBPClassifierInstanceServices', 'GPBServices', '$filter', + function($scope, GBPClassifierInstanceServices, GPBServices, $filter){ + $scope.list = []; + $scope.classifiersView = false; + $scope.displayLabel = 'name'; + $scope.selectedClassifier = null; + $scope.crudLabel = 'Classifiers'; + $scope.newClassifierObj = GBPClassifierInstanceServices.createObj(); + $scope.edit = false; + + var mandatoryProperties = ['name']; + + $scope.getDefinitionObjParams = function(id){ + return GPBServices.getDefinitionObjParams($scope.classifierDefinitions.options, id); + }; + + $scope.reloadDefs = function(){ + $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newClassifierObj['classifier-definition-id'])); + }; + + $scope.addParam = function(name, type, value) { + $scope.newClassifierObj['parameter-value'].push(GPBServices.createParamObj(name, type, value)); + }; + + var saveParams = function() { + $scope.newClassifierObj['parameter-value'] = []; + $scope.$broadcast('GBP_SAVE_PARAM'); + }; + + + $scope.init = function() { + if ( $scope.selectedTenant ) { + path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id); + GBPClassifierInstanceServices.load(path, function(data){ + $scope.list = data; + $scope.reloadDefs(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.classifierForm)){ + path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newClassifierObj.name); + saveParams(); + GBPClassifierInstanceServices.send(path, $scope.newClassifierObj, function(data){ + $scope.init(); + $scope.classifiersView = false; + $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.newClassifierObj = GBPClassifierInstanceServices.createObj(); + $scope.selectedClassifier = null; + $scope.classifiersView = true; + $scope.edit = false; + $scope.reloadDefs(); + }; + + $scope.reload = function(selectedObj){ + $scope.selectedClassifier = selectedObj; + if($scope.classifiersView) { + angular.copy(selectedObj, $scope.newClassifierObj); + } + $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD'); + $scope.reloadDefs(); + }; + + $scope.close = function(){ + $scope.classifiersView = false; + $scope.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedClassifier ) { + $scope.classifiersView = true; + angular.copy($scope.selectedClassifier, $scope.newClassifierObj); + $scope.edit = true; + $scope.reloadDefs(); + } + event.defaultPrevented = true; + } + }); + + $scope.delete = function(){ + path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedClassifier.name); + GBPClassifierInstanceServices.delete(path, function(data){ + $scope.init(); + $scope.classifiersView = false; + $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD'); + }, function(){ + //TODO: error cbk + }); + }; + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_CLASSIFIERS_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('actionsCtrl', ['$scope', 'GBPActionInstanceServices', 'GPBServices', '$filter', + function($scope, GBPActionInstanceServices, GPBServices, $filter){ + $scope.list = []; + $scope.actionsView = false; + $scope.displayLabel = 'name'; + $scope.selectedAction = null; + $scope.crudLabel = 'Actions'; + $scope.newActionObj = GBPActionInstanceServices.createObj(); + $scope.edit = false; + + var mandatoryProperties = ['name']; + + $scope.getDefinitionObjParams = function(id){ + return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id); + }; + + $scope.reloadDefs = function(){ + $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id'])); + }; + + $scope.addParam = function(name, type, value) { + $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value)); + }; + + var saveParams = function() { + $scope.newActionObj['parameter-value'] = []; + $scope.$broadcast('GBP_SAVE_PARAM'); + }; + + + $scope.init = function() { + if ( $scope.selectedTenant ) { + path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id); + GBPActionInstanceServices.load(path, function(data){ + $scope.list = data; + $scope.reloadDefs(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.actionsForm)){ + path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newActionObj.name); + saveParams(); + + GBPActionInstanceServices.send(path, $scope.newActionObj, function(data){ + $scope.init(); + $scope.actionsView = false; + $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.newActionObj = GBPActionInstanceServices.createObj(); + $scope.selectedAction = null; + $scope.actionsView = true; + $scope.edit = false; + $scope.reloadDefs(); + }; + + $scope.reload = function(selectedObj){ + $scope.selectedAction = selectedObj; + if($scope.actionsView) { + angular.copy(selectedObj, $scope.newActionObj); + } + $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); + $scope.reloadDefs(); + }; + + $scope.close = function(){ + $scope.actionsView = false; + $scope.edit = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedAction ) { + $scope.actionsView = true; + angular.copy($scope.selectedAction, $scope.newActionObj); + $scope.edit = true; + $scope.reloadDefs(); + } + event.defaultPrevented = true; + } + }); + + $scope.delete = function(){ + path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedAction.name); + GBPActionInstanceServices.delete(path, function(data){ + $scope.init(); + $scope.actionsView = false; + $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); + }, function(){ + //TODO: error cbk + }); + }; + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_ACTIONS_LABEL', function(event, obj){ + obj.labels = $scope.displayLabel; + }); + }]); + + gbp.register.controller('endpointCtrl', ['$scope', 'GBPEndpointServices', 'GPBServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', 'GBPEpgServices', '$filter', + function($scope, GBPEndpointServices, GPBServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, GBPEpgServices, $filter){ + $scope.list = []; + $scope.selectedEndpoint = null; + $scope.newEndpointObj = GBPEndpointServices.createObj(); + $scope.endpointView = false; + $scope.displayLabel = function(obj) { + return obj['mac-address'] + ':' + obj['l2-context']; + }; + $scope.crudLabel = 'Endpoint list'; + + $scope.l2context = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context); + + $scope.l3context = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context); + + $scope.epg = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg); + + var path = null, + mandatoryProperties = []; + + var loadEpgOptions = function() { + $scope.epg.options = []; + + path = GBPEpgServices.createPathObj($scope.selectedTenant.id); + GBPEpgServices.load(path, function(data){ + $scope.epg.options = data; + }, function(){ + //TODO: error cbk + }); + }; + + var loadL2ContextOptions = function() { + $scope.l2context.options = []; + + path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id); + + GBPL2FloodDomainServices.load(path, function(data){ + $scope.l2context.options = $scope.l2context.options.concat(data); + }, function(){ + + }); + + path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id); + GBPL2BridgeDomainServices.load(path, function(data){ + $scope.l2context.options = $scope.l2context.options.concat(data); + }, function(){ + + }); + }; + + var loadL3ContextOptions = function(){ + $scope.l3context.options = []; + + GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){ + $scope.l3context.options = data; + }, function(){ + + }); + }; + + $scope.init = function() { + if ($scope.selectedTenant) { + + GBPEndpointServices.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + + loadEpgOptions(); + loadL2ContextOptions(); + loadL3ContextOptions(); + } + }; + + $scope.addNewL3address = function() { + if($scope.newEndpointObj) { + if(!$scope.newEndpointObj['l3-address']){ + $scope.newEndpointObj['l3-address'] = []; + } + var objToPush = {'l3-context' : '', 'ip-address' : ''}; + $scope.newEndpointObj['l3-address'].push(objToPush); + } + }; + + $scope.deleteNewL3address = function(index){ + if($scope.newEndpointObj) { + $scope.newEndpointObj['l3-address'].splice(index, 1); + } + }; + + $scope.addNewLeafListEl = function(prop) { + if($scope.newEndpointObj) { + if(!$scope.newEndpointObj[prop]){ + $scope.newEndpointObj[prop] = []; + } + var objToPush = ""; + $scope.newEndpointObj[prop].push(objToPush); + } + }; + + $scope.updateLeafListEl = function(index, value, prop) { + if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) { + $scope.newEndpointObj[prop][index] = value; + } + }; + + $scope.deleteNewLeafListEl = function(index, prop){ + if($scope.newEndpointObj) { + $scope.newEndpointObj[prop].splice(index, 1); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.endpointForm)){ + GBPEndpointServices.send(path, $scope.newEndpointObj, function(data){ + $scope.init(); + $scope.endpointView = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedEndpoint) { + GBPEndpointServices.delete(path, $scope.selectedEndpoint, function(data){ + $scope.init(); + $scope.endpointView = false; + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.endpointView = true; + $scope.reloadNewObj(); + $scope.selectedEndpoint = null; + }; + + $scope.reloadNewObj = function() { + $scope.newEndpointObj = GBPEndpointServices.createObj(); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedEndpoint = selectedObj; + if($scope.endpointView) { + angular.copy(selectedObj, $scope.newEndpointObj); + } + }; + + $scope.close = function(){ + $scope.endpointView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedEndpoint ) { + $scope.endpointView = true; + angular.copy($scope.selectedEndpoint, $scope.newEndpointObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_EPG_RELOAD',function(){ + loadEpgOptions(); + }); + + $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ + loadL2ContextOptions(); + }); + + $scope.$on('GBP_L2FLOOD_RELOAD',function(){ + loadL2ContextOptions(); + }); + + $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ + loadL3ContextOptions(); + }); + }]); + + gbp.register.controller('l3EndpointCtrl', ['$scope', 'GBPEndpointL3Services', 'GPBServices', 'GBPEpgServices', 'GBPL3ContextServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter', + function($scope, GBPEndpointL3Services, GPBServices, GBPEpgServices, GBPL3ContextServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){ + $scope.list = []; + $scope.selectedEndpoint = null; + $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); + $scope.endpointView = false; + $scope.displayLabel = function(obj) { + return obj['ip-prefix'] + ':' + obj['l3-context']; + }; + $scope.crudLabel = 'L3 Prefix endpoint list'; + + $scope.l2context = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context); + + $scope.l3context = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context); + + $scope.epg = {'options' : [], 'labels' : null}; + $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg); + + + var path = null, + mandatoryProperties = []; + + var loadEpgOptions = function() { + $scope.epg.options = []; + + path = GBPEpgServices.createPathObj($scope.selectedTenant.id); + GBPEpgServices.load(path, function(data){ + $scope.epg.options = data; + }, function(){ + //TODO: error cbk + }); + }; + + var loadL2ContextOptions = function() { + $scope.l2context.options = []; + + path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id); + + GBPL2FloodDomainServices.load(path, function(data){ + $scope.l2context.options = $scope.l2context.options.concat(data); + }, function(){ + + }); + + path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id); + GBPL2BridgeDomainServices.load(path, function(data){ + $scope.l2context.options = $scope.l2context.options.concat(data); + }, function(){ + + }); + }; + + var loadL3ContextOptions = function(){ + $scope.l3context.options = []; + + GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){ + $scope.l3context.options = data; + }, function(){ + + }); + }; + + $scope.init = function() { + if ($scope.selectedTenant) { + + GBPEndpointL3Services.load(path, function(data){ + $scope.list = data; + }, function(){ + //TODO: error cbk + }); + + loadEpgOptions(); + loadL2ContextOptions(); + loadL3ContextOptions(); + } + }; + + $scope.addNewL2gateways = function() { + if($scope.newEndpointObj) { + if(!$scope.newEndpointObj['endpoint-l2-gateways']){ + $scope.newEndpointObj['endpoint-l2-gateways'] = []; + } + var objToPush = {'l2-context' : '', 'mac-address' : ''}; + $scope.newEndpointObj['endpoint-l2-gateways'].push(objToPush); + } + }; + + $scope.deleteNewL2gateways = function(index){ + if($scope.newEndpointObj) { + $scope.newEndpointObj['endpoint-l2-gateways'].splice(index, 1); + } + }; + + $scope.addNewL3gateways = function() { + if($scope.newEndpointObj) { + if(!$scope.newEndpointObj['endpoint-l3-gateways']){ + $scope.newEndpointObj['endpoint-l3-gateways'] = []; + } + var objToPush = {'l3-context' : '', 'ip-address' : ''}; + $scope.newEndpointObj['endpoint-l3-gateways'].push(objToPush); + } + }; + + $scope.deleteNewL3gateways = function(index){ + if($scope.newEndpointObj) { + $scope.newEndpointObj['endpoint-l3-gateways'].splice(index, 1); + } + }; + + $scope.addNewLeafListEl = function(prop) { + if($scope.newEndpointObj) { + if(!$scope.newEndpointObj[prop]){ + $scope.newEndpointObj[prop] = []; + } + var objToPush = ""; + $scope.newEndpointObj[prop].push(objToPush); + } + }; + + $scope.updateLeafListEl = function(index, value, prop) { + if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) { + $scope.newEndpointObj[prop][index] = value; + } + }; + + $scope.deleteNewLeafListEl = function(index, prop){ + if($scope.newEndpointObj) { + $scope.newEndpointObj[prop].splice(index, 1); + } + }; + + $scope.save = function(){ + if($scope.validateForm($scope.l3EndpointForm)){ + GBPEndpointL3Services.send(path, $scope.newEndpointObj, function(data){ + $scope.init(); + $scope.endpointView = false; + $scope.reloadNewObj(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.delete = function() { + if($scope.selectedTenant && $scope.selectedEndpoint) { + GBPEndpointL3Services.delete(path, $scope.selectedEndpoint, function(data){ + $scope.init(); + }, function(){ + //TODO: error cbk + }); + } + }; + + $scope.showForm = function() { + $scope.endpointView = true; + $scope.reloadNewObj(); + $scope.selectedEndpoint = null; + }; + + $scope.reloadNewObj = function() { + $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant.id); + }; + + $scope.reload = function(selectedObj) { + $scope.selectedEndpoint = selectedObj; + if($scope.endpointView) { + angular.copy(selectedObj, $scope.newEndpointObj); + } + }; + + $scope.close = function(){ + $scope.endpointView = false; + }; + + $scope.$on('PGN_EDIT_ELEM', function(event){ + if (!event.defaultPrevented) { + if ( $scope.selectedEndpoint ) { + $scope.endpointView = true; + angular.copy($scope.selectedEndpoint, $scope.newEndpointObj); + } + event.defaultPrevented = true; + } + }); + + $scope.$on('GBP_TENANT_RELOAD',function(){ + $scope.init(); + }); + + $scope.$on('GBP_EPG_RELOAD',function(){ + loadEpgOptions(); + }); + + $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ + loadL2ContextOptions(); + }); + + $scope.$on('GBP_L2FLOOD_RELOAD',function(){ + loadL2ContextOptions(); + }); + + $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ + loadL3ContextOptions(); + }); + }]); + +}); + + diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.css b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.css new file mode 100755 index 000000000..31c96d80d --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.css @@ -0,0 +1,187 @@ +/*GBP*/ +.gbpGlobalWrapper { + background: #f5f5f5; + margin-bottom: 0!important; + min-height: 100%; + padding-bottom: 60px; +} +.gbpGlobalWrapper span, +.gbpGlobalWrapper label { + color: #393939; +} +.gbpGlobalWrapper h2 { + color: #666; +} +.gbpGlobalWrapper .form-control, +.gbpGlobalWrapper .main input[type="text"] { + background: #fff; + color: #858585; +} +.gbpGlobalWrapper .form-control[disabled], +.gbpGlobalWrapper .main input[type="text"][disabled] { + background: #eeeeee; +} +.gbpGlobalWrapper .form-control.narrow-input-left { + width: 45%; + float: left; +} +.gbpGlobalWrapper .form-control.narrow-input-right { + width: 45%; + float: right; +} +.gbpGlobalWrapper .row-param { + margin-bottom: 15px; + float: left; +} +.gbpGlobalWrapper .param-label { + width: 100%; + float: left; +} +.gbpWrapper .btn-primary { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + font-weight: normal; +} +.gbpWrapper .noPadding { + padding: 0!important; +} +.gbpWrapper .basicLabel { + padding: 0; + font-weight: normal; +} +.gbpWrapper .rowWrapper { + margin-bottom: 5px; +} +.gbpWrapper aside.col-md-3 { + min-height: 100%; +} +.gbpWrapper .panelWrapper { + padding: 20px 0; +} +.gbpWrapper .panelWrapper button.btn { + margin-bottom: 5px; +} +.gbpWrapper .panelWrapper button.btn-list { + margin-top: 25px; +} +.gbpWrapper section.sigmaWrapper div.legend { + margin-bottom: 25px; +} +.gbpWrapper section.sigmaWrapper div.legend span, +.gbpWrapper section.sigmaWrapper div.legend .text { + color: #fff; +} +.gbpWrapper section.sigmaWrapper div.legend ul { + padding: 0; + margin: 0; + list-style: none; +} +.gbpWrapper section.sigmaWrapper div.legend li { + margin-bottom: 5px; +} +.gbpWrapper section.sigmaWrapper div.legend li .textHidden { + display: none; +} +.gbpWrapper section.sigmaWrapper div.legend li .text { + margin-left: 10px; + line-height: 18px; +} +.gbpWrapper section.sigmaWrapper div.legend li .showChckbx { + position: relative; + top: 2px; + left: 5px; +} +.gbpWrapper section.sigmaWrapper div.legend li .itemWrapper:hover .text { + display: block !important; +} +.gbpWrapper section.sigmaWrapper div.legend div.color { + /*margin-right: 15px;*/ + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + border-radius: 9px; + cursor: pointer; +} +.gbpWrapper #graph-container { + padding: 0; +} +.gbpWrapper .selectWrapper { + padding-left: 0; +} +.gbpWrapper .selectWrapper.col-md-12 { + padding: 0; + margin-bottom: 5px; +} +.gbpWrapper .inputWrapper.leftInput { + padding-left: 0; +} +.gbpWrapper .inputWrapper.rightInput { + padding-right: 0; +} +.gbpWrapper .separator { + padding-bottom: 10px; + margin-top: 15px; + height: 1px; + padding-left: 0px; + padding-right: 15px; +} +.gbpWrapper .inner-separator { + border-bottom: 1px solid #858585; + width: 100%; + float: left; +} +.gbpWrapper .btn-group { + padding: 0; +} +.gbpWrapper .formWrapper { + margin: 20px 0; +} +.gbpWrapper .icon-remove.align-right { + float: right; +} +.gbpWrapper .icon-exclamation-sign.red { + color: red; +} +.gbpWrapper .sigmaWrapper { + position: relative; +} +.gbpWrapper .sigmaWrapper .sigmaModalWrapper { + position: absolute; + top: 30px; + left: 45px; + z-index: 1; +} +.gbpWrapper .sigmaWrapper .sigmaModalWrapper .icon-remove { + position: absolute; + top: 5px; + right: 5px; +} +.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper { + position: relative; + background: #f5f5f5; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + min-width: 400px; + min-height: 100px; + margin-top: 20px; + padding: 20px; +} +.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .dataWrapper { + overflow-y: scroll; + max-height: 350px; +} +.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .rowWrapper { + padding: 10px; + margin-bottom: 10px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + border: 1px solid #d5d5d5; +} +/*GBP END*/ \ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less new file mode 100755 index 000000000..59bfed5a2 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less @@ -0,0 +1,231 @@ +/*GBP*/ +.gbpGlobalWrapper{ + background: #f5f5f5; + margin-bottom: 0!important; + min-height: 100%; + padding-bottom: 60px; + span, label { + color: #393939; + } + + h2{ + color: #666; + } + + .form-control, .main input[type="text"]{ + background: #fff; + color: #858585; + + &[disabled]{ + background: #eeeeee; + } + } + + + .form-control{ + &.narrow-input-left{ + width: 45%; + float: left; + } + &.narrow-input-right{ + width: 45%; + float: right; + } + } + + .row-param{ + margin-bottom: 15px; + float: left; + } + + .param-label{ + width:100%; + float: left; + } +} + +.gbpWrapper{ + + .btn-primary{ + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + font-weight: normal; + } + + .noPadding{ + padding: 0!important; + } + + .basicLabel{ + padding: 0; + font-weight: normal; + } + + .rowWrapper{ + margin-bottom: 5px; + } + + aside{ + &.col-md-3{ + min-height: 100%; + } + } + + .panelWrapper{ + padding: 20px 0; + button{ + &.btn{ + margin-bottom: 5px; + } + &.btn-list{ + margin-top: 25px; + } + } + } + + section.sigmaWrapper { + div.legend{ + margin-bottom: 25px; + + span, .text{ + color: #fff; + } + + ul{ + padding: 0; + margin: 0; + list-style: none; + } + li{ + margin-bottom: 5px; + .textHidden{ + display: none; + } + .text{ + margin-left: 10px; + line-height: 18px; + } + .showChckbx{ + position: relative; + top: 2px; + left: 5px; + } + .itemWrapper{ + &:hover{ + .text{ + display: block !important; + } + } + } + + } + div.color{ + /*margin-right: 15px;*/ + width: 18px; + height: 18px; + -webkit-border-radius: 9px; + border-radius: 9px; + cursor: pointer; + } + } + } + + #graph-container{ + // background: transparent; + padding: 0; + } + + .selectWrapper{ + padding-left: 0; + &.col-md-12{ + padding: 0; + margin-bottom: 5px; + } + } + + .inputWrapper{ + &.leftInput{ + padding-left: 0; + } + + &.rightInput{ + padding-right: 0; + } + } + + .separator{ + padding-bottom: 10px; + margin-top: 15px; + height: 1px; + padding-left: 0px; + padding-right: 15px; + } + + .inner-separator{ + border-bottom: 1px solid #858585; + width: 100%; + float: left; + } + + .btn-group{ + padding: 0; + } + + .formWrapper{ + margin: 20px 0; + } + + .icon-remove { + &.align-right { + float: right; + } + } + + .icon-exclamation-sign{ + &.red { + color: red; + } + } + + .sigmaWrapper{ + position: relative; + + .sigmaModalWrapper{ + position: absolute; + top: 30px; + left: 45px; + z-index: 1; + + .icon-remove{ + position: absolute; + top: 5px; + right: 5px; + } + + .tableWrapper{ + position: relative; + background: #f5f5f5; + .roundedCorners(5px); + min-width: 400px; + min-height: 100px; + margin-top: 20px; + padding: 20px; + + .dataWrapper{ + overflow-y: scroll; + max-height: 350px; + } + + .rowWrapper{ + padding: 10px; + margin-bottom: 10px; + .roundedCorners(5px); + border: 1px solid #d5d5d5; + } + } + } + } + +} +/*GBP END*/ \ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.module.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.module.js new file mode 100755 index 000000000..71308d52d --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.module.js @@ -0,0 +1,58 @@ +define(['angularAMD', 'app/routingConfig', 'ui-bootstrap', 'Restangular', 'angular-translate'], function() { + + var gbp = angular.module('app.gbp', ['ui.router.state','app.core', 'ui.bootstrap', 'restangular', 'pascalprecht.translate']); + + gbp.register = gbp; + + gbp.config(function ($stateProvider, $compileProvider, $controllerProvider, $provide, $translateProvider, NavHelperProvider, $filterProvider) { + + $translateProvider.useStaticFilesLoader({ + prefix: 'assets/data/locale-', + suffix: '.json' + }); + + gbp.register = { + directive : $compileProvider.directive, + controller : $controllerProvider.register, + filter: $filterProvider.register, + factory : $provide.factory, + service : $provide.service + }; + + NavHelperProvider.addControllerUrl('app/gbp/gbp.controller'); + NavHelperProvider.addToMenu('gbp', { + "link": "#/gbp/index", + "active": "main.gbp", + "title": "GBP", + "icon": "icon-level-down", + "page": { + "title": "GBP", + "description": "GBP" + } + }); + + var access = routingConfig.accessLevels; + $stateProvider.state('main.gbp', { + url: 'gbp', + abstract: true, + views : { + 'content' : { + templateUrl: 'src/app/gbp/views/root.tpl.html' + } + } + }); + + $stateProvider.state('main.gbp.index', { + url: '/index', + access: access.admin, + views: { + '': { + controller: 'gbpCtrl', + templateUrl: 'src/app/gbp/views/index.tpl.html' + } + } + }); + }); + + return gbp; +}); diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js new file mode 100755 index 000000000..a5c8c3780 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js @@ -0,0 +1,2153 @@ +define(['app/gbp/gbp.module'], function(gbp) { + + gbp.register.factory('GBPRestangular', function(Restangular, ENV) { + return Restangular.withConfig(function(RestangularConfig) { + RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL")); + }); + }); + + gbp.register.factory('GBPConstants', function() { + var c = { colors: {}, strings: {}}; + + c.strings.flood = 'flood'; + c.strings.bridge = 'bridge'; + c.strings.l3ctx = 'l3ctx'; + c.strings.subnet = 'subnet'; + + c.strings.config = 'CONFIG'; + c.strings.oper = 'OPERATIONAL'; + c.strings.l2l3 = 'L2L3'; + c.strings.mock = 'MOCK'; + c.strings.sigmaTopoDefaultText = 'SIGMATOPODEFAULTTEXT'; + c.strings.sigmaTopoDefault = 'SIGMATOPODEFAULTTEXT'; + + c.colors[c.strings.flood] = '#DF0101'; + c.colors[c.strings.bridge] = '#0080FF'; + c.colors[c.strings.l3ctx] = '#3ADF00'; + c.colors[c.strings.subnet] = '#FF9933'; + c.colors[c.strings.sigmaTopoDefaultText] = '#fff'; + + c.colors[c.strings.flood+'-'+c.strings.bridge] = '#6666FF'; + c.colors[c.strings.bridge+'-'+c.strings.l3ctx] = '#6666FF'; + + c.colors[c.strings.subnet+'-'] = '#6666FF'; + + return c; + }); + + gbp.register.factory('MockServices', function() { + + var ms = {}; + + ms.mockTopoData = function() { + var lid = 0, + nodeRaw = [0, 1, 2, 3], + linkRaw = [[0, 1], [2, 3], [3, 0], [0, 3]], + nodes = nodeRaw.map(function(data) { + return { + 'id': 'n' + data, + 'label': 'LABEL'+data, + 'size': 3, + 'x': Math.random(), + 'y': Math.random(), + 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault] + }; + }), + links = linkRaw.map(function(data) { + var obj = { + id: 'e' + lid, + source: 'n' + data[0], + target: 'n' + data[1], + color: GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault] + }; + lid = lid + 1; + return obj; + }); + + return {nodes: nodes, links: links}; + }; + + return ms; + }); + + gbp.register.factory('TopologyDataLoaders', function(GBPRestangular, GBPConstants) { + var tdl = {}; + + tdl.getSubjectsBetweenEndpointGroups = function(storage, tenantId, successCbk, errorCbk) { + var restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'ui-backend:get-subjects-between-endpoint-groups', + reqData = { "input": { "tenant-id": tenantId }}; + + if(storage) { + reqData.input['from-oper-data'] = {}; + } + + restObj.post(rpcRes, reqData).then(function(data) { + // console.info('got data', data.output); + successCbk(data); + }, function(res) { + errorCbk(res); + }); + }; + + //Policies are representing links in PGN topology + tdl.getGroupRulesBetweenEndpointGroups = function(successCbk, errorCbk) { + var restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'pgn-application:get-group-rules-between-endpoint-groups', + reqData = { "input": { "endpoint-group-pair":[] }}; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); //set topology links + }, function(res) { + errorCbk(res); + }); + }; + + //Groups are representing nodes in PGN topology + tdl.getEndpointGroups = function(successCbk, errorCbk) { + var tenantId = getId(idTypes.tenant), + restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'pgn-application:get-endpoint-groups', + reqData = { + "input": { + "endpoint-group-id":[ + { + "pgn-application:tenant-id": tenantId + } + ] + } + }; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); //set topology nodes + }, function(res) { + errorCbk(res); + }); + + }; + + tdl.getEpgTopo = function(data){ + var epgData = data.output['endpoint-group-pair-with-subject'], + nodes = [], + edges = [], + setNode = function(obj){ + var nodeObj = { + 'id': 'n' + nodes.length, + 'label': obj.type + ':' + obj.name, + 'name': obj.name, + 'size': 1, + 'x': Math.random(), + 'y': Math.random(), + 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]/*, + 'type' : getNodeType(obj.type)*/ + }; + + nodes.push(nodeObj); + return nodeObj.id; + }, + setEdge = function(sourceId, destId, data) { + var obj = { + 'id': 'e' + edges.length, + 'source': sourceId, + 'target': destId, + 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault], + 'data': data + // 'type': 'curve', + // 'size' : 100 + }; + + edges.push(obj); + }, + getObjByProp = function(val, prop, list) { + return list.filter(function(i){ + return i[prop] === val; + }); + }; + + + epgData.forEach(function(e){ + + var cepgnId = null, + pepgnId = null; + + + if ( !getObjByProp(e['consumer-endpoint-group-id'],'name', nodes).length ) { + // epgArray.push(e['consumer-endpoint-group-id']); + var objCepg = { + type: 'epg', + name: e['consumer-endpoint-group-id'] + }; + cepgnId = setNode(objCepg); + } else { + cepgnId = getObjByProp(e['consumer-endpoint-group-id'],'name', nodes)[0].id; + } + + if ( !getObjByProp(e['provider-endpoint-group-id'],'name', nodes).length ) { + var objPepg = { + type: 'epg', + name: e['provider-endpoint-group-id'] + }; + pepgnId = setNode(objPepg); + } else { + pepgnId = getObjByProp(e['provider-endpoint-group-id'],'name', nodes)[0].id; + } + + if ( cepgnId && pepgnId ) { + setEdge(cepgnId, pepgnId, e['ui-subject']); + } + + }); + + // console.log('nodes', nodes); + // console.log('edges', edges); + + return { + nodes: nodes, + links: edges + }; + }; + + + tdl.getL2L3 = function(storage, tenantId, successCbk, errorCbk) { + //l2-bridge-domain + var lid = 0, + nid = 0, + getL2L3Label = function(node) { + return node.id + (node.name ? ':' + node.name : ''); + }, + getSubnetLabel = function(node) { + return node.id + (node['ip-prefix'] ? ':' + node['ip-prefix'] : ''); + }, + getNodeColor = function(src) { + return GBPConstants.colors[src] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]; + }, + getLinkColor = function(from, to) { + return GBPConstants.colors[from+'-'+to] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]; + }, + getNodes = function(data, srcDesc, getLabelCbk) { + var nodes = data.map(function(elem) { + var obj = { + 'id': 'n' + nid, + 'label': getLabelCbk(elem), + 'uuid': elem.id, + 'size': 3, + 'x': Math.random(), + 'y': Math.random(), + 'color': getNodeColor(srcDesc) + }; + + nid += 1; + return obj; + }); + + return nodes; + }, + getLinks = function(data, srcNodes, targetNodes, fromDesc, toDesc) { + var findByUUID = function(array, uuid) { + return array.filter(function(elem) { + return elem.uuid === uuid; + })[0]; + }; + + var links = data.map(function(elem) { + var obj = null, + src = findByUUID(srcNodes, elem.id), + trg = findByUUID(targetNodes, elem.parent); + + if(src && trg) { + obj = { + 'id': 'e' + lid, + 'source': src.id, + 'target': trg.id, + 'color': getLinkColor(fromDesc, toDesc) + }; + lid += 1; + } + + return obj; + }).filter(function(elem) { + return elem !== null; + }); + + return links; + }; + + restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId); + + restObj.get().then(function(data) { + var l2FloodNodes = getNodes(data.tenant[0]['l2-flood-domain'] || [], GBPConstants.strings.flood, getL2L3Label), + l2BridgeNodes = getNodes(data.tenant[0]['l2-bridge-domain'] || [], GBPConstants.strings.bridge, getL2L3Label), + l3ContextNodes = getNodes(data.tenant[0]['l3-context'] || [], GBPConstants.strings.l3ctx, getL2L3Label), + subnetNodes = getNodes(data.tenant[0]['subnet'] || [], GBPConstants.strings.subnet, getSubnetLabel), + l2FloodLinks = getLinks(data.tenant[0]['l2-flood-domain'] || [], l2FloodNodes, l2BridgeNodes, GBPConstants.strings.flood, GBPConstants.strings.bridge), + l2BridgeLinks = getLinks(data.tenant[0]['l2-bridge-domain'] || [], l2BridgeNodes, l3ContextNodes, GBPConstants.strings.bridge, GBPConstants.strings.l3ctx), + subnetLinks = getLinks(data.tenant[0]['subnet'] || [], subnetNodes, l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes), GBPConstants.strings.subnet, ''), + allNodes = l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes).concat(subnetNodes), + allLinks = l2BridgeLinks.concat(l2FloodLinks).concat(subnetLinks); + + successCbk(allNodes, allLinks); + }, function(res) { + errorCbk(res.data, res.status); + }); + }; + + return tdl; + + }); + + gbp.register.factory('TopoServices', function(TopologyDataLoaders, MockServices, GBPConstants) { + + var ts = {}; + + var loaders = {}; + + var legends = {}; + + var transformPGNTopoNodes = function(data) { + return data.output['endpoint-group'].map(function(d) { + return { + id: d.id, + group: d.name, + sgt: d['security-group-tag'] + }; + }); + }; + + var transformPGNTopoLinks = function(data) { + return data.output['endpoint-group-pair-with-rules'].map(function(d) { + return { + source: d['provider-group-id'], + target: d['consumer-group-id'], + policy: d['group-rule'][0]['action-ref'].map(function(r) { + return r.name; + }) + }; + }); + }; + + var gbpLegend = { + 'epg' : GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault] + }; + + legends[GBPConstants.strings.empty] = {}; + legends[GBPConstants.strings.config] = gbpLegend; + legends[GBPConstants.strings.oper] = gbpLegend; + legends[GBPConstants.strings.mock] = gbpLegend; + legends[GBPConstants.strings.l2l3] = { + 'l2-flood': GBPConstants.colors[GBPConstants.strings.flood], + 'l2-bridge': GBPConstants.colors[GBPConstants.strings.bridge], + 'l3-context': GBPConstants.colors[GBPConstants.strings.l3ctx], + 'subnet': GBPConstants.colors[GBPConstants.strings.subnet], + 'link': GBPConstants.colors[GBPConstants.strings.subnet+'-'] + }; + + loaders[GBPConstants.strings.empty] = function(successCbk, errorCbk) { + successCbk([], []); + }; + + loaders[GBPConstants.strings.config] = function(successCbk, errorCbk, args) { + var storage = args.storage || 'config', + tenantId = args.tenantId; + + + TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){ + var topo = TopologyDataLoaders.getEpgTopo(data); + successCbk(topo.nodes, topo.links); + //successCbk + }, errorCbk); + }; + + loaders[GBPConstants.strings.oper] = function(successCbk, errorCbk, args) { + var storage = args.storage || 'config', + tenantId = args.tenantId; + + TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, successCbk, errorCbk); + }; + + loaders[GBPConstants.strings.l2l3] = function(successCbk, errorCbk, args) { + var storage = args.storage || 'config', + tenantId = args.tenantId; + + if(storage && tenantId) { + TopologyDataLoaders.getL2L3(storage, tenantId, successCbk, errorCbk); + } else { + //different kind of error + errorCbk(); + } + }; + + loaders[GBPConstants.strings.mock] = function(successCbk, errorCbk) { + var data = MockServices.mockTopoData(); + successCbk(data.nodes, data.links); + }; + + ts.getConsProvLabel = function(edge, topo){ + var provName = '', + conName = ''; + + topo.nodes.forEach(function(n){ + + if ( edge.source === n.id ) { + provName = n.name; + } + + if ( edge.target === n.id ) { + conName = n.name; + } + }); + + return provName + ':' + conName; + }; + + ts.getLegend = function(type) { + if(type === null || legends.hasOwnProperty(type) === false) { + type = GBPConstants.strings.empty; + } + + return legends[type]; + }; + + ts.loadTopology = function(type, successCbk, errorCbk, args) { + if(type === null || loaders.hasOwnProperty(type) === false) { + type = GBPConstants.strings.empty; + } + + loaders[type](successCbk, errorCbk, args); + }; + + return ts; + }); + + gbp.register.factory('GPBServices', function(GBPRestangular) { + + var s = {}; + + s.getDefinitions = function(successCbk, errorCbk) { + var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions'); + + restObj.get().then(function(data) { + if(data['subject-feature-definitions']) { + var classifiersDefs = data['subject-feature-definitions']['classifier-definition'] || [], + actionsDefs = data['subject-feature-definitions']['action-definition'] || []; + successCbk(classifiersDefs, actionsDefs); + } else { + //TODO log error + } + }, function(res) { + // errorCbk(res); + }); + }; + + s.getUUIDnumber = function() { + var d = new Date().getTime(); + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (d + Math.random()*16)%16 | 0; + d = Math.floor(d/16); + return (c=='x' ? r : (r&0x3|0x8)).toString(16); + }); + }; + + s.createRestObj = function(storage) { + storage = storage || 'config'; + restObj = GBPRestangular.one('restconf').one(storage); + + return restObj; + }; + + s.send = function(restObj, reqData, successCbk, errorCbk) { + restObj.customPUT(reqData).then(function(data) { + successCbk(data); + }, function(res) { + errorCbk(res.data, res.status); + }); + }; + + s.post = function(restObj, reqData, successCbk, errorCbk) { + restObj.customPOST(reqData).then(function(data) { + successCbk(data); + }, function(res) { + errorCbk(res.data, res.status); + }); + }; + + s.delete = function(restObj, successCbk, errorCbk) { + restObj.remove().then(function(data) { + successCbk(data); + }, function(res) { + errorCbk(res.data, res.status); + }); + }; + + s.load = function(restObj, transformCallback, successCbk, errorCbk) { + restObj.get().then(function(data) { + var objs = transformCallback(data) || []; + successCbk(objs); + }, function(res) { + errorCbk(res.data, res.status); + }); + }; + + s.stripNullValues = function(obj) { + Object.keys(obj).forEach(function(k) { + if(obj[k] === null) { + delete obj[k]; + } + }); + + return obj; + }; + + s.removeEmptyElementsFromList = function(list) { + return list.filter(function(e) { + return e !== ""; + }); + }; + + s.createParamObj = function(name, type, value) { + var obj = { name: name }; + + obj[type+'-value'] = value; + + return obj; + }; + + s.getInstanceParamValue = function(param) { + return param['int-value'] || param['string-value'] || param['range-value']; + }; + + s.getDefinitionObjParams = function(defObj, id) { + var obj = defObj.filter(function(def) { + return def.id === id; + })[0], + params = (obj && obj.parameter) ? obj.parameter : []; + + return params; + + }; + + return s; + + }); + + gbp.register.factory('GBPTenantServices', function(GPBServices) { + + var s = {}; + + var Tenant = function(id, name, description) { + this.id = id || GPBServices.getUUIDnumber(); + this.name = name || null; + this.description = description || null; + }; + + var createBaseRestObj = function() { + return GPBServices + .createRestObj().one('policy:tenants'); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj().one('tenant').one(pathObj.tenantId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new Tenant(rawObj.id, rawObj.name, rawObj.description); + // }); + return rawData.tenants.tenant; + }; + + var createData = function(obj) { + return { tenant : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId) { + return { + tenantId: tenantId + }; + }; + + s.createObj = function() { + return new Tenant(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.modify = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(successCbk, errorCbk) { + var restObj = createBaseRestObj(); + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPContractServices', function(GPBServices) { + + var s = {}; + + var Contract = function(id, description, parent) { + this.id = id || GPBServices.getUUIDnumber(); + this.description = description || null; + this.parent = parent || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj().one('policy:tenants').one('tenant').one(pathObj.tenantId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('contract').one(pathObj.contractId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new Contract(rawObj.id, rawObj.description); + // }); + return rawData.tenant[0].contract; + }; + + var createData = function(obj) { + return { contract : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, contractId) { + return { + tenantId: tenantId, + contractId: contractId + }; + }; + + s.createObj = function() { + return new Contract(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPClauseServices', function(GPBServices) { + + var s = {}; + + var Clause = function(name, subjectRefs) { + this.name = name || null; + this['subject-refs'] = subjectRefs || []; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId) + .one('contract').one(pathObj.contractId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('clause').one(pathObj.clauseId); + }; + + var transformCallback = function(rawData) { + var data = null, + clauseData = rawData.contract[0].clause; + + if(clauseData) { + data = clauseData.map(function(elem) { + if(elem.hasOwnProperty('subject-refs') === false) { + elem['subject-refs'] = []; + } + return elem; + }); + } + + return data; + }; + + var createData = function(obj) { + var o = GPBServices.stripNullValues(obj); + + if(o['subject-refs']) { + o['subject-refs'] = GPBServices.removeEmptyElementsFromList(o['subject-refs']); + } + + return { clause : [ o ] }; + }; + + s.createPathObj = function(tenantId, contractId, clauseId) { + return { + tenantId: tenantId, + contractId: contractId, + clauseId: clauseId + }; + }; + + s.createObj = function() { + return new Clause(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPSubjectServices', function(GPBServices) { + + var s = {}; + + var Subject = function(name, order) { + this.name = name || null; + this.order = order || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId) + .one('contract').one(pathObj.contractId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('subject').one(pathObj.subjectId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new Subject(rawObj.name, rawObj.order); + // }); + return rawData.contract[0].subject; + }; + + var createData = function(obj) { + return { subject : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, contractId, subjectId) { + return { + tenantId: tenantId, + contractId: contractId, + subjectId: subjectId + }; + }; + + s.createObj = function() { + return new Subject(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPRuleServices', function(GPBServices) { + + var s = {}; + + var Rule = function(name, order) { + this.name = name || null; + this.order = order || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant') + .one(pathObj.tenantId).one('contract').one(pathObj.contractId) + .one('subject').one(pathObj.subjectId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('rule').one(pathObj.ruleId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new Rule(rawObj.name, rawObj.order); + // }); + return rawData.subject[0].rule; + }; + + var createData = function(obj) { + return { rule : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, contractId, subjectId, ruleId) { + return { + tenantId: tenantId, + contractId: contractId, + subjectId: subjectId, + ruleId: ruleId + }; + }; + + s.createObj = function() { + return new Rule(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPClassifierRefsServices', function(GPBServices) { + + var s = {}; + + var ClassifierRef = function(name, direction, instanceName, connectionTracking) { + this.name = name || null; + this.direction = direction || null; + this['instance-name'] = instanceName || null; + this['connection-tracking'] = connectionTracking || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant') + .one(pathObj.tenantId).one('contract').one(pathObj.contractId) + .one('subject').one(pathObj.subjectId) + .one('rule').one(pathObj.ruleId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('classifier-ref').one(pathObj.classifierRefId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new ClassifierRef(rawObj.name, rawObj.direction, rawObj['instance-name']); + // }); + return rawData.rule[0]['classifier-ref']; + }; + + var createData = function(obj) { + return { 'classifier-ref' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, contractId, subjectId, ruleId, classifierRefId) { + return { + tenantId: tenantId, + contractId: contractId, + subjectId: subjectId, + ruleId: ruleId, + classifierRefId: classifierRefId + }; + }; + + s.createObj = function() { + return new ClassifierRef(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPActionRefsServices', function(GPBServices) { + + var s = {}; + + var ActionRef = function(name, order, instanceName) { + this.name = name || null; + this.order = order || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant') + .one(pathObj.tenantId).one('contract').one(pathObj.contractId) + .one('subject').one(pathObj.subjectId) + .one('rule').one(pathObj.ruleId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('action-ref').one(pathObj.actionRefId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new ActionRef(rawObj.name, rawObj.order); + // }); + return rawData.rule[0]['action-ref']; + }; + + var createData = function(obj) { + return { 'action-ref' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, contractId, subjectId, ruleId, actionRefId) { + return { + tenantId: tenantId, + contractId: contractId, + subjectId: subjectId, + ruleId: ruleId, + actionRefId: actionRefId + }; + }; + + s.createObj = function() { + return new ActionRef(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPL2FloodDomainServices', function(GPBServices) { + + var s = {}; + + var L2FloodDomain = function(id, name, description, parent) { + this.id = id || GPBServices.getUUIDnumber(); + this.name = name || null; + this.description = description || null; + this.parent = parent || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('l2-flood-domain').one(pathObj.l2FloodDomain); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new L2FloodDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent); + // }); + return rawData.tenant[0]['l2-flood-domain']; + }; + + var createData = function(obj) { + return { 'l2-flood-domain' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, l2FloodDomain) { + return { + tenantId: tenantId, + l2FloodDomain: l2FloodDomain + }; + }; + + s.createObj = function() { + return new L2FloodDomain(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPL2BridgeDomainServices', function(GPBServices) { + + var s = {}; + + var L2BridgeDomain = function(id, name, description, parent) { + this.id = id || GPBServices.getUUIDnumber(); + this.name = name || null; + this.description = description || null; + this.parent = parent || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant') + .one(pathObj.tenantId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('l2-bridge-domain').one(pathObj.l2BridgeDomain); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new L2BridgeDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent); + // }); + return rawData.tenant[0]['l2-bridge-domain']; + }; + + var createData = function(obj) { + return { 'l2-bridge-domain' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, l2BridgeDomain) { + return { + tenantId: tenantId, + l2BridgeDomain: l2BridgeDomain + }; + }; + + s.createObj = function() { + return new L2BridgeDomain(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPL3ContextServices', function(GPBServices) { + + var s = {}; + + var L3Context = function(id, name, description) { + this.id = id || GPBServices.getUUIDnumber(); + this.name = name || null; + this.description = description || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('l3-context').one(pathObj.l3Context); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new L3Context(rawObj.id, rawObj.name, rawObj.description); + // }); + return rawData.tenant[0]['l3-context']; + }; + + var createData = function(obj) { + return { 'l3-context' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, l3Context) { + return { + tenantId: tenantId, + l3Context: l3Context + }; + }; + + s.createObj = function() { + return new L3Context(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPSubnetServices', function(GPBServices) { + + var s = {}; + + var Subnet = function(id, name, description, parent, ipPrefix, virtualRouterIp) { + this.id = id || GPBServices.getUUIDnumber(); + this.name = name || null; + this.description = description || null; + this.parent = parent || null; + this['ip-prefix'] = ipPrefix || null; + this['virtual-router-ip'] = virtualRouterIp || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('subnet').one(pathObj.subnet); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new L3Context(rawObj.id, rawObj.name, rawObj.description); + // }); + return rawData.tenant[0]['subnet']; + }; + + var createData = function(obj) { + return { 'subnet' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, subnet) { + return { + tenantId: tenantId, + subnet: subnet + }; + }; + + s.createObj = function() { + return new Subnet(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPGatewayServices', function(GPBServices) { + + var s = {}; + + var Gateway = function(gateway) { + this.gateway = gateway || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('gateways').one(pathObj.gateway); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new L3Context(rawObj.id, rawObj.name, rawObj.description); + // }); + return rawData.subnet[0]['gateways']; + }; + + var createData = function(obj) { + return { 'gateways' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, subnetId, gateway) { + return { + tenantId: tenantId, + subnetId: subnetId, + gateway: gateway + }; + }; + + s.createObj = function() { + return new Gateway(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPPrefixServices', function(GPBServices) { + + var s = {}; + + var Prefix = function(prefix) { + this.prefix = prefix || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId).one('gateways').one(pathObj.gatewayId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('prefixes').one(pathObj.prefixId); + }; + + var transformCallback = function(rawData) { + // return rawData.map(function(rawObj){ + // return new L3Context(rawObj.id, rawObj.name, rawObj.description); + // }); + return rawData.gateways[0].prefixes; + }; + + var createData = function(obj) { + return { 'prefixes' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, subnetId, gatewayId, prefixId) { + return { + tenantId: tenantId, + subnetId: subnetId, + gatewayId: gatewayId, + prefixId: prefixId ? prefixId.replace("/", "%2F") : prefixId + }; + }; + + s.createObj = function() { + return new Prefix(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPClassifierInstanceServices', function(GPBServices) { + + var s = {}; + + var ClassifierService = function(name, classifierDefId) { + this.name = name || null; + this['classifier-definition-id'] = classifierDefId || null; + this['parameter-value'] = []; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances'); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('classifier-instance').one(pathObj.classfierInstanceId); + }; + + var transformCallback = function(rawData) { + return rawData['subject-feature-instances']['classifier-instance']; + }; + + var createData = function(obj) { + return { 'classifier-instance' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, classfierInstanceId) { + return { + tenantId: tenantId, + classfierInstanceId: classfierInstanceId + }; + }; + + s.createObj = function() { + return new ClassifierService(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPActionInstanceServices', function(GPBServices) { + + var s = {}; + + var ActionService = function(name, actionDefId) { + this.name = name || null; + this['action-definition-id'] = actionDefId || null; + this['parameter-value'] = []; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances'); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('action-instance').one(pathObj.actionInstanceId); + }; + + var transformCallback = function(rawData) { + return rawData['subject-feature-instances']['action-instance']; + }; + + var createData = function(obj) { + return { 'action-instance' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, actionInstanceId) { + return { + tenantId: tenantId, + actionInstanceId: actionInstanceId + }; + }; + + s.createObj = function() { + return new ActionService(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + s.getDefinitions = function(successCbk, errorCbk) { + var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions'); + + restObj.get().then(function(data) { + successCbk(data['subject-feature-definitions']['action-definition']); + }, function(res) { + // errorCbk(res); + }); + }; + + return s; + + }); + + gbp.register.factory('GBPEpgServices', function(GPBServices) { + + var s = {}; + + var EPG = function(name, description, intraGroupPolicy, networkDomain, id, parent) { + this.id = id || GPBServices.getUUIDnumber(); + this.name = name || null; + this.description = description || null; + this['intra-group-policy'] = intraGroupPolicy || null; + this['network-domain'] = networkDomain || null; + this.parent = parent || null; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('endpoint-group').one(pathObj.epgId); + }; + + var transformCallback = function(rawData) { + return rawData.tenant[0]['endpoint-group']; + }; + + var createData = function(obj) { + return { 'endpoint-group' : [ GPBServices.stripNullValues(obj) ] }; + }; + + s.createPathObj = function(tenantId, epgId) { + return { + tenantId: tenantId, + epgId: epgId + }; + }; + + s.createObj = function() { + return new EPG(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPConNamedSelServices', function(GPBServices) { + + var s = {}; + + var ConsumerNamedSelector = function(name, contract) { + this.name = name || null; + this.contract = contract || []; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('consumer-named-selector').one(pathObj.cnsId); + }; + + var transformCallback = function(rawData) { + var data = null, + consumerData = rawData['endpoint-group'][0]['consumer-named-selector']; + + if(consumerData) { + data = consumerData.map(function(elem) { + if(elem.hasOwnProperty('contract') === false) { + elem.contract = []; + } + return elem; + }); + } + + return data; + }; + + var createData = function(obj) { + var o = GPBServices.stripNullValues(obj); + + if(o.contract) { + o.contract = GPBServices.removeEmptyElementsFromList(o.contract); + } + + return { 'consumer-named-selector' : [ o ] }; + }; + + s.createPathObj = function(tenantId, epgId, cnsId) { + return { + tenantId: tenantId, + epgId: epgId, + cnsId: cnsId + }; + }; + + s.createObj = function() { + return new ConsumerNamedSelector(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + + gbp.register.factory('GBPProNamedSelServices', function(GPBServices) { + + var s = {}; + + var ProviderNamedSelector = function(name, contract) { + this.name = name || null; + this.contract = contract || []; + }; + + var createBaseRestObj = function(pathObj) { + return GPBServices.createRestObj() + .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId); + }; + + var createRestObj = function(pathObj) { + return createBaseRestObj(pathObj).one('provider-named-selector').one(pathObj.cnsId); + }; + + var transformCallback = function(rawData) { + var data = null, + provderData = rawData['endpoint-group'][0]['provider-named-selector']; + + if(provderData) { + data = provderData.map(function(elem) { + if(elem.hasOwnProperty('contract') === false) { + elem.contract = []; + } + return elem; + }); + } + + return data; + }; + + var createData = function(obj) { + var o = GPBServices.stripNullValues(obj); + + if(o.contract) { + o.contract = GPBServices.removeEmptyElementsFromList(o.contract); + } + + return { 'provider-named-selector' : [ o ] }; + }; + + s.createPathObj = function(tenantId, epgId, cnsId) { + return { + tenantId: tenantId, + epgId: epgId, + cnsId: cnsId + }; + }; + + s.createObj = function() { + return new ProviderNamedSelector(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path), + reqData = createData(obj); + + GPBServices.send(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, successCbk, errorCbk) { + var restObj = createRestObj(path); + + GPBServices.delete(restObj, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = createBaseRestObj(path); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPEndpointServices', function(GPBServices) { + + var s = {}; + + var Endpoint = function() { + this.tenant = null; + this['network-containment'] = null; + this['endpoint-group'] = null; + this['endpoint-groups'] = []; + this.condition = []; + this['l2-context'] = null; + this['mac-address'] = null; + this['l3-address'] = []; + }; + + var createRestObj = function() { + return GPBServices.createRestObj('operations'); + }; + + var transformCallback = function(rawData) { + return rawData.endpoints.endpoint; + }; + + var createBaseData = function(obj) { + var o = GPBServices.stripNullValues(obj); + + if(o.condition) { + o.condition = GPBServices.removeEmptyElementsFromList(o.condition); + } + + if(o['endpoint-groups']) { + o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']); + } + + if(o['l3-address']) { + o['l3-address'] = GPBServices.removeEmptyElementsFromList(o['l3-address']); + } + + return o; + }; + + var createSendData = function(obj) { + var o = createBaseData(obj); + return { 'input': o }; + }; + + var createDeleteData = function(obj) { + var o = { + 'input': { + 'l3': obj['l3-address'], + 'l2': [ + { + 'l2-context': obj['l2-context'], + 'mac-address': obj['mac-address'] + } + ] + } + }; + + return o; + }; + + s.createObj = function() { + return new Endpoint(); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj().one('endpoint:register-endpoint'), + reqData = createSendData(obj); + + GPBServices.post(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path).one('endpoint:unregister-endpoint'), + reqData = createDeleteData(obj); + GPBServices.post(restObj, reqData, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints'); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('GBPEndpointL3Services', function(GPBServices) { + + var s = {}; + + var EndpointL3 = function(tenantId) { + this.tenant = tenantId || null; + this['endpoint-group'] = null; + this['endpoint-groups'] = []; + this.condition = []; + this['l3-context'] = null; + this['ip-prefix'] = null; + this['endpoint-l2-gateways'] = []; + this['endpoint-l3-gateways'] = []; + }; + + var createRestObj = function() { + return GPBServices.createRestObj('operations'); + }; + + var transformCallback = function(rawData) { + return rawData.endpoints['endpoint-l3-prefix']; + }; + + var createBaseData = function(obj) { + var o = GPBServices.stripNullValues(obj); + + if(o.condition) { + o.condition = GPBServices.removeEmptyElementsFromList(o.condition); + } + + if(o['endpoint-groups']) { + o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']); + } + + if(o['endpoint-l2-gateways']) { + o['endpoint-l2-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l2-gateways']); + } + + if(o['endpoint-l3-gateways']) { + o['endpoint-l3-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l3-gateways']); + } + + return o; + }; + + var createSendData = function(obj) { + var o = createBaseData(obj); + return { 'input': o }; + }; + + var createDeleteData = function(obj) { + var o = { + 'input': { + 'l3-prefix': [ + { + 'l3-context': obj['l3-context'], + 'ip-prefix': obj['ip-prefix'] + } + ], + 'l2': obj['endpoint-l2-gateways'], + 'l3': obj['endpoint-l3-gateways'] + } + }; + + return o; + }; + + s.createObj = function(tenantId) { + return new EndpointL3(tenantId); + }; + + s.send = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj().one('endpoint:register-l3-prefix-endpoint'), + reqData = createSendData(obj); + + GPBServices.post(restObj, reqData, successCbk, errorCbk); + }; + + s.delete = function(path, obj, successCbk, errorCbk) { + var restObj = createRestObj(path).one('endpoint:unregister-endpoint'), + reqData = createDeleteData(obj); + + GPBServices.post(restObj, reqData, successCbk, errorCbk); + }; + + s.load = function(path, successCbk, errorCbk) { + var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints'); + + GPBServices.load(restObj, transformCallback, successCbk, errorCbk); + }; + + return s; + + }); + + gbp.register.factory('PGNServices', function(GBPRestangular) { + + var s = {}; + + var idGetter = {}; + + var idTypes = { + tenant: 'TENANT', + uuid: 'UUID', + l3ctx: 'L3CTX', + pathAction: 'PATHACTION', + accessAction: 'ACCESSACTION' + }; + + idGetter[idTypes.tenant] = function() { + return 1; + }; + + idGetter[idTypes.uuid] = function() { + return 2; + }; + + idGetter[idTypes.l3ctx] = function() { + return 3; + }; + + idGetter[idTypes.pathAction] = function() { + return 4; + }; + + idGetter[idTypes.accessAction] = function() { + return 5; + }; + + var getId = function(type) { + if(idGetter.hasOwnProperty(type)) { + return id = idGetter[type](); + } else { + throw "Cannot get idGetter for type " + type; + } + }; + + s.addReplaceEndpointGroup = function(successCbk, errorCbk, groupName, sgt, description) { + var tenantId = getId(idTypes.tenant), + uuid = getId(idTypes.uuid), + restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'pgn-application:create-or-replace-endpoint-groups', + reqData = { + "input": + { + "endpoint-group":[ + { + "pgn-application:tenant-id": tenantID, + "pgn-application:id":uuid, + "pgn-application:security-group-tag":sgt, + "pgn-application:name":groupName, + "pgn-application:description":description + } + ] + } + }; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); + }, function(res) { + errorCbk(res); + }); + }; + + s.deleteEndpointGroup = function(successCbk, errorCbk, uuid) { + var tenantId = getId(idTypes.tenant), + restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'pgn-application:delete-endpoint-groups', + reqData = { + "input": { + "endpoint-group":[ + { + "pgn-application:tenant-id": tenantId, + "pgn-application:id":uuid + } + ] + } + }; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); + }, function(res) { + errorCbk(res); + }); + }; + + s.getActions = function(successCbk, errorCbk) { + var tenantId = getId(idTypes.tenant), + pathActionId = getId(idTypes.pathAction), + accessActionId = getId(idTypes.accessAction), + restObj = GBPRestangular.one('restconf').one('config').one('policy:tenants', tenantId).one('subject-feature-instances'); + + restObj.get().then(function(data) { + successCbk(data); //TODO fill actions + }, function(res) { + errorCbk(res); + }); + }; + + s.applyPolicy = function(successCbk, errorCbk, providerId, consumerId, pathSelRule, accessCtrlRule) { + var restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'pgn-application:wire-endpoint-groups', + actionRefName = (pathSelRule ? pathSelRule : '') + (accessCtrlRule ? accessCtrlRule : ''), + reqData = { + "input": { + "endpoint-group-pair-with-rules": { + "pgn-application:provider-tenant-id": tenantID, + "pgn-application:consumer-tenant-id": tenantID, + "pgn-application:provider-group-id":providerId, + "pgn-application:consumer-group-id":consumerId, + "pgn-application:group-rule": [ + { + "action-ref": [pathSelRule, accessCtrlRule].map(function(r) { + return { "name":r }; + }), + "name":actionRefName + } + ] + } + } + }; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); //TODO reload policies + }, function(res) { + errorCbk(res); + }); + }; + + s.deletePolicy = function(successCbk, errorCbk, providerId, consumerId) { + var tenantId = getId(idTypes.tenant), + restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'pgn-application:unwire-endpoint-groups', + reqData = { + "input": + { + "endpoint-group-pair":[ + { + "pgn-application:provider-tenant-id": tenantId, + "pgn-application:consumer-tenant-id": tenantId, + "pgn-application:provider-group-id":providerId, + "pgn-application:consumer-group-id":consumerId + } + ] + } + }; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); //TODO reload policies + }, function(res) { + errorCbk(res); + }); + }; + + s.addEndPoint = function(successCbk, errorCbk, ipAddress, groupId) { + var l3ctxId = getId(idTypes.l3ctx), + tenantId = getId(idTypes.tenant), + restObj = GBPRestangular.one('restconf').one('operations'), + rpcRes = 'endpoint:register-endpoint', + reqData = { + "input": { + "endpoint-group": groupId, + "l3-address": [ + { + "ip-address": ipAddress, + "l3-context": l3ctxId + } + ], + "tenant": tenantId + } + }; + + restObj.post(rpcRes, reqData).then(function(data) { + successCbk(data); + }, function(res) { + errorCbk(res); + }); + }; + + s.getUUIDnumber = function() { + var d = new Date().getTime(); + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (d + Math.random()*16)%16 | 0; + d = Math.floor(d/16); + return (c=='x' ? r : (r&0x3|0x8)).toString(16); + }); + }; + + return s; + }); + + gbp.register.factory('DesignGbpFactory', function(){ + + var dvf = {}; + + dvf.setMainClass = function(){ + if ( $('.gbpWrapper').length ) { + $('.gbpWrapper').closest('.col-xs-12').addClass('gbpGlobalWrapper'); + } + }; + + return dvf; + + }); +}); \ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/action-ref.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/action-ref.tpl.html new file mode 100755 index 000000000..0918badcc --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/action-ref.tpl.html @@ -0,0 +1,27 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + +
+ + +
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/actions.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/actions.tpl.html new file mode 100755 index 000000000..c6d06c6d0 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/actions.tpl.html @@ -0,0 +1,46 @@ +
+

Actions

+ +
+ +
+
+ + + +
+ + +
+ +
+ + +
+ +
+
+
+
+ + +
+
+ + + + +
+
+
+
+
+
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifier-ref.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifier-ref.tpl.html new file mode 100755 index 000000000..25ac083d5 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifier-ref.tpl.html @@ -0,0 +1,41 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifiers.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifiers.tpl.html new file mode 100755 index 000000000..c3237c7a8 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/classifiers.tpl.html @@ -0,0 +1,51 @@ +
+

Classifiers

+ +
+ +
+
+ + + +
+ + +
+ +
+ + +
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+ +
+ +
+
+
+
+
+
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/clause.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/clause.tpl.html new file mode 100755 index 000000000..64c3b9f33 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/clause.tpl.html @@ -0,0 +1,34 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + + +
+
+ +
+ +
+
+ + +
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/cns.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/cns.tpl.html new file mode 100755 index 000000000..609424dd7 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/cns.tpl.html @@ -0,0 +1,34 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + + +
+
+ +
+ +
+
+ + +
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/contracts.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/contracts.tpl.html new file mode 100755 index 000000000..dbc174038 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/contracts.tpl.html @@ -0,0 +1,44 @@ +
+ +

Contracts

+ + +
+ +
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+
+ +
+
+
+ + + +
+ + diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/docs.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/docs.tpl.html new file mode 100755 index 000000000..958f4ba74 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/docs.tpl.html @@ -0,0 +1,4 @@ +
+

Docs

+ +
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/endpoint.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/endpoint.tpl.html new file mode 100755 index 000000000..2b48eecec --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/endpoint.tpl.html @@ -0,0 +1,102 @@ +
+ +

Endpoint

+ +
+ +
+
+ + +
+ + +
+ +
+ + +
+ +
+ + + +
+
+
+ +
+
+ +
+
+ +
+ + + +
+
+
+ +
+
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/epg.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/epg.tpl.html new file mode 100755 index 000000000..8be2f7c49 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/epg.tpl.html @@ -0,0 +1,62 @@ +
+

EPG

+ +
+ +
+
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ +
+
+
+ +
+
+
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/gateway.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/gateway.tpl.html new file mode 100755 index 000000000..3f621e12e --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/gateway.tpl.html @@ -0,0 +1,25 @@ +
+ +
+ +
+
+ + +
+ + +
+ + +
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html new file mode 100755 index 000000000..5b5eaa159 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html @@ -0,0 +1,156 @@ +
+ + +
+ + + + +
+ +
+
    +
  • Legend:
  • +
  • +
    +
    +
    {{key}}
    +
    +
  • +
+
+ + + +
+ + +
+
+
+ + {{ getConsProvLabel(edge) }} +
+ +
+
+ +
+ Classifier: +
    +
  • {{key}}: {{value}}
  • +
+
+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ + + +
+
+ +
+ + + + +
+ diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/l2l3.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/l2l3.tpl.html new file mode 100755 index 000000000..42b1744ee --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/l2l3.tpl.html @@ -0,0 +1,171 @@ +
+
+ +
+
+ + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ +

+ +
+ +
+ +
+
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ +

+ +
+ +
+ +
+
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ +

+ +
+ +
+ +
+
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ +
+
+
+ + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/l3-endpoint.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/l3-endpoint.tpl.html new file mode 100755 index 000000000..9de05943f --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/l3-endpoint.tpl.html @@ -0,0 +1,126 @@ +
+ +

L3 Prefix Endpoint

+ +
+ +
+
+ + +
+ + +
+ +
+ + + +
+
+
+ +
+
+ +
+
+ +
+ + + +
+
+
+ +
+
+ +
+
+ +
+ + +
+ +
+ + + +
+
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+ +
+ +
+ + +
+ + +
+
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/crud.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/crud.tpl.html new file mode 100755 index 000000000..974b48329 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/crud.tpl.html @@ -0,0 +1,16 @@ +
+ + +
+ + +
+ +
+ + + +
+
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/param.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/param.tpl.html new file mode 100755 index 000000000..a6862efa9 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/parts/param.tpl.html @@ -0,0 +1,5 @@ +
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/pns.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/pns.tpl.html new file mode 100755 index 000000000..c2d5b4101 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/pns.tpl.html @@ -0,0 +1,37 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + + + +
+ +
+ +
+ + +
+
+ + +
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/prefix.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/prefix.tpl.html new file mode 100755 index 000000000..069a3d308 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/prefix.tpl.html @@ -0,0 +1,21 @@ +
+ +
+ +
+
+ + +
+ + +
+ + +
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/root.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/root.tpl.html new file mode 100755 index 000000000..b07c00c51 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/root.tpl.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/rules.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/rules.tpl.html new file mode 100755 index 000000000..8666faba7 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/rules.tpl.html @@ -0,0 +1,35 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + +
+ + +
+
+ +
+
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/subjects.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/subjects.tpl.html new file mode 100755 index 000000000..4a07e6d34 --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/subjects.tpl.html @@ -0,0 +1,30 @@ +
+ +
+ +
+
+ + +
+ + +
+ +
+ + +
+ + +
+
+ +
+
+
+
\ No newline at end of file diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/tenants.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/tenants.tpl.html new file mode 100755 index 000000000..0529924ac --- /dev/null +++ b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/tenants.tpl.html @@ -0,0 +1,36 @@ +
+ +

Tenants

+ + +
+ +
+
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + + +
\ No newline at end of file diff --git a/groupbasedpolicy-ui/pom.xml b/groupbasedpolicy-ui/pom.xml new file mode 100755 index 000000000..de15e1e17 --- /dev/null +++ b/groupbasedpolicy-ui/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.opendaylight.groupbasedpolicy + commons.groupbasedpolicy + 0.2.0-SNAPSHOT + ../commons/parent + + + groupbasedpolicy-ui + groupbasedpolicy-ui + Resources + pom + + 3.0 + + + module + bundle + + + diff --git a/pom.xml b/pom.xml index c3d75a4ad..65046cd25 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ neutron-mapper-config ui-backend ui-backend-config + groupbasedpolicy-ui distribution-karaf features @@ -54,4 +55,4 @@ HEAD https://wiki.opendaylight.org/view/Group_Policy:Main - \ No newline at end of file + -- 2.36.6