浏览代码

AMBARI-14097. Should option "Enable RM HA" be available if no RM installed on the cluster (onechiporenko)

Oleg Nechiporenko 9 年之前
父节点
当前提交
667e1e8be2

+ 15 - 4
ambari-web/app/models/host_component.js

@@ -51,6 +51,14 @@ App.HostComponent = DS.Model.extend({
    */
    */
   isRunning: Em.computed.existsIn('workStatus', ['STARTED', 'STARTING']),
   isRunning: Em.computed.existsIn('workStatus', ['STARTED', 'STARTING']),
 
 
+  /**
+   * Determines if component is not installed
+   * Based on <code>workStatus</code>
+   *
+   * @type {boolean}
+   */
+  isNotInstalled: Em.computed.existsIn('workStatus', ['INIT', 'INSTALL_FAILED']),
+
   /**
   /**
    * Formatted <code>componentName</code>
    * Formatted <code>componentName</code>
    * @returns {String}
    * @returns {String}
@@ -245,6 +253,9 @@ App.HostComponentStatus = {
 
 
 App.HostComponentActionMap = {
 App.HostComponentActionMap = {
   getMap: function(ctx) {
   getMap: function(ctx) {
+    var NN = ctx.get('controller.content.hostComponents').findProperty('componentName', 'NAMENODE');
+    var RM = ctx.get('controller.content.hostComponents').findProperty('componentName', 'RESOURCEMANAGER');
+    var RA = ctx.get('controller.content.hostComponents').findProperty('componentName', 'RANGER_ADMIN');
     return {
     return {
       RESTART_ALL: {
       RESTART_ALL: {
         action: 'restartAllHostComponents',
         action: 'restartAllHostComponents',
@@ -292,21 +303,21 @@ App.HostComponentActionMap = {
         label: App.get('isHaEnabled') ? Em.I18n.t('admin.highAvailability.button.disable') : Em.I18n.t('admin.highAvailability.button.enable'),
         label: App.get('isHaEnabled') ? Em.I18n.t('admin.highAvailability.button.disable') : Em.I18n.t('admin.highAvailability.button.enable'),
         cssClass: App.get('isHaEnabled') ? 'icon-arrow-down' : 'icon-arrow-up',
         cssClass: App.get('isHaEnabled') ? 'icon-arrow-down' : 'icon-arrow-up',
         isHidden: App.get('isHaEnabled'),
         isHidden: App.get('isHaEnabled'),
-        disabled: App.get('isSingleNode')
+        disabled: App.get('isSingleNode') || !NN || NN.get('isNotInstalled')
       },
       },
       TOGGLE_RM_HA: {
       TOGGLE_RM_HA: {
         action: 'enableRMHighAvailability',
         action: 'enableRMHighAvailability',
         label: Em.I18n.t('admin.rm_highAvailability.button.enable'),
         label: Em.I18n.t('admin.rm_highAvailability.button.enable'),
         cssClass: 'icon-arrow-up',
         cssClass: 'icon-arrow-up',
         isHidden: App.get('isRMHaEnabled'),
         isHidden: App.get('isRMHaEnabled'),
-        disabled: App.get('isSingleNode')
+        disabled: App.get('isSingleNode') || !RM || RM.get('isNotInstalled')
       },
       },
       TOGGLE_RA_HA: {
       TOGGLE_RA_HA: {
         action: 'enableRAHighAvailability',
         action: 'enableRAHighAvailability',
         label: Em.I18n.t('admin.ra_highAvailability.button.enable'),
         label: Em.I18n.t('admin.ra_highAvailability.button.enable'),
         cssClass: 'icon-arrow-up',
         cssClass: 'icon-arrow-up',
         isHidden: App.get('isRAHaEnabled'),
         isHidden: App.get('isRAHaEnabled'),
-        disabled: App.get('isSingleNode')
+        disabled: App.get('isSingleNode') || !RA || RA.get('isNotInstalled')
       },
       },
       MOVE_COMPONENT: {
       MOVE_COMPONENT: {
         action: 'reassignMaster',
         action: 'reassignMaster',
@@ -353,6 +364,6 @@ App.HostComponentActionMap = {
         isHidden: false,
         isHidden: false,
         disabled: false
         disabled: false
       }
       }
-    }
+    };
   }
   }
 };
 };

+ 25 - 0
ambari-web/test/models/host_component_test.js

@@ -314,4 +314,29 @@ describe('App.HostComponent', function() {
       });
       });
     });
     });
   });
   });
+
+  describe('#isNotInstalled', function () {
+
+    Em.A([
+      {
+        p: {workStatus: 'INIT'},
+        e: true
+      },
+      {
+        p: {workStatus: 'INSTALL_FAILED'},
+        e: true
+      },
+      {
+        p: {workStatus: 'STARTED'},
+        e: false
+      }
+    ]).forEach(function (test, index) {
+      it('#' + (index + 1), function() {
+        hc.setProperties(test.p);
+        expect(hc.get('isNotInstalled')).to.equal(test.e);
+      });
+    });
+
+  });
+
 });
 });

+ 46 - 31
ambari-web/test/views/main/service/item_test.js

@@ -144,6 +144,7 @@ describe('App.MainServiceItemView', function () {
           hostComponents: [
           hostComponents: [
             Em.Object.create({
             Em.Object.create({
               componentName: 'NAMENODE',
               componentName: 'NAMENODE',
+              isNotInstalled: true,
               isMaster: true,
               isMaster: true,
               isSlave: false
               isSlave: false
             }),
             }),
@@ -220,7 +221,8 @@ describe('App.MainServiceItemView', function () {
             Em.Object.create({
             Em.Object.create({
               componentName: 'RESOURCEMANAGER',
               componentName: 'RESOURCEMANAGER',
               isMaster: true,
               isMaster: true,
-              isSlave: false
+              isSlave: false,
+              isNotInstalled: false
             })
             })
           ],
           ],
           result: [
           result: [
@@ -420,7 +422,7 @@ describe('App.MainServiceItemView', function () {
       sinon.stub(App, 'get', function (k) {
       sinon.stub(App, 'get', function (k) {
         switch (k) {
         switch (k) {
           case 'isSingleNode':
           case 'isSingleNode':
-            return (view.get('controller.content.serviceName') == 'HDFS');
+            return view.get('controller.content.serviceName') == 'HDFS';
           case 'supports.autoRollbackHA':
           case 'supports.autoRollbackHA':
           case 'isRMHaEnabled':
           case 'isRMHaEnabled':
           case 'isHaEnabled':
           case 'isHaEnabled':
@@ -504,39 +506,52 @@ describe('App.MainServiceItemView', function () {
 
 
     testCases.forEach(function (testCase) {
     testCases.forEach(function (testCase) {
 
 
-      it('Maintenance for ' + testCase.serviceName + ' service', function () {
-        view.reopen({
-          controller: Em.Object.create({
-            content: Em.Object.create({
-              hostComponents: testCase.hostComponents,
-              slaveComponents: testCase.slaveComponents,
-              clientComponents: testCase.clientComponents,
-              serviceName: testCase.serviceName,
-              displayName: testCase.displayName,
-              serviceTypes: testCase.serviceTypes,
-              passiveState: 'OFF'
+      describe('Maintenance for ' + testCase.serviceName + ' service', function () {
+
+        beforeEach(function () {
+          view.reopen({
+            controller: Em.Object.create({
+              content: Em.Object.create({
+                hostComponents: testCase.hostComponents,
+                slaveComponents: testCase.slaveComponents,
+                clientComponents: testCase.clientComponents,
+                serviceName: testCase.serviceName,
+                displayName: testCase.displayName,
+                serviceTypes: testCase.serviceTypes,
+                passiveState: 'OFF'
+              }),
+              isSeveralClients: false,
+              clientComponents: [],
+              isStopDisabled: false
             }),
             }),
-            isSeveralClients: false,
-            clientComponents: [],
-            isStopDisabled: false
-          }),
-          mastersExcludedCommands: mastersExcludedCommands,
-          hasConfigTab: hasConfigTab
+            mastersExcludedCommands: mastersExcludedCommands,
+            hasConfigTab: hasConfigTab
+          });
+          if (testCase.controller) {
+            testCase.controller.forEach(function (item) {
+              Object.keys(item).forEach(function (key) {
+                view.set('controller.' + key, item[key]);
+              });
+            });
+          }
+          view.observeMaintenanceOnce();
         });
         });
-        if (testCase.controller) {
-          testCase.controller.forEach(function (item) {
-            Object.keys(item).forEach(function (key) {
-              view.set('controller.' + key, item[key]);
+        testCase.result.forEach(function (option, index) {
+          Object.keys(option).forEach(function (key) {
+            it(option.action + ', key - ' + key, function () {
+              var r = view.get('maintenance')[index];
+              expect(Em.get(option, key)).to.eql(Em.get(r, key));
             });
             });
           });
           });
-        }
-        view.observeMaintenanceOnce();
-        expect(view.get('maintenance')).to.eql(testCase.result);
-        var oldMaintenance = JSON.parse(JSON.stringify(view.get('maintenance')));
-        view.set('controller.content.passiveState', 'ON');
-        view.observeMaintenanceOnce();
-        expect(view.get('maintenance')).to.not.eql(oldMaintenance);
-        expect(view.get('isMaintenanceSet')).to.be.true;
+        });
+
+        it('maintenance is updated', function () {
+          var oldMaintenance = JSON.parse(JSON.stringify(view.get('maintenance')));
+          view.set('controller.content.passiveState', 'ON');
+          view.observeMaintenanceOnce();
+          expect(view.get('maintenance')).to.not.eql(oldMaintenance);
+          expect(view.get('isMaintenanceSet')).to.be.true;
+        });
       });
       });
 
 
     });
     });