This is an automated email from the ASF dual-hosted git repository. ababiichuk pushed a commit to branch branch-2.7 in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/branch-2.7 by this push: new 9303409 AMBARI-24260 Ambari shows success when HBase Decommission/Recommission operations fail. (ababiichuk) 9303409 is described below commit 9303409f70be58eeb9cb53b71a60c8c73b3c35a6 Author: aBabiichuk <ababiic...@hortonworks.com> AuthorDate: Wed Jul 25 19:45:18 2018 +0300 AMBARI-24260 Ambari shows success when HBase Decommission/Recommission operations fail. (ababiichuk) --- ambari-web/app/utils/ajax/ajax.js | 3 + .../host_component_views/regionserver_view.js | 58 +++++- .../host_component_views/regionserver_view_test.js | 218 ++++++++++++++++++++- 3 files changed, 270 insertions(+), 9 deletions(-) diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js index 9c36c45..1308c21 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -988,6 +988,9 @@ var urls = { 'real': '/clusters/{clusterName}/host_components?HostRoles/component_name=NAMENODE&HostRoles/host_name.in({hostNames})&fields=metrics/dfs/namenode', 'mock': '/data/hosts/HDP2/decommission_state.json' }, + 'host.host_component.decommission_status_regionserver': { + 'real': '/clusters/{clusterName}/host_components?HostRoles/component_name=HBASE_MASTER&HostRoles/host_name={hostName}&fields=metrics/hbase/master/liveRegionServersHosts,metrics/hbase/master/deadRegionServersHosts&minimal_response=true' + }, 'host.region_servers.in_inservice': { 'real': '/clusters/{clusterName}/host_components?HostRoles/component_name=HBASE_REGIONSERVER&HostRoles/desired_admin_state=INSERVICE&fields=HostRoles/host_name&minimal_response=true', 'mock': '' diff --git a/ambari-web/app/views/main/host/details/host_component_views/regionserver_view.js b/ambari-web/app/views/main/host/details/host_component_views/regionserver_view.js index 8cfb5f5..a2fbecd 100644 --- a/ambari-web/app/views/main/host/details/host_component_views/regionserver_view.js +++ b/ambari-web/app/views/main/host/details/host_component_views/regionserver_view.js @@ -23,12 +23,64 @@ App.RegionServerComponentView = App.HostComponentView.extend(App.Decommissionabl componentForCheckDecommission: 'HBASE_MASTER', setDesiredAdminState: function (desiredAdminState) { + this.getRSDecommissionStatus(desiredAdminState); + }, + + getRSDecommissionStatus: function (desiredAdminState) { + const hostName = App.HBaseService.find('HBASE').get('master.hostName'); + App.ajax.send({ + name: 'host.host_component.decommission_status_regionserver', + sender: this, + data: { + hostName, + desiredAdminState + }, + success: 'getRSDecommissionStatusSuccessCallback', + error: 'getRSDecommissionStatusErrorCallback' + }); + }, + + getRSDecommissionStatusSuccessCallback: function (data, opt, params) { + const {desiredAdminState} = params, + hostName = this.get('content.hostName'); + if (data) { + const liveRSHostsMetrics = Em.get(data, 'items.0.metrics.hbase.master.liveRegionServersHosts'), + deadRSHostsMetrics = Em.get(data, 'items.0.metrics.hbase.master.deadRegionServersHosts'), + liveRSHosts = this.parseRegionServersHosts(liveRSHostsMetrics), + deadRSHosts = this.parseRegionServersHosts(deadRSHostsMetrics), + isLiveRS = liveRSHosts.contains(hostName), + isDeadRS = deadRSHosts.contains(hostName), + isInServiceDesired = desiredAdminState === 'INSERVICE', + isDecommissionedDesired = desiredAdminState === 'DECOMMISSIONED'; + if ((liveRSHosts.length + deadRSHosts.length === 0) || (isInServiceDesired && isLiveRS) || (isDecommissionedDesired && isDeadRS)) { + this.setDesiredAdminStateDefault(desiredAdminState); + } else if (isInServiceDesired) { + this.setStatusAs('RS_DECOMMISSIONED'); + } else if (isDecommissionedDesired) { + this.setStatusAs('INSERVICE'); + } + } else { + this.setDesiredAdminStateDefault(desiredAdminState); + } + }, + + getRSDecommissionStatusErrorCallback: function (request, ajaxOptions, error, opt, params) { + this.setDesiredAdminStateDefault(params.desiredAdminState); + }, + + parseRegionServersHosts: function (str) { + const items = str ? str.split(';') : [], + hosts = items.map(item => item.split(',')[0]); + return hosts; + }, + + setDesiredAdminStateDefault: function (desiredAdminState) { switch (desiredAdminState) { - case "INSERVICE": + case 'INSERVICE': this.setStatusAs(desiredAdminState); break; - case "DECOMMISSIONED": - this.setStatusAs("RS_DECOMMISSIONED"); + case 'DECOMMISSIONED': + this.setStatusAs('RS_DECOMMISSIONED'); break; } } diff --git a/ambari-web/test/views/main/host/details/host_component_views/regionserver_view_test.js b/ambari-web/test/views/main/host/details/host_component_views/regionserver_view_test.js index b95b422..d481428 100644 --- a/ambari-web/test/views/main/host/details/host_component_views/regionserver_view_test.js +++ b/ambari-web/test/views/main/host/details/host_component_views/regionserver_view_test.js @@ -20,22 +20,228 @@ var App = require('app'); require('views/main/host/details/host_component_views/regionserver_view'); describe('App.RegionServerComponentView', function () { - var view = App.RegionServerComponentView.create(); + var view; - describe("#setDesiredAdminState()", function () { + beforeEach(function () { + view = App.RegionServerComponentView.create(); + }); + + describe('#setDesiredAdminStateDefault()', function () { beforeEach(function () { sinon.stub(view, 'setStatusAs', Em.K); }); afterEach(function () { view.setStatusAs.restore(); }); - it("INSERVICE state)", function () { - view.setDesiredAdminState('INSERVICE'); + it('INSERVICE state', function () { + view.setDesiredAdminStateDefault('INSERVICE'); expect(view.setStatusAs.calledWith('INSERVICE')).to.be.true; }); - it("DECOMMISSIONED state)", function () { - view.setDesiredAdminState('DECOMMISSIONED'); + it('DECOMMISSIONED state', function () { + view.setDesiredAdminStateDefault('DECOMMISSIONED'); expect(view.setStatusAs.calledWith('RS_DECOMMISSIONED')).to.be.true; }); }); + + describe('#parseRegionServersHosts()', function () { + var cases = [ + { + input: undefined, + result: [], + title: 'undefined input' + }, + { + input: '', + result: [], + title: 'empty string' + }, + { + input: 'host,1,2', + result: ['host'], + title: 'single host string' + }, + { + input: 'host1,1,2;host2,3,4', + result: ['host1', 'host2'], + title: 'multiple hosts string' + } + ]; + + cases.forEach(function (test) { + it(test.title, function () { + expect(view.parseRegionServersHosts(test.input)).to.eql(test.result); + }); + }); + }); + + describe('#getRSDecommissionStatusSuccessCallback()', function () { + var cases = [ + { + data: null, + desiredAdminState: 'INSERVICE', + resultingState: 'INSERVICE', + title: 'no data, INSERVICE desired state' + }, + { + data: null, + desiredAdminState: 'DECOMMISSIONED', + resultingState: 'RS_DECOMMISSIONED', + title: 'no data, DECOMMISSIONED desired state' + }, + { + data: {}, + desiredAdminState: 'INSERVICE', + resultingState: 'INSERVICE', + title: 'empty data, INSERVICE desired state' + }, + { + data: {}, + desiredAdminState: 'DECOMMISSIONED', + resultingState: 'RS_DECOMMISSIONED', + title: 'empty data, DECOMMISSIONED desired state' + }, + { + data: { + items: [] + }, + desiredAdminState: 'INSERVICE', + resultingState: 'INSERVICE', + title: 'empty items array, INSERVICE desired state' + }, + { + data: { + items: [] + }, + desiredAdminState: 'DECOMMISSIONED', + resultingState: 'RS_DECOMMISSIONED', + title: 'empty items array, DECOMMISSIONED desired state' + }, + { + data: { + items: [ + { + metrics: { + hbase: { + master: {} + } + } + } + ] + }, + desiredAdminState: 'INSERVICE', + resultingState: 'INSERVICE', + title: 'no live and dead RS hosts provided, INSERVICE desired state' + }, + { + data: { + items: [ + { + metrics: { + hbase: { + master: {} + } + } + } + ] + }, + desiredAdminState: 'DECOMMISSIONED', + resultingState: 'RS_DECOMMISSIONED', + title: 'no live and dead RS hosts provided, DECOMMISSIONED desired state' + }, + { + data: { + items: [ + { + metrics: { + hbase: { + master: { + liveRegionServersHosts: 'h0,1,2;h1,3,4' + } + } + } + } + ] + }, + desiredAdminState: 'INSERVICE', + resultingState: 'INSERVICE', + title: 'RS is live, INSERVICE desired state' + }, + { + data: { + items: [ + { + metrics: { + hbase: { + master: { + liveRegionServersHosts: 'h0,1,2;h1,3,4' + } + } + } + } + ] + }, + desiredAdminState: 'DECOMMISSIONED', + resultingState: 'INSERVICE', + title: 'RS is live, DECOMMISSIONED desired state' + }, + { + data: { + items: [ + { + metrics: { + hbase: { + master: { + deadRegionServersHosts: 'h0,1,2;h1,3,4' + } + } + } + } + ] + }, + desiredAdminState: 'INSERVICE', + resultingState: 'RS_DECOMMISSIONED', + title: 'RS is dead, INSERVICE desired state' + }, + { + data: { + items: [ + { + metrics: { + hbase: { + master: { + deadRegionServersHosts: 'h0,1,2;h1,3,4' + } + } + } + } + ] + }, + desiredAdminState: 'DECOMMISSIONED', + resultingState: 'RS_DECOMMISSIONED', + title: 'RS is dead, DECOMMISSIONED desired state' + } + ]; + + beforeEach(function () { + sinon.stub(view, 'setStatusAs', Em.K); + sinon.stub(view, 'startBlinking', Em.K); + view.set('content', { + hostName: 'h0' + }); + }); + + afterEach(function () { + view.setStatusAs.restore(); + view.startBlinking.restore(); + }); + + cases.forEach(function (test) { + it(test.title, function () { + view.getRSDecommissionStatusSuccessCallback(test.data, null, { + desiredAdminState: test.desiredAdminState + }); + expect(view.setStatusAs.calledWith(test.resultingState)).to.be.true; + }); + }); + }); });