mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	- Implement Search boxes in all Metrics views - Fix threshold calculations for host and storage pool metrics view - Consider overcommit ratios for calculation allocated thresholds - Save/pass context while navigating across resources and metrics view Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
		
			
				
	
	
		
			210 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Licensed to the Apache Software Foundation (ASF) under one
 | |
| // or more contributor license agreements.  See the NOTICE file
 | |
| // distributed with this work for additional information
 | |
| // regarding copyright ownership.  The ASF licenses this file
 | |
| // to you under the Apache License, Version 2.0 (the
 | |
| // "License"); you may not use this file except in compliance
 | |
| // with the License.  You may obtain a copy of the License at
 | |
| //
 | |
| //   http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing,
 | |
| // software distributed under the License is distributed on an
 | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 | |
| // KIND, either express or implied.  See the License for the
 | |
| // specific language governing permissions and limitations
 | |
| // under the License.
 | |
| (function($, cloudStack) {
 | |
| 
 | |
|     cloudStack.uiCustom.metricsView = function(args) {
 | |
|         return function(ctxArgs) {
 | |
| 
 | |
|             var metricsListView = cloudStack.sections.metrics.listView;
 | |
|             var metricsLabel = _l('label.metrics');
 | |
|             var context = {};
 | |
|             if (ctxArgs && ctxArgs.hasOwnProperty('context')) {
 | |
|                 context = ctxArgs.context;
 | |
|             }
 | |
| 
 | |
|             if (args.resource == 'zones') {
 | |
|                 metricsLabel = _l('label.zones') + ' ' + metricsLabel;
 | |
|                 metricsListView = cloudStack.sections.metrics.zones.listView;
 | |
| 
 | |
|             } else if (args.resource == 'clusters') {
 | |
|                 metricsLabel = _l('label.clusters') + ' ' + metricsLabel;
 | |
|                 metricsListView = cloudStack.sections.metrics.clusters.listView;
 | |
| 
 | |
|             } else if (args.resource == 'hosts') {
 | |
|                 metricsLabel = _l('label.hosts') + ' ' + metricsLabel;
 | |
|                 metricsListView = cloudStack.sections.metrics.hosts.listView;
 | |
| 
 | |
|                 if (context && !context.filterBy) {
 | |
|                     if (context.hasOwnProperty('clusters') && context.clusters[0]) {
 | |
|                         context.filterBy = 'clusterid';
 | |
|                         context.id = context.clusters[0].id;
 | |
|                     }
 | |
|                     if (context.hasOwnProperty('instances') && context.instances[0]) {
 | |
|                         context.filterBy = 'virtualmachineid';
 | |
|                         context.id = context.instances[0].id;
 | |
|                     }
 | |
|                 }
 | |
|             } else if (args.resource == 'storagepool') {
 | |
|                 metricsLabel = _l('label.primary.storage') + ' ' + metricsLabel;
 | |
|                 metricsListView = cloudStack.sections.metrics.storagepool.listView;
 | |
| 
 | |
|             } else if (args.resource == 'vms') {
 | |
|                 metricsLabel = _l('label.instances') + ' ' + metricsLabel;
 | |
|                 metricsListView = cloudStack.sections.metrics.instances.listView;
 | |
|                 metricsListView.advSearchFields = cloudStack.sections.instances.listView.advSearchFields;
 | |
| 
 | |
|                 if (context && !context.filterBy) {
 | |
|                     if (context.hasOwnProperty('hosts') && context.hosts[0]) {
 | |
|                         context.filterBy = 'hostid';
 | |
|                         context.id = context.hosts[0].id;
 | |
|                     }
 | |
|                 }
 | |
|             } else if (args.resource == 'volumes') {
 | |
|                 metricsLabel = _l('label.volumes') + ' ' + metricsLabel;
 | |
|                 metricsListView = cloudStack.sections.metrics.volumes.listView;
 | |
|                 metricsListView.advSearchFields = cloudStack.sections.storage.sections.volumes.listView.advSearchFields;
 | |
|                 metricsListView.groupableColumns = false;
 | |
| 
 | |
|                 if (context && !context.filterBy) {
 | |
|                     if (context.hasOwnProperty('instances') && context.instances[0]) {
 | |
|                         context.filterBy = 'virtualmachineid';
 | |
|                         context.id = context.instances[0].id;
 | |
|                     }
 | |
|                     if (context.hasOwnProperty('primarystorages') && context.primarystorages[0]) {
 | |
|                         context.filterBy = 'storageid';
 | |
|                         context.id = context.primarystorages[0].id;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (context.metricsFilterData) {
 | |
|                 delete context.metricsFilterData;
 | |
|             }
 | |
| 
 | |
|             if (context.filterBy) {
 | |
|                 context.metricsFilterData = {
 | |
|                     key: context.filterBy,
 | |
|                     value: context.id
 | |
|                 };
 | |
|             }
 | |
| 
 | |
|             // list view refresh button
 | |
|             metricsListView.actions = {
 | |
|                 refreshMetrics: {
 | |
|                     label: 'label.refresh',
 | |
|                     isHeader: true,
 | |
|                     addRow: true,
 | |
|                     action: {
 | |
|                         custom: function (args) {
 | |
|                             return function() {
 | |
|                             };
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             metricsListView.hideSearchBar = false;
 | |
|             metricsListView.needsRefresh = true;
 | |
|             metricsListView.noSplit = true;
 | |
|             metricsListView.horizontalOverflow = true;
 | |
|             metricsListView.groupableColumns = true;
 | |
| 
 | |
|             if (args.resource != 'vms' && args.resource != 'volumes' && args.resource != 'zones') {
 | |
|                 metricsListView.advSearchFields = {
 | |
|                     name: {
 | |
|                         label: 'label.name'
 | |
|                     },
 | |
|                     zoneid: {
 | |
|                         label: 'label.zone',
 | |
|                         select: function(args) {
 | |
|                             $.ajax({
 | |
|                                 url: createURL('listZones'),
 | |
|                                 data: {
 | |
|                                     listAll: true
 | |
|                                 },
 | |
|                                 success: function(json) {
 | |
|                                     var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : [];
 | |
| 
 | |
|                                     args.response.success({
 | |
|                                         data: $.map(zones, function(zone) {
 | |
|                                             return {
 | |
|                                                 id: zone.id,
 | |
|                                                 description: zone.name
 | |
|                                             };
 | |
|                                         })
 | |
|                                     });
 | |
|                                 }
 | |
|                             });
 | |
|                         }
 | |
|                     }
 | |
|                 };
 | |
|             }
 | |
| 
 | |
|             var $browser = $('#browser .container');
 | |
|             return $browser.cloudBrowser('addPanel', {
 | |
|                   title: metricsLabel,
 | |
|                   maximizeIfSelected: true,
 | |
|                   complete: function($newPanel) {
 | |
|                       $newPanel.listView({
 | |
|                           $browser: $browser,
 | |
|                           context: context,
 | |
|                           listView: metricsListView
 | |
|                       });
 | |
|                       // Make metrics tables horizontally scrollable
 | |
|                       $newPanel.find('.list-view').css({'overflow-x': 'visible'});
 | |
|                       // Refresh metrics when refresh button is clicked
 | |
|                       $newPanel.find('.refreshMetrics').click(function() {
 | |
|                           var sortedTh = $newPanel.find('table thead tr:last th.sorted');
 | |
|                           var thIndex = sortedTh.index();
 | |
|                           var thClassName = null;
 | |
|                           var wasSorted = false;
 | |
|                           var sortClassName = 'asc';
 | |
|                           if (sortedTh && sortedTh.hasClass('sorted')) {
 | |
|                               wasSorted = true;
 | |
|                               var classes = sortedTh.attr('class').split(/\s+/);
 | |
|                               thClassName = classes[0];
 | |
|                               if (classes.indexOf('desc') > -1) {
 | |
|                                   sortClassName = 'desc';
 | |
|                               }
 | |
|                           }
 | |
|                           $browser.cloudBrowser('removeLastPanel', {});
 | |
|                           var refreshedPanel = cloudStack.uiCustom.metricsView(args)(ctxArgs);
 | |
|                           if (wasSorted && thClassName) {
 | |
|                               refreshedPanel.find('th.' + thClassName).filter(function() {
 | |
|                                   return $(this).index() == thIndex;
 | |
|                               }).addClass('sorted').addClass(sortClassName);
 | |
|                           }
 | |
|                       });
 | |
| 
 | |
|                       var browseBy = metricsListView.browseBy;
 | |
|                       if (browseBy) {
 | |
|                           $newPanel.bind('click', function(event) {
 | |
|                               event.stopPropagation();
 | |
|                               var $target = $(event.target);
 | |
|                               var id = $target.closest('tr').data('list-view-item-id');
 | |
|                               var jsonObj = $target.closest('tr').data('jsonObj');
 | |
|                               if (browseBy.filterKey && jsonObj) {
 | |
|                                   if (jsonObj.hasOwnProperty(browseBy.filterKey)) {
 | |
|                                       id = jsonObj[browseBy.filterKey];
 | |
|                                   } else {
 | |
|                                       return; // return if provided key is missing
 | |
|                                   }
 | |
|                               }
 | |
|                               if (id && ($target.hasClass('first') || $target.parent().hasClass('first')) && ($target.is('td') || $target.parent().is('td'))) {
 | |
|                                   context.id = id;
 | |
|                                   context.filterBy = browseBy.filterBy;
 | |
|                                   ctxArgs.context = context;
 | |
|                                   cloudStack.uiCustom.metricsView({resource: browseBy.resource})(ctxArgs);
 | |
|                               }
 | |
|                           });
 | |
|                       }
 | |
|                   }
 | |
|             });
 | |
|         };
 | |
|     };
 | |
| })(jQuery, cloudStack);
 |