Repository: ambari Updated Branches: refs/heads/trunk fd9740312 -> 60cbd69e7
AMBARI-5858 Convert Hosts table to use server-side paging. (atkach) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/60cbd69e Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/60cbd69e Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/60cbd69e Branch: refs/heads/trunk Commit: 60cbd69e7c0a82d8f86963697296be0d9f454a6e Parents: fd97403 Author: atkach <atk...@hortonworks.com> Authored: Thu May 22 16:23:45 2014 +0300 Committer: atkach <atk...@hortonworks.com> Committed: Thu May 22 16:23:45 2014 +0300 ---------------------------------------------------------------------- .../app/controllers/global/update_controller.js | 45 +++++++++++- ambari-web/app/mappers/hosts_mapper.js | 9 ++- ambari-web/app/mixins.js | 1 + .../app/mixins/common/tableServerProvider.js | 76 ++++++++++++++++++++ ambari-web/app/models/host.js | 4 ++ ambari-web/app/views/common/table_view.js | 2 +- ambari-web/app/views/main/host.js | 21 +++++- 7 files changed, 151 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/controllers/global/update_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js index d24e5ac..cb84bb4 100644 --- a/ambari-web/app/controllers/global/update_controller.js +++ b/ambari-web/app/controllers/global/update_controller.js @@ -36,6 +36,43 @@ App.UpdateController = Em.Controller.extend({ }, /** + * construct URL from real URL and query parameters + * @param testUrl + * @param realUrl + * @param queryParams + * @return {String} + */ + getComplexUrl: function (testUrl, realUrl, queryParams) { + var url = App.apiPrefix + '/clusters/' + App.get('clusterName'); + var params = ''; + if (App.testMode) { + url = testUrl; + } else { + if (queryParams) { + queryParams.forEach(function (param) { + params += param.key + '=' + param.value + '&'; + }); + } + url += realUrl.replace('<parameters>', params); + } + return url; + }, + + /** + * depict query parameters of table + */ + queryParams: Em.Object.create({ + 'Hosts': [] + }), + + /** + * map describes relations between updater function and table + */ + tableUpdaterMap: { + 'Hosts': 'updateHost' + }, + + /** * Start polling, when <code>isWorking</code> become true */ updateAll: function () { @@ -81,9 +118,11 @@ App.UpdateController = Em.Controller.extend({ updateHost: function (callback) { var testUrl = App.get('isHadoop2Stack') ? '/data/hosts/HDP2/hosts.json' : '/data/hosts/hosts.json'; - var hostsUrl = this.getUrl(testUrl, '/hosts?fields=Hosts/host_name,Hosts/host_status,Hosts/last_heartbeat_time,Hosts/disk_info,Hosts/maintenance_state,' + - 'metrics/disk,metrics/load/load_one,metrics/cpu/cpu_system,metrics/cpu/cpu_user,metrics/memory/mem_total,metrics/memory/mem_free' + - '&minimal_response=true'); + var realUrl = '/hosts?<parameters>fields=Hosts/host_name,Hosts/maintenance_state,Hosts/public_host_name,Hosts/cpu_count,Hosts/ph_cpu_count,Hosts/total_mem,' + + 'Hosts/host_status,Hosts/last_heartbeat_time,Hosts/os_arch,Hosts/os_type,Hosts/ip,host_components/HostRoles/state,host_components/HostRoles/maintenance_state,' + + 'Hosts/disk_info,metrics/disk,metrics/load/load_one,metrics/cpu/cpu_system,metrics/cpu/cpu_user,' + + 'metrics/memory/mem_total,metrics/memory/mem_free,alerts/summary&minimal_response=true'; + var hostsUrl = this.getComplexUrl(testUrl, realUrl, this.get('queryParams.Hosts')); App.HttpClient.get(hostsUrl, App.hostsMapper, { complete: callback }); http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/mappers/hosts_mapper.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/hosts_mapper.js b/ambari-web/app/mappers/hosts_mapper.js index bd87064..0f93af5 100644 --- a/ambari-web/app/mappers/hosts_mapper.js +++ b/ambari-web/app/mappers/hosts_mapper.js @@ -136,8 +136,13 @@ App.hostsMapper = App.QuickDataMapper.create({ }); App.store.loadMany(this.get('model'), modifiedHosts); } + + clientHosts.forEach(function (host) { + host.set('isRequested', !!hostIds[host.get('hostName')]); + }, this); + // hosts were deleted - if (clientHosts.get('length') > hostsWithFullInfo.length) { + /* if (clientHosts.get('length') > hostsWithFullInfo.length) { clientHosts.forEach(function (host) { if (host && !hostIds[host.get('hostName')]) { // Delete old ones as new ones will be @@ -146,7 +151,7 @@ App.hostsMapper = App.QuickDataMapper.create({ delete cacheData[host.get('id')]; } }, this); - } + }*/ } if (!isModelLoaded) { App.Host.find().forEach(function (_host) { http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/mixins.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins.js b/ambari-web/app/mixins.js index 6feed84..c94b459 100644 --- a/ambari-web/app/mixins.js +++ b/ambari-web/app/mixins.js @@ -21,4 +21,5 @@ require('mixins/common/localStorage'); require('mixins/common/userPref'); +require('mixins/common/tableServerProvider'); require('mixins/main/host/details/host_components/decommissionable'); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/mixins/common/tableServerProvider.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/common/tableServerProvider.js b/ambari-web/app/mixins/common/tableServerProvider.js new file mode 100644 index 0000000..725469e --- /dev/null +++ b/ambari-web/app/mixins/common/tableServerProvider.js @@ -0,0 +1,76 @@ +/** + * 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. + */ + +var App = require('app'); + + +App.TableServerProvider = Em.Mixin.create({ + tableName: '', + updaterBinding: 'App.router.updateController', + /** + * contains association between property of table and parameter in query + */ + paramAssociations: {}, + /** + * properties which trigger <code>refresh()</code> when they are changed + */ + refreshTriggers: [], + refreshCompleted: true, + + /** + * add observers to trigger properties + */ + initTriggers: function () { + this.get('refreshTriggers').forEach(function (trigger) { + this.addObserver(trigger, this, 'refresh'); + }, this); + }, + + /** + * set filter properties of table to query parameters + * @param newParams + */ + setParams: function (newParams) { + this.get('updater.queryParams').set(this.get('tableName'), newParams); + }, + + /** + * request latest data filtered by new parameters + * called when trigger property(<code>refreshTriggers</code>) is changed + */ + refresh: function () { + var params = []; + var paramAssociations = this.get('paramAssociations'); + var self = this; + + for (var property in paramAssociations) { + if (!Em.isNone(this.get(property))) { + params.push({ + key: paramAssociations[property], + value: this.get(property) + }); + } + } + this.setParams(params); + this.set('refreshCompleted', false); + this.get('updater')[this.get('updater.tableUpdaterMap')[this.get('tableName')]](function () { + self.set('refreshCompleted', true); + self.propertyDidChange('pageContent'); + }); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/models/host.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/host.js b/ambari-web/app/models/host.js index 4018074..b4993d3 100644 --- a/ambari-web/app/models/host.js +++ b/ambari-web/app/models/host.js @@ -51,6 +51,10 @@ App.Host = DS.Model.extend({ * Is host checked at the main Hosts page */ selected:DS.attr('boolean'), + /** + * determine whether host is requested from server + */ + isRequested: DS.attr('boolean'), /** * Overall CPU usage (system and user) http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/views/common/table_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/table_view.js b/ambari-web/app/views/common/table_view.js index c5d18f8..e5a455c 100644 --- a/ambari-web/app/views/common/table_view.js +++ b/ambari-web/app/views/common/table_view.js @@ -182,7 +182,7 @@ App.TableView = Em.View.extend(App.UserPref, { */ paginationInfo: function () { return this.t('tableView.filters.paginationInfo').format(this.get('startIndex'), this.get('endIndex'), this.get('filteredContent.length')); - }.property('displayLength', 'filteredContent.length', 'startIndex', 'endIndex'), + }.property('filteredContent.length', 'endIndex'), paginationLeft: Ember.View.extend({ tagName: 'a', http://git-wip-us.apache.org/repos/asf/ambari/blob/60cbd69e/ambari-web/app/views/main/host.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/host.js b/ambari-web/app/views/main/host.js index 3c0a009..ee3510b 100644 --- a/ambari-web/app/views/main/host.js +++ b/ambari-web/app/views/main/host.js @@ -21,7 +21,7 @@ var filters = require('views/common/filter_view'); var sort = require('views/common/sort_view'); var date = require('utils/date'); -App.MainHostView = App.TableView.extend({ +App.MainHostView = App.TableView.extend(App.TableServerProvider, { templateName:require('templates/main/host'), /** * List of hosts in cluster @@ -31,6 +31,24 @@ App.MainHostView = App.TableView.extend({ return this.get('controller.content'); }.property('controller.content.length'), + tableName: 'Hosts', + paramAssociations: { + 'serverStartIndex': 'from', + 'displayLength': 'page_size' + }, + refreshTriggers: ['serverStartIndex', 'displayLength'], + + /** + * startIndex as query parameter have first index - "0" + */ + serverStartIndex: function() { + return this.get('startIndex') - 1; + }.property('startIndex'), + + pageContent: function () { + return this.get('filteredContent').filterProperty('isRequested'); + }.property('filteredContent.length'), + clearFiltersObs: function() { var self = this; Em.run.next(function() { @@ -42,6 +60,7 @@ App.MainHostView = App.TableView.extend({ }, didInsertElement: function() { + this.initTriggers(); this.addObserver('controller.clearFilters', this, this.clearFiltersObs); this.clearFiltersObs(); this.addObserver('selectAllHosts', this, this.toggleAllHosts);