This is an automated email from the ASF dual-hosted git repository.

ababiichuk pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 24c1a6e  AMBARI-24260 Ambari shows success when HBase 
Decommission/Recommission operations fail. (ababiichuk)
24c1a6e is described below

commit 24c1a6eab620445266fa2af3737f081fbebe7959
Author: aBabiichuk <ababiic...@hortonworks.com>
AuthorDate: Wed Jul 25 19:44:51 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;
+      });
+    });
+  });
 });

Reply via email to