Index: /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb.controller.js
===================================================================
--- /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb.controller.js	(revision 2467)
+++ /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb.controller.js	(working copy)
@@ -12,7 +12,8 @@
         'dashboardService',
         'localStorageService',
         'roleMgmtService',
-        function ($scope, $rootScope, $state, $stateParams, $location, $uibModal, $filter, monitoringService, monitorResourceService, dashboardService, localStorageService, roleMgmtService) {
+        'storageService',
+        function ($scope, $rootScope, $state, $stateParams, $location, $uibModal, $filter, monitoringService, monitorResourceService, dashboardService, localStorageService, roleMgmtService, storageService) {
             $rootScope.title = 'LLB Statistics';
             $scope.role_info = localStorageService.getWebStorage('role_info');
             var serviceViewModel = this;
@@ -136,6 +137,9 @@
 
             serviceViewModel.concurrentConnections = 0;
             serviceViewModel.totalHits = 0;
+            serviceViewModel.totalSent = 0;
+            serviceViewModel.totalReceived = 0;
+            serviceViewModel.throughput = 0;
 
             serviceViewModel.refresh = function () {
                 serviceViewModel.loading = true;
@@ -180,18 +184,23 @@
                                                     "linkStatus": series.tags.linkStatus,
                                                     "linkThresh": thresholdValue,
                                                     "linkUsage": data[3],
-                                                    "linkBandwidIn": data[4],
-                                                    "linkBandwidOut": data[5],
+                                                    "received": storageService.ValueFormat1024(data[4] == null ? 0 : data[4]) + 'bps',
+                                                    "sent": storageService.ValueFormat1024(data[5] == null ? 0 : data[5]) + 'bps',
                                                     "linkConn": data[6],
                                                     "linkHits": data[7],
                                                 })
                                                 serviceViewModel.concurrentConnections += data[6];
                                                 serviceViewModel.totalHits += data[7];
+                                                serviceViewModel.totalReceived += data[4] == null ? 0 : data[4];
+                                                serviceViewModel.totalSent += data[5] == null ? 0 : data[5];
                                             })
                                         }
                                     })
                                 }
                                 serviceViewModel.llbList = llbList;
+                                serviceViewModel.throughput = storageService.ValueFormat1024(serviceViewModel.totalReceived + serviceViewModel.totalSent) + 'bps';
+                                serviceViewModel.totalReceived = storageService.ValueFormat1024(serviceViewModel.totalReceived) + 'bps';
+                                serviceViewModel.totalSent = storageService.ValueFormat1024(serviceViewModel.totalSent) + 'bps';
                             }
                         });
                     } else {
@@ -214,3 +223,4 @@
     ])
 
 
+
Index: /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb.html
===================================================================
--- /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb.html	(revision 2467)
+++ /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb.html	(working copy)
@@ -2,30 +2,51 @@
     <div class="col-md-12">
         <div class="widget box-shadow" style="padding: 5px 0">
             <div class="boxshadow-body">
-                <div class="col-md-6">
+                <div class="col-md-4">
+                    <div class="col-md-7">
+                        <div style="float: left;">
+                            <h6><span class="demonstration"> {{'Throughput'|T}}</span></h6>
+                            <h4><span class="title-nub" style="cursor: pointer;">{{monitorLLB.throughput}}</span>
+                            <span style="font-size: small;">
+                                <i class="fa fa-arrow-down fa-1" style="color: rgb(54, 205, 64);"></i>
+                                <span class="title-nub" style="cursor: pointer;">{{monitorLLB.totalReceived}}</span>
+                                &nbsp;&nbsp;
+                                <i class="fa fa-arrow-up fa-1" style="color: rgb(64, 158, 255);"></i>
+                                <span class="title-nub" style="cursor: pointer;">{{monitorLLB.totalSent}}</span>
+                            </span>
+                            </h4>
+                        </div>
+                    </div>
                     <div class="col-md-5">
                         <div class="info-icon">
-                            <img src="./app//images/icon-e.png" width="50px">
+                            <img src="./app//images/icon-c.png" width="65px">
                         </div>
                     </div>
+                </div>
+                <div class="col-md-4">
                     <div class="col-md-7">
                         <div style="float: left;">
                             <h6><span class="demonstration"> {{'Concurrent Connections'|T}}</span></h6>
-                            <h6><span class="title-nub"
-                                      style="cursor: pointer;">{{monitorLLB.concurrentConnections}}</span></h6>
+                            <h4><span class="title-nub"
+                                      style="cursor: pointer;">{{monitorLLB.concurrentConnections}}</span></h4>
                         </div>
                     </div>
-                </div>
-                <div class="col-md-6">
                     <div class="col-md-5">
                         <div class="info-icon">
-                            <img src="./app//images/icon-f.png" width="100px">
+                            <img src="./app//images/icon-e.png" width="50px">
                         </div>
                     </div>
+                </div>
+                <div class="col-md-4">
                     <div class="col-md-7">
                         <div>
                             <h6><span class="demonstration">{{'Total Hits'|T}}</span></h6>
-                            <h6><span class="title-nub" style="cursor: pointer;">{{monitorLLB.totalHits}}</span></h6>
+                            <h4><span class="title-nub" style="cursor: pointer;">{{monitorLLB.totalHits}}</span></h4>
+                        </div>
+                    </div>
+                    <div class="col-md-5">
+                        <div class="info-icon">
+                            <img src="./app//images/icon-f.png" width="85px">
                         </div>
                     </div>
                 </div>
@@ -54,6 +75,7 @@
                             <th>{{ 'Device IP' | T }}</th>
                             <th>{{ 'Status' | T }}</th>
                             <th>{{ 'Bandwidth Usage' | T }}</th>
+                            <th>{{ 'Throughput' | T }}</th>
                             <th>{{ 'Connections & Hits' | T }}</th>
                         </tr>
                         <tr>
@@ -80,23 +102,28 @@
                             </th>
                             <th></th>
                             <th></th>
+                            <th></th>
                         </tr>
                         </thead>
                         <tbody ng-hide="monitorLLB.loading">
                         <tr ng-repeat="item in displayedCollection">
                             <td class="d-num">{{ ((currentPageIndex - 1) * pageSize) + $index + 1 }}</td>
-                            <td style="cursor: pointer;"><a class="name">{{ item.linkName }}</a></td>
+                            <td style="cursor: pointer;"><a ui-sref="index.monitoring.resource.llb.detail({linkName: item.linkName, deviceIp: item.deviceIp, origin_type: 'llb'})" class="name">{{ item.linkName }}</a></td>
                             <td>{{ item.linkGateway }}</td>
                             <td>{{ item.deviceIp }}</td>
                             <td>{{ item.linkStatus }}</td>
                             <td>Threshold: <span style="color: rgb(64, 158, 255);">{{item.linkThresh}}</span><br> Usage:
                                 <span style="color: rgb(64, 158, 255);">{{ item.linkUsage }} %</span></td>
+                            <td><i class="fa fa-arrow-down fa-1" style="color: rgb(54, 205, 64);"></i>
+                                {{item.received}}<br>
+                                <i class="fa fa-arrow-up fa-1" style="color: rgb(64, 158, 255);"></i>
+                                {{ item.sent }}</td>
                             <td>Connections: <span style="color: rgb(64, 158, 255);">{{ item.linkConn }}</span><br>Hits:
                                 <span style="color: rgb(64, 158, 255);">{{ item.linkHits }}</span></td>
                         </tr>
                         <tr ng-if="displayedCollection.length == 0">
-                            <td style="height: 48px;" colspan="{{monitorLLB.gridColSpan}}" class="text-center">{{ 'You
-                                do not have any LLB information.' | T }}
+                            <td style="height: 48px;" colspan="{{monitorLLB.gridColSpan}}"
+                                class="text-center">{{ 'You do not have any LLB information.' | T }}
                             </td>
                         </tr>
                         </tbody>
Index: /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb_details.controller.js
===================================================================
--- /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb_details.controller.js	(revision 0)
+++ /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb_details.controller.js	(working copy)
@@ -0,0 +1,316 @@
+angular.module('cm.resource')
+    .controller('monitorLLBDetailController', [
+        '$scope',
+        '$rootScope',
+        '$state',
+        '$stateParams',
+        '$filter',
+        '$location',
+        '$uibModal',
+        'dashboardService',
+        'monitorResourceService',
+        'reportingService',
+        '$document',
+        'storageService',
+        '$aside',
+        'timeService',
+        '$interval',
+        function ($scope, $rootScope, $state, $stateParams, $filter, $location, $uibModal, dashboardService, monitorResourceService, reportingService, $document, storageService, $aside, timeService, $interval) {
+            $scope.allow_config = true;
+            $scope.current_service_name = $stateParams.linkName;
+            $state.current.ncyBreadcrumb.label = $stateParams.linkName;
+
+            let modalViewModel = this;
+            modalViewModel.tab = "Basic Monitoring";
+            modalViewModel.tabs = [
+                {name: "Basic Monitoring"},
+            ]
+
+            modalViewModel.selTab = function (name) {
+                return name === modalViewModel.tab
+            }
+
+            let lastTab = "";
+            $scope.changeTab = function (name) {
+                if (lastTab !== name) {
+                    modalViewModel.tab = name;
+                    modalViewModel.refresh();
+                    lastTab = name
+                }
+            }
+
+            modalViewModel.llbStatistics = {};
+
+            let textLabelFormatter = function (len) {
+                return function (value) {
+                    return value.length > len ? value.substr(0, len - 3) + '...' : value
+                }
+            }
+
+            modalViewModel.time = {
+                from: 'now-15m',
+                to: 'now',
+                flush: '10s'
+            }
+
+            let throughputElement = document.getElementById('llbThroughput')
+            let usageElement = document.getElementById('llbBandwidthUsage')
+            let connectionsElement = document.getElementById('llbConnections')
+            let hitsElement = document.getElementById('llbHits')
+
+            let theme = "dark";
+            if (window.localStorage.theme && (window.localStorage.theme !== "dark")) {
+                theme = "default";
+            }
+
+            let throughputChart = echarts.init(throughputElement, theme, {
+                renderer: 'canvas',
+                useDirtyRect: false
+            });
+            let usageChart = echarts.init(usageElement, theme, {
+                renderer: 'canvas',
+                useDirtyRect: false
+            });
+            let connectionsChart = echarts.init(connectionsElement, theme, {
+                renderer: 'canvas',
+                useDirtyRect: false
+            });
+            let hitsChart = echarts.init(hitsElement, theme, {
+                renderer: 'canvas',
+                useDirtyRect: false
+            });
+
+            let throughputChartOptions = {
+                title: { text: " " },
+                tooltip: {
+                    "trigger": "axis",
+                    "formatter": function (params) {
+                        let tipText = "";
+                        for (let x = 0; x < params.length; x++) {
+                            if (x === 0) {
+                                tipText += params[x].axisValueLabel;
+                            }
+                            let value = params[x].value[1];
+                            if (value != null) {
+                                value = storageService.ValueFormat1024(value) + "bps";
+                            }
+                            tipText += "<br />" + params[x].marker + params[x].seriesName + '<span style="float:right;margin-left:20px;color:#666;font-weight:900">' + value + '</span>';
+                        }
+                        return tipText;
+                    }
+                },
+                legend: { "formatter": textLabelFormatter(15) },
+                grid: { "left": "6%", "top": "50px", "bottom": "5%", "containLabel": true },
+                xAxis: [{ "name": 'Time', "type": "time", "axisLabel": {}, "splitNumber": 5, "minInterval": 60000, "splitLine": { "show": false } }],
+                yAxis: [{ "name": 'Throughput', "nameTextStyle": { "padding": [0, 0, 0, 30] }, "axisLabel": {}}],
+                dataZoom: { type: 'inside' },
+                backgroundColor: this.backgroundColor,
+                series: [
+                    {
+                        name: 'Inbound',
+                        unit: 'bps',
+                        data: [],
+                        type: 'line',
+                        smooth: true
+                    },
+                    {
+                        name: 'Outbound',
+                        unit: 'bps',
+                        data: [],
+                        type: 'line',
+                        smooth: true
+                    }
+                ]
+            };
+            let usageChartOptions = {
+                title: { text: " " },
+                tooltip: {
+                    "trigger": "axis",
+                    "formatter": function (params) {
+                        let tipText = "";
+                        for (let x = 0; x < params.length; x++) {
+                            if (x === 0) { tipText += params[x].axisValueLabel; }
+                            let value = params[x].value[1];
+                            if (value != null) {
+                                value += "%";
+                            }
+                            tipText += "<br />" + params[x].marker + params[x].seriesName + '<span style="float:right;margin-left:20px;color:#666;font-weight:900">' + value + '</span>';
+                        }
+                        return tipText;
+                    }
+                },
+                legend: { "formatter": textLabelFormatter(15) },
+                grid: { "left": "6%", "top": "50px", "bottom": "5%", "containLabel": true },
+                xAxis: [{ "name": 'Time', "type": "time", "axisLabel": {}, "splitNumber": 5, "minInterval": 60000, "splitLine": { "show": false } }],
+                yAxis: [{ "name": 'Usage', "nameTextStyle": { "padding": [0, 0, 0, 30] }, "axisLabel": {}, "splitLine": { "show": false, } }],
+                dataZoom: { type: 'inside' },
+                backgroundColor: this.backgroundColor,
+                series: [
+                    {
+                        name: 'Bandwidth Usage:',
+                        data: [],
+                        type: 'line',
+                        smooth: true,
+                    }
+                ]
+            };
+            let connectionsChartOptions = {
+                title: { text: " " },
+                tooltip: { "trigger": "axis" },
+                legend: { "formatter": textLabelFormatter(15) },
+                grid: { "left": "6%", "top": "50px", "bottom": "5%", "containLabel": true },
+                xAxis: [{ "name": 'Time', "type": "time", "axisLabel": {}, "splitNumber": 5, "minInterval": 60000, "splitLine": { "show": false } }],
+                yAxis: [{ "name": 'Connections', "nameTextStyle": { "padding": [0, 0, 0, 30] }, "axisLabel": {}, "splitLine": { "show": false, } }],
+                dataZoom: { type: 'inside' },
+                backgroundColor: this.backgroundColor,
+                series: [
+                    {
+                        name: 'Concurrent Connections',
+                        data: [],
+                        type: 'line',
+                        smooth: true
+                    }
+                ]
+            };
+            let hitsChartOptions = {
+                title: { text: " " },
+                tooltip: { "trigger": "axis" },
+                legend: { "formatter": textLabelFormatter(15) },
+                grid: { "left": "6%", "top": "50px", "bottom": "5%", "containLabel": true },
+                xAxis: [{ "name": 'Time', "type": "time", "axisLabel": {}, "splitNumber": 5, "minInterval": 60000, "splitLine": { "show": false } }],
+                yAxis: [{ "name": 'Total Hits', "nameTextStyle": { "padding": [0, 0, 0, 30] }, "axisLabel": {}, "splitLine": { "show": false, } }],
+                dataZoom: { type: 'inside' },
+                backgroundColor: this.backgroundColor,
+                series: [
+                    {
+                        name: 'Total Hits',
+                        data: [],
+                        type: 'line',
+                        smooth: true
+                    }
+                ]
+            };
+
+            modalViewModel.interval = '';
+
+            modalViewModel.refresh = function () {
+                clearInterval(modalViewModel.interval);
+
+                if (modalViewModel.tab === "Basic Monitoring") {
+                    getLLBMonitoringStatistics();
+                    if (modalViewModel.time.flush !== 'off') {
+                        modalViewModel.interval = setInterval(getLLBMonitoringStatistics, parseInt(modalViewModel.time.flush) * 1000);
+                    }
+                }
+            }
+
+            $scope.showProgressBar = function () {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+
+            modalViewModel.refresh();
+
+            modalViewModel.changeTimeSelection = function () {
+                let asideInstance = $aside.open({
+                    templateUrl: 'app/modules/common/templates/time_selector.html',
+                    controller: 'timeSelectorCtrl',
+                    controllerAs: 'timeSelector',
+                    placement: 'right',
+                    size: 'md',
+                    resolve: {
+                        modalData: {
+                            time: {
+                                "from": "now-15m",
+                                "to": "now",
+                                "flush": "10s"
+                            }
+                        }
+                    }
+                });
+                asideInstance.result.then(function (result) {
+                    document.getElementById('timeSelectorTitle').textContent = getTimeTitle(result);
+                    modalViewModel.time.from = result.from;
+                    modalViewModel.time.to = result.to;
+                    modalViewModel.time.flush = result.flush;
+                    modalViewModel.refresh();
+                });
+            }
+
+            function getTimeTitle(time) {
+                let title = '';
+                if (time.to === 'now') {
+                    if (time.from.indexOf("now") !== -1) {
+                        title = timeService.formatTimeCondition(time.from)
+                    } else {
+                        title = $filter('T')('{0} to now', [timeService.formatTimeCondition(time.from)]);
+                    }
+                } else {
+                    title = $filter('T')('{0} to {1}', [timeService.formatTimeCondition(time.from), timeService.formatTimeCondition(time.to)]);
+                }
+                if (time.flush && time.flush !== 'off') {
+                    title += $filter('T')(', Refresh every {0}', [timeService.formatDuration(time.flush)]);
+                }
+                return title;
+            }
+
+            function getLLBMonitoringStatistics() {
+                throughputChartOptions.series[0].data = [];
+                throughputChartOptions.series[1].data = [];
+                usageChartOptions.series[0].data = [];
+                connectionsChartOptions.series[0].data = [];
+                hitsChartOptions.series[0].data = [];
+
+                monitorResourceService.getLLBMonitoringStatistics({
+                    link_name: $stateParams.linkName,
+                    from: modalViewModel.time.from,
+                    to: modalViewModel.time.to,
+                }).then(function (res) {
+                    if (res && res.status === 200) {
+                        modalViewModel.llbStatistics = res.data.results[0].series[0];
+                        modalViewModel.llbStatistics = modalViewModel.llbStatistics['values'];
+                    }
+                    modalViewModel.llbStatistics.forEach(function (stats) {
+                        throughputChartOptions.series[0].data.push([stats[0], stats[1]]);
+                        throughputChartOptions.series[1].data.push([stats[0], stats[2]]);
+                        usageChartOptions.series[0].data.push([stats[0], stats[3]]);
+                        connectionsChartOptions.series[0].data.push([stats[0], stats[4]]);
+                        hitsChartOptions.series[0].data.push([stats[0], stats[5]]);
+                    });
+                    if (throughputChartOptions && typeof throughputChartOptions === 'object') {
+                        throughputChart.setOption(throughputChartOptions);
+                    }
+                    if (usageChartOptions && typeof usageChartOptions === 'object') {
+                        usageChart.setOption(usageChartOptions);
+                    }
+                    if (connectionsChartOptions && typeof connectionsChartOptions === 'object') {
+                        connectionsChart.setOption(connectionsChartOptions);
+                    }
+                    if (hitsChartOptions && typeof hitsChartOptions === 'object') {
+                        hitsChart.setOption(hitsChartOptions);
+                    }
+
+                    document.getElementById('timeSelectorTitle').textContent = getTimeTitle(modalViewModel.time);
+
+                    window.addEventListener('resize', throughputChart.resize);
+                    window.addEventListener('resize', usageChart.resize);
+                    window.addEventListener('resize', connectionsChart.resize);
+                    window.addEventListener('resize', hitsChart.resize);
+                })
+            }
+
+            $scope.stop = function() {
+                clearInterval(modalViewModel.interval);
+            };
+
+            $scope.$on('$destroy', function() {
+                $scope.stop();
+            });
+
+        }
+    ])
+
Index: /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb_details.html
===================================================================
--- /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb_details.html	(revision 0)
+++ /branches/amp_3_7/extensions/monitoring/webui/resource/llb/llb_details.html	(working copy)
@@ -0,0 +1,66 @@
+<div ncy-breadcrumb></div>
+<div class="ag-session-list">
+    <div class="row ng-scope">
+        <div class="col-md-12">
+            <div class="pull-left">
+                <div class="btn btn-default" ng-click="monitorLLBDetail.refresh()"><span class="fa fa-refresh"></span>
+                </div>
+            </div>
+            <div class="pull-right">
+                <li style="line-height: 35px; font-size: 14px; list-style: none;">
+                    <a id="timeSelector" ng-click="monitorLLBDetail.changeTimeSelection()" style="float: left; cursor: pointer">
+                    <button class="btn btn-link"><i class="fa fa-clock-o" style="font-size: 15px;"></i></button>
+                    <span id="timeSelectorTitle">{{"Time selection" | T}}</span>
+                    </a>
+                </li>
+            </div>
+        </div>
+        <div class="col-md-12">
+            <div class="tab-wrapper">
+                <ul class="nav nav-tabs">
+                    <li ng-repeat="tab in monitorLLBDetail.tabs"
+                        ng-class="{'active': monitorLLBDetail.selTab(tab.name)}" ng-click="changeTab(tab.name)"
+                        class="ng-scope"><a>{{tab.name | T}}</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="col-md-12" ng-show="monitorLLBDetail.tab == 'Basic Monitoring'">
+            <div class="row ng-scope">
+                <div class="col-sm-6 graph graph-hover">
+                    <div class="graph-title">
+                        <i class="fa fa-"></i>
+                        <span title="{{ 'Throughput' |T}}">{{'Throughput' | T}}</span>
+                    </div>
+                    <div id="llbThroughput" class="graph-container"></div>
+                </div>
+                <div class="col-sm-6 graph graph-hover">
+                    <div class="graph-title">
+                        <i class="fa fa-"></i>
+                        <span title="{{ 'Bandwidth Usage' |T}}">{{'Bandwidth Usage' | T}}</span>
+                    </div>
+                    <div id="llbBandwidthUsage" class="graph-container"></div>
+                </div>
+                <div class="col-sm-6 graph graph-hover">
+                    <div class="graph-title">
+                        <i class="fa fa-"></i>
+                        <span title="{{ 'Concurrent Connections' |T}}">{{'Connections' | T}}</span>
+                    </div>
+                    <div id="llbConnections" class="graph-container"></div>
+                </div>
+                <div class="col-sm-6 graph graph-hover">
+                    <div class="graph-title">
+                        <i class="fa fa-"></i>
+                        <span title="{{ 'Hits Number' |T}}">{{'Hits Number' | T}}</span>
+                    </div>
+                    <div id="llbHits" class="graph-container"></div>
+                </div>
+            </div>
+        </div>
+        <div class="col-md-12" ng-if="monitorLLBDetail.tab == 'Audit Monitoring'">
+            <div class="row ng-scope">
+                By installing the plugins, you can check these monitoring charts.
+            </div>
+        </div>
+    </div>
+</div>
+
Index: /branches/amp_3_7/extensions/monitoring/webui/resource/resource.module.js
===================================================================
--- /branches/amp_3_7/extensions/monitoring/webui/resource/resource.module.js	(revision 2467)
+++ /branches/amp_3_7/extensions/monitoring/webui/resource/resource.module.js	(working copy)
@@ -161,7 +161,22 @@
                     label: '{{ "LLB Statistics" | T }}'
                 }
             })
+            .state('index.monitoring.resource.llb.detail', {
+                url: '^/monitoring/resource/llb/{deviceIp}/{linkName}',
+                views: {
+                    'main@index': {
+                        templateUrl: 'app/modules/extensions/monitoring/resource/llb/llb_details.html',
+                        controller: 'monitorLLBDetailController',
+                        controllerAs: 'monitorLLBDetail'
+                    }
+                },
+                ncyBreadcrumb: {
+                    parent: 'index.monitoring.resource.llb',
+                    label: '{{linkName}}'
+                }
+            });
     }]);
 
 angular.module("cmApp").requires.push('cm.resource');
 
+
Index: /branches/amp_3_7/extensions/monitoring/webui/resource/resource.service.js
===================================================================
--- /branches/amp_3_7/extensions/monitoring/webui/resource/resource.service.js	(revision 2467)
+++ /branches/amp_3_7/extensions/monitoring/webui/resource/resource.service.js	(working copy)
@@ -18,6 +18,7 @@
                 getServiceUrlConfig: getServiceUrlConfig,
                 addServiceUrlConfig: addServiceUrlConfig,
                 delServiceUrlConfig: delServiceUrlConfig,
+                getLLBMonitoringStatistics: getLLBMonitoringStatistics
             };
 
             function compareVersion(version1, version2) {
@@ -2173,5 +2174,18 @@
                 };
                 return apiService.post(url, post_data);
             };
+
+            function getLLBMonitoringStatistics(payload) {
+                let url = '/llb/graph_data';
+                let post_data = {
+                    query: {
+                        "from_time": payload.from,
+                        "to_time": payload.to,
+                        "link_name": payload.link_name
+                    }
+                };
+                return apiService.post2(url, JSON.stringify(post_data), { headers: { 'Content-Type': 'application/json' } });
+            }
         }
     ]);
+
Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/images/icon-c.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/png
Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/images/icon-c.png
===================================================================
--- /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/images/icon-c.png	(revision 2467)
+++ /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/images/icon-c.png	(working copy)

Property changes on: src/webui/webui/htdocs/new/src/client/app/images/icon-c.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/png
\ No newline at end of property
Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/modules/dashboard/overview/overview.controller.js
===================================================================
--- /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/modules/dashboard/overview/overview.controller.js	(revision 2467)
+++ /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/modules/dashboard/overview/overview.controller.js	(working copy)
@@ -1,4 +1,4 @@
-angular
+ngular
     .module('cm.dashboard')
     .controller('monitorOverviewCtrl', [
         '$scope',
@@ -256,7 +256,7 @@
             overviewModel.llbLists = {
                 hitsList: [],
                 connectionsList: [],
-                LLBThroughputList: []
+                throughputList: []
             }
 
             let getLLBMonitoringData = function () {
@@ -270,7 +270,7 @@
                 dashboardService.getLLBMonitoringStatistics(payload).then(function (res) {
                     overviewModel.llbLoading = false;
                     if (res && res.status === 200) {
-                        var hitsList = []
+                        let hitsList = []
                         if (res.data.results[0].series) {
                             _.each(res.data.results[0].series[0].values, function (value) {
                                 hitsList.push({
@@ -282,7 +282,7 @@
                         }
                         overviewModel.llbLists.hitsList = hitsList;
 
-                        var connectionsList = []
+                        let connectionsList = [];
                         if (res.data.results[1].series) {
                             _.each(res.data.results[1].series[0].values, function (value) {
                                 connectionsList.push({
@@ -292,7 +292,19 @@
                                 })
                             })
                         }
-                        overviewModel.llbLists.connectionsList = connectionsList
+                        overviewModel.llbLists.connectionsList = connectionsList;
+                        let throughputList = [];
+                        if (res.data.results[1].series) {
+                            _.each(res.data.results[2].series[0].values, function (value) {
+                                throughputList.push({
+                                    'received': storageService.ValueFormat1024(value[2]) + 'bps',
+                                    'sent': storageService.ValueFormat1024(value[3]) + 'bps',
+                                    'name': value[4],
+                                    'device_ip': value[5],
+                                })
+                            })
+                        }
+                        overviewModel.llbLists.throughputList = throughputList
                     }
                 });
             }
@@ -908,3 +920,4 @@
 
     }])
 
+
Index: /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/modules/dashboard/overview/overview.html
===================================================================
--- /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/modules/dashboard/overview/overview.html	(revision 2467)
+++ /branches/amp_3_7/src/webui/webui/htdocs/new/src/client/app/modules/dashboard/overview/overview.html	(working copy)
@@ -457,7 +457,7 @@
         </div>
     </div>
     <div ng-if="monitorOverview.tab == 'llb'">
-        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
+        <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12">
             <div class="widget">
                 <div class="widget-header">
                     <i class="fa fa-signal fa-fw" aria-hidden="true"></i>&nbsp;{{'Hits Number'|T}} <span class="pull-right">{{'Top 5' | T}}</span>
@@ -485,7 +485,7 @@
                 </div>
             </div>
         </div>
-        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
+        <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12">
             <div class="widget">
                 <div class="widget-header">
                     <i class="fa fa-signal fa-fw" aria-hidden="true"></i>&nbsp;{{'Open Connections'|T}} <span class="pull-right">{{'Top 5' | T}}</span>
@@ -513,6 +513,36 @@
                 </div>
             </div>
         </div>
+        <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12">
+            <div class="widget">
+                <div class="widget-header">
+                    <i class="fa fa-signal fa-fw" aria-hidden="true"></i>&nbsp;{{'Network Throughput'|T}} <span class="pull-right">{{'Top 5' | T}}</span>
+                </div>
+                <div class="table-responsive">
+                    <table class="table table-striped table-hover">
+                        <thead>
+                        <tr>
+                            <th class="num">No.</th>
+                            <th class="name">{{'Link Name' | T}}</th>
+                            <th>{{'Sent' | T}}</th>
+                            <th>{{'Received' | T}}</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr ng-show="monitorOverview.llbLoading">
+                            <td colspan="3" class="text-center"><img src="app/images/loading-h2.gif"></td>
+                        </tr>
+                        <tr ng-repeat="item in monitorOverview.llbLists.throughputList">
+                            <td class="num">{{$index + 1}}</td>
+                            <td style="cursor: pointer;" ui-sref="index.monitoring.resource.llb"><a class="name">{{ item.name }}</a></td>
+                            <td><span class="label label-default">{{item.sent}}</span></td>
+                            <td><span class="label label-default">{{item.received}}</span></td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
     </div>
 </div>
 
@@ -600,3 +630,4 @@
     }
 </style>
 
+
