Sfoglia il codice sorgente

AMBARI-14802. Confusing maintenance mode behaviour for host components (akovalenko)

Aleksandr Kovalenko 9 anni fa
parent
commit
5403549d98

+ 4 - 3
ambari-web/app/controllers/main/host/details.js

@@ -2307,9 +2307,10 @@ App.MainHostDetailsController = Em.Controller.extend(App.SupportClientConfigsDow
   },
 
   toggleMaintenanceMode: function (event) {
-    var self = this;
-    var state = event.context.get('passiveState') === "ON" ? "OFF" : "ON";
-    var message = Em.I18n.t('passiveState.turn' + state.toCapital() + 'For').format(event.context.get('displayName'));
+    var state, message, self = this;
+    if (event.context.get('isImpliedState')) return null;
+    state = event.context.get('passiveState') === "ON" ? "OFF" : "ON";
+    message = Em.I18n.t('passiveState.turn' + state.toCapital() + 'For').format(event.context.get('displayName'));
     return App.showConfirmationPopup(function () {
       self.updateComponentPassiveState(event.context, state, message);
     });

+ 2 - 0
ambari-web/app/messages.js

@@ -314,6 +314,8 @@ Em.I18n.translations = {
   'passiveState.turnOff':'Turn Off Maintenance Mode',
   'passiveState.turnOnFor':'Turn On Maintenance Mode for {0}',
   'passiveState.turnOffFor':'Turn Off Maintenance Mode for {0}',
+  'passiveState.disabled.impliedFromHighLevel':'{0} is already in Maintenance Mode because {1} is in Maintenance Mode.',
+  'passiveState.disabled.impliedFromServiceAndHost':'{0} is already in Maintenance Mode because {1} and {2} are in Maintenance Mode.',
 
   'requestInfo.installComponents':'Install Components',
   'requestInfo.installKerbeorosComponents':'Install Kerberos Components',

+ 6 - 0
ambari-web/app/models/host_component.js

@@ -113,6 +113,12 @@ App.HostComponent = DS.Model.extend({
    */
   isActive: Em.computed.equal('passiveState', 'OFF'),
 
+  /**
+   * Determine if passiveState is implied from host or/and service
+   * @returns {Boolean}
+   */
+  isImpliedState: Em.computed.existsIn('passiveState', ['IMPLIED_FROM_SERVICE_AND_HOST', 'IMPLIED_FROM_HOST', 'IMPLIED_FROM_SERVICE']),
+
   passiveTooltip: Em.computed.ifThenElse('isActive', '', Em.I18n.t('hosts.component.passive.mode')),
   /**
    * Determine if component is a HDP component

+ 3 - 0
ambari-web/app/styles/application.less

@@ -3695,6 +3695,9 @@ table.graphs {
         color: #808080;
         cursor: default;
       }
+      .allow-tooltip {
+        pointer-events: auto;
+      }
     }
   }
   .host-tab-content {

+ 2 - 1
ambari-web/app/templates/main/host/details/host_component.hbs

@@ -105,7 +105,8 @@
             {{/isAuthorized}}
           {{/if}}
           {{#isAuthorized "HOST.TOGGLE_MAINTENANCE"}}
-            <li {{bindAttr class="view.noActionAvailable"}}>
+            <li {{bindAttr class="view.noActionAvailable view.content.isImpliedState:disabled :allow-tooltip"}}
+              {{bindAttr data-original-title="view.maintenanceTooltip"}} rel="passiveTooltip" >
             <a href="javascript:void(null)"
                data-toggle="modal" {{action "toggleMaintenanceMode" view.content target="controller"}}>
               {{#if view.isActive}}

+ 1 - 1
ambari-web/app/utils/ember_computed.js

@@ -601,7 +601,7 @@ computed.ltProperties = function (dependentKey1, dependentKey2) {
  * <pre>
  * var o = Em.Object.create({
  *  p1: 'abc',
- *  p2: Em.computed.lteProperties('p1', /^a/)
+ *  p2: Em.computed.match('p1', /^a/)
  * });
  * console.log(o.get('p2')); // true
  * o.set('p1', 'bc');

+ 17 - 0
ambari-web/app/views/main/host/details/host_component_view.js

@@ -152,6 +152,23 @@ App.HostComponentView = Em.View.extend({
    */
   isActive: Em.computed.equal('content.passiveState', 'OFF'),
 
+  /**
+   *  Tooltip message for switch maintenance mode option
+   *  @type {Strting}
+   */
+  maintenanceTooltip: function () {
+    switch (this.get('content.passiveState')) {
+      case 'IMPLIED_FROM_SERVICE':
+        return Em.I18n.t('passiveState.disabled.impliedFromHighLevel').format(this.get('content.displayName'), this.get('content.service.serviceName'));
+      case 'IMPLIED_FROM_HOST':
+        return Em.I18n.t('passiveState.disabled.impliedFromHighLevel').format(this.get('content.displayName'), this.get('content.host.hostName'));
+      case 'IMPLIED_FROM_SERVICE_AND_HOST':
+        return Em.I18n.t('passiveState.disabled.impliedFromServiceAndHost').format(this.get('content.displayName'), this.get('content.service.serviceName'), this.get('content.host.hostName'));
+      default:
+        return '';
+    }
+  }.property('content.passiveState'),
+
   /**
    * Shows whether we need to show Delete button
    * @type {bool}

+ 10 - 0
ambari-web/test/controllers/main/host/details_test.js

@@ -2936,6 +2936,16 @@ describe('App.MainHostDetailsController', function () {
         passiveState: 'OFF'
       }), 'ON')).to.be.true;
     });
+    it('isImpliedState is true', function () {
+      var event = {
+        context: Em.Object.create({
+          isImpliedState: true
+        })
+      };
+      var result = controller.toggleMaintenanceMode(event);
+      expect(App.showConfirmationPopup.calledOnce).to.be.false;
+      expect(result).to.be.null;
+    });
   });
 
   describe('#installClients()', function () {