You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2018/07/25 16:45:21 UTC
[ambari] branch branch-2.7 updated: AMBARI-24260 Ambari shows
success when HBase Decommission/Recommission operations fail. (ababiichuk)
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 <ab...@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;
+ });
+ });
+ });
});