SFC topology 19/40619/6
authorDaniel Malachovsky <dmalacho@cisco.com>
Tue, 21 Jun 2016 13:03:27 +0000 (15:03 +0200)
committerDaniel Malachovsky <dmalacho@cisco.com>
Wed, 6 Jul 2016 09:07:52 +0000 (11:07 +0200)
- shows detail of SFC in NeXt topo

Change-Id: I971b8cde7e19930ba9a2f407213030d5bdf26e18
Signed-off-by: Daniel Malachovsky <dmalacho@cisco.com>
groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/common/gbp.module.js
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/contract-sidepanel.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/resolved-policy.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/resolved-policy/rule-sidepanel.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.controller.js [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.tpl.html [new file with mode: 0644]
groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/sfc.service.js [new file with mode: 0644]

index 17a2725defa9de0e4a6676471e771c9118335c0c..cb04cc439c2a993a5e671af3e0ee9ec800d09b60 100644 (file)
@@ -3,9 +3,11 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
 
     angular.module('app.gbp').controller('RootGbpCtrl', RootGbpCtrl);
 
-    RootGbpCtrl.$inject = ['$state', '$rootScope', '$scope', '$filter', '$mdDialog', 'RootGbpService', 'TenantListService', 'TenantService', 'EpgListService', 'ResolvedPolicyService', 'NextTopologyService', 'EndpointsListService'];
+    RootGbpCtrl.$inject = ['$state', '$rootScope', '$scope', '$filter', '$mdDialog', 'RootGbpService',
+        'TenantListService', 'EpgListService', 'ResolvedPolicyService', 'NextTopologyService', 'EndpointsListService'];
 
-    function RootGbpCtrl($state, $rootScope, $scope, $filter, $mdDialog, RootGbpService, TenantListService, TenantService, EpgListService, ResolvedPolicyService, NextTopologyService, EndpointsListService) {
+    function RootGbpCtrl($state, $rootScope, $scope, $filter, $mdDialog, RootGbpService,
+        TenantListService, EpgListService, ResolvedPolicyService, NextTopologyService, EndpointsListService) {
         /* properties */
         $scope.apiType = 'operational';
         $scope.activeObject = null;
@@ -28,6 +30,7 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
         $scope.fillTopologyData = fillTopologyData;
         $scope.broadcastFromRoot = broadcastFromRoot;
         $scope.closeSidePanel = closeSidePanel;
+        $scope.openSfcDialog = openSfcDialog;
         $scope.openSidePanel = openSidePanel;
         $scope.setRootTenant = setRootTenant;
         $scope.toggleExpanded = toggleExpanded;
@@ -66,7 +69,7 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
         function closeSidePanel() {
             if($scope.sidePanelPage) {
                 $scope.sidePanelPage = false;
-                NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
+                $scope.fadeAll();
             }
         }
 
@@ -116,7 +119,7 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
          *
          */
         function deselectContract() {
-            NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
+            $scope.fadeAll();
             $scope.sidePanelPage = 'resolved-policy/contract-sidepanel';
 
             var obj = Object.keys($scope.resolvedPolicy).map(function(k) {
@@ -135,7 +138,7 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
          *
          */
         function deselectEpg() {
-            NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
+            $scope.fadeAll();
             var elements;
 
             $scope.sidePanelPage = 'resolved-policy/epg-sidepanel';
@@ -160,7 +163,7 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
          *
          */
         function fadeAll() {
-            NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
+            $rootScope.nxTopology && NextTopologyService.fadeInAllLayers($rootScope.nxTopology);
         }
 
         /**
@@ -183,7 +186,10 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
         function fillTopologyData() {
             if($scope.rootTenant) {
                 var topoData = {nodes: [], links: [],},
-                    filteredResolvedPolicies = $filter('filter')(resolvedPolicies.data, {'consumer-tenant-id': $scope.rootTenant, 'provider-tenant-id': $scope.rootTenant});
+                    filteredResolvedPolicies = $filter('filter')(resolvedPolicies.data, {
+                        'consumer-tenant-id': $scope.rootTenant,
+                        'provider-tenant-id': $scope.rootTenant
+                    });
 
 
                 filteredResolvedPolicies && filteredResolvedPolicies.forEach(function(rp) {
@@ -273,6 +279,25 @@ define(['app/gbp/common/gbp.service', 'app/gbp/resolved-policy/resolved-policy.s
             $scope.rootTenants.get('config');
         }
 
+        /**
+         *
+         * @param chainName
+         */
+        function openSfcDialog(chainName) {
+            $mdDialog.show({
+                clickOutsideToClose: true,
+                controller: 'SfcTopologyController',
+                preserveScope: true,
+                templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
+                parent: angular.element(document.body),
+                scope: $scope,
+                locals: {
+                    chainName: chainName,
+                },
+            });
+        }
+
+
         /**
          * Sets '$scope.sidePanelPage' to true. This variable is watched in index.tpl.html template
          * and opens/closes side panel
index 43efa0217156cd484029afc0d374f0145210ed0d..b341b9b67599d8f35d729ba738e9c32327d3199a 100644 (file)
@@ -36,6 +36,7 @@ define([
         NavHelperProvider.addControllerUrl('app/gbp/epg/epg.controller');
         NavHelperProvider.addControllerUrl('app/gbp/policy/policy.controller');
         NavHelperProvider.addControllerUrl('app/gbp/resolved-policy/resolved-policy.controller');
+        NavHelperProvider.addControllerUrl('app/gbp/sfc/dialog-sfc-topology.controller');
         NavHelperProvider.addControllerUrl('app/gbp/tenant/add-tenant.controller');
         NavHelperProvider.addControllerUrl('app/gbp/tenant/tenant.controller');
 
index 8ecd9466e641401fb7770f143da59226428dda9a..bff602dcd432809a095cd1ee4d59e56f67c8cf0a 100644 (file)
@@ -10,7 +10,9 @@
            <md-subheader class="md-primary">Contracts list ({{sidePanelObject.length}})</md-subheader>
            <md-list>
                <ng-repeat ng-repeat="contract in sidePanelObject">
-                       <md-list-item ng-click="openSidePanel('resolved-policy/contract-sidepanel', contract, null)" ng-mouseenter="highlightLink(contract.linkId)" ng-mouseleave="fadeAll()">
+                       <md-list-item ng-click="openSidePanel('resolved-policy/contract-sidepanel', contract, null)"
+                                                         ng-mouseenter="highlightLink(contract.linkId)"
+                                                         ng-mouseleave="fadeAll()">
                                {{contract['contract-id']}}
                        </md-list-item>
                </ng-repeat>
@@ -41,4 +43,4 @@
                </ng-repeat>
            </md-list>
        </div>
-</md-content>
\ No newline at end of file
+</md-content>
index 32aaf877eed29e489f69ff2d43b0c279ee8d73ae..9815e0c6af6515e5ff5b88bbd71a18d4c112ac57 100644 (file)
@@ -3,10 +3,11 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
 
     angular.module('app.gbp').controller('ResolvedPolicyController', ResolvedPolicyController);
 
-    ResolvedPolicyController.$inject = ['$rootScope', '$scope', 'ResolvedPolicyService', 'EpgService', 'EpgListService', 'ContractService', 'NextTopologyService'];
+    ResolvedPolicyController.$inject = ['$rootScope', '$scope', '$mdDialog', 'EpgService', 'NextTopologyService'];
 
     /* @ngInject */
-    function ResolvedPolicyController($rootScope, $scope, ResolvedPolicyService, EpgService, EpgListService, ContractService, NextTopologyService) {
+    function ResolvedPolicyController($rootScope, $scope, $mdDialog, EpgService,  NextTopologyService) {
+
         $scope.reloadTopology = reloadTopology;
 
         $scope.cbkFunctions = {
@@ -34,6 +35,19 @@ define(['app/gbp/resolved-policy/resolved-policy.service'], function () {
             }
         };
 
+        function openSfcDialog(chainName) {
+            $mdDialog.show({
+                clickOutsideToClose: true,
+                controller: 'SfcTopologyController',
+                preserveScope: true,
+                templateUrl: $scope.viewPath + 'sfc/dialog-sfc-topology.tpl.html',
+                parent: angular.element(document.body),
+                scope: $scope,
+                locals: {
+                    chainName: chainName,
+                },
+            });
+        }
 
         function reloadTopology() {
             $scope.fillTopologyData();
index feb0580487e9ac52a08a52dbb960db8a5891338a..93ff7186e2f6f523db200bba294aaecb70703730 100644 (file)
        <md-subheader class="md-primary">
                <div layout="row" class="layout-row">
                        <span>Actions ({{selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action.length}})</span>
-                       <span class="flex" flex></span>
                        <span ng-if="selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action.length">
-                               <md-button class="md-button md-primary md-button md-ink-ripple expand-button" type="button" ng-click="expandAll(selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action)" aria-label="Expand all">
-                           <i class="fa fa-expand ng-scope"></i>
-                               <div class="md-ripple-container"></div>
-                               <md-tooltip md-direction="bottom">
-                                       Expand all
-                               </md-tooltip>
-                       </md-button>
-                       <md-button class="md-button md-primary md-button md-ink-ripple expand-button" type="button" ng-click="collapseAll(selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action)" aria-label="Collapse all">
-                                       <i class="fa fa-compress ng-scope"></i>
-                           <div class="md-ripple-container"></div>
-                               <md-tooltip md-direction="bottom">
-                                       Collapse all
-                               </md-tooltip>
-                       </md-button>
                </span>
        </div>
        </md-subheader>
     <md-list class="expander">
-               <md-list-item ng-click="toggleExpanded(action)" class="md-3-line" layout="row"
+               <md-list-item class="md-3-line" layout="row"
                                          ng-repeat="action in selectedNode.subjects[subjectIndex]['resolved-rule'][0][ruleIndex].action">
                        <div layout-padding flex="10">
                                <h3>{{action.order}}</h3>
@@ -55,7 +40,7 @@
                                <p>Name: {{action.name}} </p>
                        </div>
                        <div ng-if="action['action-definition-id'] === 'Action-Chain'" flex="10">
-                               <md-button class="md-icon-button" ng-click="openSfcDialog({{action.name}})">
+                               <md-button class="md-icon-button" ng-click="openSfcDialog(action.name)">
                                        <md-icon>visibility</md-icon>
                                </md-button>
                        </div>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.controller.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.controller.js
new file mode 100644 (file)
index 0000000..203f4c5
--- /dev/null
@@ -0,0 +1,119 @@
+define([
+    'app/gbp/sfc/sfc.service'
+], function () {
+    'use strict';
+
+    angular.module('app.gbp').controller('SfcTopologyController', SfcTopologyController);
+
+    SfcTopologyController.$inject = ['$filter', '$mdDialog', '$scope', 'chainName', 'SfcService'];
+    /* @ngInject */
+    function SfcTopologyController($filter, $mdDialog, $scope, chainName, SfcService) {
+        /* properties */
+        $scope.chain = SfcService.createObject({name: 'SFCGBP'});
+        $scope.topologyDataSfc = {nodes:[], links:[]};
+        $scope.cbkFunctionsSfc = {
+            clickNode: function(node){
+
+            },
+            clickLink: function(link){
+
+            },
+            topologyGenerated: function(){
+            }
+        };
+
+        /* methods */
+        $scope.closeDialog = closeDialog;
+
+        /* Implementations */
+
+        $scope.chain.get(function() {
+            $scope.chain.data && $scope.chain.data['sfc-service-function'] &&
+                $scope.chain.data['sfc-service-function'].length && $scope.viewTopology();
+
+            $scope.topologyLoaded = true;
+        });
+
+        function closeDialog(){
+            $mdDialog.cancel();
+        }
+
+        function fillTopologyDataSfc() {
+            var topoData = {nodes:[], links:[]};
+            $scope.chain.data['sfc-service-function'].forEach(function(sf) {
+                topoData.nodes.push({id: sf.name, 'node-id': sf.name, label: sf.name, type: sf.name});
+            })
+
+            $scope.topologyDataSfc = topoData;
+        }
+
+        $scope.viewTopology = function() {
+            $scope.topologySfc = new nx.graphic.Topology({
+                height: 400,
+                width: 600,
+                scalable: true,
+                theme:'blue',
+                enableGradualScaling:true,
+                nodeConfig: {
+                    color: '#0386d2',
+                    label: 'model.label',
+                    //scale: 'model.scale',
+                    iconType: function(vertex) {
+                        var type = vertex.get().type;
+                        switch (type) {
+                            case 'service-function-type:firewall':
+                                return 'firewall';
+                            case 'service-function-type:dpi':
+                                return 'accesspoint';
+                            default:
+                                return 'unknown';
+                        }
+                    }
+                },
+                linkConfig: {
+                    label: 'model.label',
+                    linkType: 'parallel',
+                    color: '#0386d2',
+                    width: 5
+                },
+                showIcon: true,
+                //dataProcessor: 'force',
+                //autoLayout: true,
+                enableSmartNode: false,
+                tooltipManagerConfig: {
+                    showNodeTooltip: false,
+                    showLinkTooltip: false
+                }
+            });
+            $scope.app =  new nx.ui.Application;
+
+            var nodes = [];
+            var links = [];
+
+            $scope.chain.data['sfc-service-function'].forEach(function(sf, index) {
+                nodes.push({
+                    id: sf.name,
+                    label: sf.name,
+                    type: sf.type,
+                    x: 100*(index+1),
+                    y: 400
+                });
+
+                index>0 && links.push({
+                    source: index-1,
+                    target: index
+                });
+            })
+
+            $scope.topologySfc.data({
+                nodes: nodes,
+                links: links
+            });
+
+            $scope.app.container(document.getElementById('next-vpp-topo'));
+            $scope.topologySfc.attach($scope.app);
+        };
+
+
+    }
+});
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/dialog-sfc-topology.tpl.html
new file mode 100644 (file)
index 0000000..e2b6458
--- /dev/null
@@ -0,0 +1,16 @@
+<md-dialog ng-cloak aria-label="vpp topo">
+    <md-toolbar>
+        <div class="md-toolbar-tools">
+            <h2 style="color: white">
+                Detail for chain {{chain.data.name}}
+            </h2>
+            <span flex></span>
+            <md-button class="md-icon-button" ng-click="closeDialog()" aria-label="close button">
+                <div>X</div>
+            </md-button>
+        </div>
+    </md-toolbar>
+    <md-dialog-content style="max-width:600px;max-height:400px;overflow:hidden">
+        <div id="next-vpp-topo"></div>
+    </md-dialog-content>
+</md-dialog>
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/sfc.service.js b/groupbasedpolicy-ui/module/src/main/resources/gbp/sfc/sfc.service.js
new file mode 100644 (file)
index 0000000..ff70793
--- /dev/null
@@ -0,0 +1,73 @@
+define([], function () {
+    'use strict';
+
+    angular.module('app.gbp').service('SfcService', SfcService);
+
+    SfcService.$inject = ['Restangular'];
+
+    function SfcService(Restangular) {
+        /* methods */
+        this.createObject = createObject;
+
+        /**
+         * Sfc constructor
+         * @constructor
+         */
+        function Sfc() {
+            /* properties */
+            this.data = {};
+
+            /* methods */
+            this.setData = setData;
+            this.get = get;
+
+            /* Implementation */
+            /**
+             * fills Sfc object with data
+             * @param data
+             */
+
+            function setData(data) {
+                this.data = data;
+            }
+            /**
+             * gets one Sfc object from Restconf
+             * @param id
+             * @returns {*}
+             */
+
+            function get(successCbk) {
+
+                var self = this,
+                    restObj = Restangular
+                        .one('restconf')
+                        .one('config')
+                        .one('service-function-chain:service-function-chains')
+                        .one('service-function-chain')
+                        .one(self.data.name);
+
+                return restObj.get().then(function(data) {
+                    self.data = data['service-function-chain'][0];
+                    (successCbk || angular.noop)();
+                });
+            }
+        }
+
+        /**
+         * creates Endpoint object and fills it with data if available
+         * @param data
+         * @returns {Endpoint}
+         */
+        function createObject(data) {
+            var obj = new Sfc();
+
+            if (data) {
+                obj.setData(data);
+            }
+
+            return obj;
+        }
+    }
+
+    return SfcService;
+});