Return-Path: X-Original-To: apmail-ambari-commits-archive@www.apache.org Delivered-To: apmail-ambari-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 74B681874A for ; Mon, 7 Mar 2016 19:47:18 +0000 (UTC) Received: (qmail 74582 invoked by uid 500); 7 Mar 2016 19:47:18 -0000 Delivered-To: apmail-ambari-commits-archive@ambari.apache.org Received: (qmail 74549 invoked by uid 500); 7 Mar 2016 19:47:18 -0000 Mailing-List: contact commits-help@ambari.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: ambari-dev@ambari.apache.org Delivered-To: mailing list commits@ambari.apache.org Received: (qmail 74540 invoked by uid 99); 7 Mar 2016 19:47:18 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 07 Mar 2016 19:47:18 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 34A7CDFB8A; Mon, 7 Mar 2016 19:47:18 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: rzang@apache.org To: commits@ambari.apache.org Message-Id: <3c2bd75682794ec69fc3c283f8b6c21d@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: ambari git commit: AMBARI-15308 UI: ability to perform bulk add host components (Joe Wang via rzang) Date: Mon, 7 Mar 2016 19:47:18 +0000 (UTC) Repository: ambari Updated Branches: refs/heads/trunk 29d636ccb -> 7cc897bd6 AMBARI-15308 UI: ability to perform bulk add host components (Joe Wang via rzang) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7cc897bd Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7cc897bd Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7cc897bd Branch: refs/heads/trunk Commit: 7cc897bd6c700fb74028ec90426392411905e7a2 Parents: 29d636c Author: Richard Zang Authored: Mon Mar 7 11:46:45 2016 -0800 Committer: Richard Zang Committed: Mon Mar 7 11:46:45 2016 -0800 ---------------------------------------------------------------------- .../main/host/bulk_operations_controller.js | 125 +++++++++++++++++++ ambari-web/app/messages.js | 3 + .../templates/main/host/bulk_operation_menu.hbs | 6 +- ambari-web/app/utils/ajax/ajax.js | 11 ++ .../views/main/host/hosts_table_menu_view.js | 25 ++++ .../host/bulk_operations_controller_test.js | 11 ++ 6 files changed, 179 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/7cc897bd/ambari-web/app/controllers/main/host/bulk_operations_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/host/bulk_operations_controller.js b/ambari-web/app/controllers/main/host/bulk_operations_controller.js index b0ea13b..659d335 100644 --- a/ambari-web/app/controllers/main/host/bulk_operations_controller.js +++ b/ambari-web/app/controllers/main/host/bulk_operations_controller.js @@ -38,6 +38,9 @@ App.BulkOperationsController = Em.Controller.extend({ if (operationData.action === 'RESTART') { this.bulkOperationForHostComponentsRestart(operationData, hosts); } + else if (operationData.action === 'ADD') { + this.bulkOperationForHostComponentsAddConfirm(operationData, hosts); + } else { if (operationData.action.indexOf('DECOMMISSION') == -1) { this.bulkOperationForHostComponents(operationData, hosts); @@ -305,6 +308,128 @@ App.BulkOperationsController = Em.Controller.extend({ updateHostPassiveState: function (data, opt, params) { return batchUtils.infoPassiveState(params.passive_state); }, + + /** + * Confirm bulk add for selected hostComponent + * @param {Object} operationData - data about bulk operation (action, hostComponent etc) + * @param {Array} hosts - list of affected hosts + */ + bulkOperationForHostComponentsAddConfirm: function (operationData, hosts) { + var self = this; + + hosts = hosts.mapProperty('hostName'); + + var allHostsWithComponent = App.HostComponent.find().filterProperty('componentName', operationData.componentName).mapProperty('hostName'); + var hostsWithComponent = hosts.filter(function (host) { + return allHostsWithComponent.contains(host); + }); + var hostsWithOutComponent = hosts.filter(function(host) { + return !hostsWithComponent.contains(host); + }); + + var minShown = 3; + + if (hostsWithOutComponent.length) { + return App.ModalPopup.show({ + header: Em.I18n.t('hosts.bulkOperation.confirmation.header'), + hostNames: hostsWithOutComponent.join("\n"), + visibleHosts: self._showHostNames(hostsWithOutComponent, "\n", minShown), + hostNamesSkippedVisible: self._showHostNames(hostsWithComponent, "\n", minShown), + expanded: false, + + hostNamesSkipped: function() { + return hostsWithComponent.length ? hostsWithComponent.join("\n") : false; + }.property(), + + didInsertElement: function() { + this.set('expanded', hostsWithOutComponent.length <= minShown); + }, + + onPrimary: function() { + self.bulkOperationForHostComponentsAdd(operationData, hostsWithOutComponent); + this._super(); + }, + bodyClass: Em.View.extend({ + templateName: require('templates/main/host/bulk_operation_confirm_popup'), + message: Em.I18n.t('hosts.bulkOperation.confirmation.add.component').format(operationData.message, operationData.componentNameFormatted, hostsWithOutComponent.length), + warningInfo: Em.I18n.t('hosts.bulkOperation.confirmation.add.component.skip').format(operationData.componentNameFormatted), + textareaVisible: false, + textTrigger: function() { + this.toggleProperty('textareaVisible'); + }, + + showAll: function() { + this.set('parentView.visibleHosts', this.get('parentView.hostNames')); + this.set('parentView.hostNamesSkippedVisible', this.get('parentView.hostNamesSkipped')); + this.set('parentView.expanded', true); + }, + putHostNamesToTextarea: function() { + var hostNames = this.get('parentView.hostNames'); + if (this.get('textareaVisible')) { + var wrapper = $(".task-detail-log-maintext"); + $('.task-detail-log-clipboard').html(hostNames).width(wrapper.width()).height(250); + Em.run.next(function() { + $('.task-detail-log-clipboard').select(); + }); + } + }.observes('textareaVisible') + }) + }); + } + return App.ModalPopup.show({ + header: Em.I18n.t('rolling.nothingToDo.header'), + body: Em.I18n.t('hosts.bulkOperation.confirmation.add.component.nothingToDo.body').format(operationData.componentNameFormatted), + secondary: false + }); + }, + /** + * Bulk add for selected hostComponent + * @param {Object} operationData - data about bulk operation (action, hostComponent etc) + * @param {Array} hostNames - list of affected hosts' names + */ + bulkOperationForHostComponentsAdd: function (operationData, hostNames) { + var self= this; + App.get('router.mainAdminKerberosController').getKDCSessionState(function () { + App.ajax.send({ + name: 'host.host_component.add_new_components', + sender: self, + data: { + data: JSON.stringify({ + RequestInfo: { + query: 'Hosts/host_name.in(' + hostNames.join(',') + ')' + }, + Body: { + host_components: [ + { + HostRoles: { + component_name: operationData.componentName + } + } + ] + } + }), + context: operationData.message + ' ' + operationData.componentNameFormatted, + }, + success: 'bulkOperationForHostComponentsAddSuccessCallback' + }); + }); + }, + + bulkOperationForHostComponentsAddSuccessCallback: function (data, opt, params) { + App.ajax.send({ + name: 'common.host_components.update', + sender: this, + data: { + query: 'HostRoles/state=INIT', + HostRoles: { + state: 'INSTALLED' + }, + context: params.context + }, + success: 'bulkOperationForHostComponentsSuccessCallback' + }); + }, + /** * Bulk operation for selected hostComponents * @param {Object} operationData - data about bulk operation (action, hostComponents etc) http://git-wip-us.apache.org/repos/asf/ambari/blob/7cc897bd/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index a3a4d1d..8e69dd0 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -2272,6 +2272,9 @@ Em.I18n.translations = { 'hosts.bulkOperation.passiveState.nothingToDo.body':'All hosts that you selected are already in Maintenance Mode.', 'hosts.bulkOperation.warningInfo.body':'Components on these hosts are stopped so decommission will be skipped.', 'hosts.bulkOperation.host_components.passiveState.nothingToDo.body':'All host components that you selected are already in Maintenance Mode', + 'hosts.bulkOperation.confirmation.add.component':'You are going to {0} {1} on the following {2} hosts.', + 'hosts.bulkOperation.confirmation.add.component.skip':'The following hosts are skipped as they already have {0} installed.', + 'hosts.bulkOperation.confirmation.add.component.nothingToDo.body': 'All the selected hosts have {0} installed already.', 'hosts.selectHostsDialog.title': 'Select Configuration Group Hosts', 'hosts.selectHostsDialog.message': 'Select hosts that should belong to this {0} Configuration Group. All hosts belonging to this group will have the same set of configurations.', http://git-wip-us.apache.org/repos/asf/ambari/blob/7cc897bd/ambari-web/app/templates/main/host/bulk_operation_menu.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/host/bulk_operation_menu.hbs b/ambari-web/app/templates/main/host/bulk_operation_menu.hbs index fab2576..543deb0 100644 --- a/ambari-web/app/templates/main/host/bulk_operation_menu.hbs +++ b/ambari-web/app/templates/main/host/bulk_operation_menu.hbs @@ -121,9 +121,11 @@ {{operation.label}} {{/view}} {{else}} - {{#view view.commonOperationView contentBinding="operation.operationData" selection="a"}} + {{#unless operation.delete}} + {{#view view.commonOperationView contentBinding="operation.operationData" selection="a"}} {{operation.label}} - {{/view}} + {{/view}} + {{/unless}} {{/if}} {{/each}} http://git-wip-us.apache.org/repos/asf/ambari/blob/7cc897bd/ambari-web/app/utils/ajax/ajax.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js index a5d0899..c054b38 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -865,6 +865,17 @@ var urls = { } }, + 'host.host_component.add_new_components': { + 'real': '/clusters/{clusterName}/hosts', + 'mock': '/data/wizard/deploy/poll_1.json', + 'format': function (data) { + return { + type: 'POST', + data: data.data + } + } + }, + 'host.host_component.slave_desired_admin_state': { 'real': '/clusters/{clusterName}/hosts/{hostName}/host_components/{componentName}/?fields=HostRoles/desired_admin_state', 'mock': '/data/hosts/HDP2/decommission_state.json' http://git-wip-us.apache.org/repos/asf/ambari/blob/7cc897bd/ambari-web/app/views/main/host/hosts_table_menu_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/host/hosts_table_menu_view.js b/ambari-web/app/views/main/host/hosts_table_menu_view.js index 733edc7..0d119f7 100644 --- a/ambari-web/app/views/main/host/hosts_table_menu_view.js +++ b/ambari-web/app/views/main/host/hosts_table_menu_view.js @@ -134,6 +134,31 @@ App.HostTableMenuView = Em.View.extend({ }) ]) } + if (App.isAuthorized("HOST.ADD_DELETE_COMPONENTS")) { + menuItems.pushObjects([ + O.create({ + label: Em.I18n.t('common.add'), + operationData: O.create({ + action: 'ADD', + message: Em.I18n.t('common.add'), + componentName: content.componentName, + serviceName: content.serviceName, + componentNameFormatted: content.componentNameFormatted + }) + }), + O.create({ + label: Em.I18n.t('common.delete'), + delete: true, + operationData: O.create({ + action: 'DELETE', + message: Em.I18n.t('common.delete'), + componentName: content.componentName, + serviceName: content.serviceName, + componentNameFormatted: content.componentNameFormatted + }) + }) + ]) + } if (App.isAuthorized("SERVICE.DECOMMISSION_RECOMMISSION") && App.get('components.decommissionAllowed').contains(content.componentName)) { menuItems.pushObjects([ O.create({ http://git-wip-us.apache.org/repos/asf/ambari/blob/7cc897bd/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js b/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js index 05e0904..178a6fd 100644 --- a/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js +++ b/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js @@ -32,6 +32,7 @@ describe('BulkOperationsController', function () { sinon.stub(hostController, 'bulkOperationForHostComponentsRestart', Em.K); sinon.stub(hostController, 'bulkOperationForHostComponentsDecommission', Em.K); sinon.stub(hostController, 'bulkOperationForHostComponents', Em.K); + sinon.stub(hostController, 'bulkOperationForHostComponentsAddConfirm', Em.K); sinon.stub(hostController, 'bulkOperationForHostsPassiveState', Em.K); }); @@ -42,6 +43,7 @@ describe('BulkOperationsController', function () { hostController.bulkOperationForHostComponentsRestart.restore(); hostController.bulkOperationForHostComponentsDecommission.restore(); hostController.bulkOperationForHostComponents.restore(); + hostController.bulkOperationForHostComponentsAddConfirm.restore(); hostController.bulkOperationForHostsPassiveState.restore(); }); @@ -113,6 +115,15 @@ describe('BulkOperationsController', function () { expect(hostController.bulkOperationForHostComponents.calledOnce).to.equal(true); }); + it('ADD for hostComponents', function() { + var operationData = { + action: 'ADD', + componentNameFormatted: 'DataNodes' + }; + hostController.bulkOperation(operationData, []); + expect(hostController.bulkOperationForHostComponentsAddConfirm.calledOnce).to.equal(true); + }); + it('DECOMMISSION for hostComponents', function() { var operationData = { action: 'DECOMMISSION',