Procházet zdrojové kódy

AMBARI-12879. Warn the user about HDFS Upgrade not finalized in Ambari Web UI (onechiporenko)

Oleg Nechiporenko před 9 roky
rodič
revize
5d159a376d

+ 46 - 0
ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js

@@ -83,6 +83,18 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
    */
   taskDetailsProperties: ['status', 'stdout', 'stderr', 'error_log', 'host_name', 'output_log'],
 
+  /**
+   * Context for Finalize item
+   * @type {string}
+   */
+  finalizeContext: 'Confirm Finalize',
+
+  /**
+   * Check if current item is Finalize
+   * @type {boolean}
+   */
+  isFinalizeItem: false,
+
   isLoadUpgradeDataPending: false,
 
   /**
@@ -797,6 +809,40 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     }
   }.observes('App.upgradeState'),
 
+  /**
+   * Check <code>App.upgradeState</code> for HOLDING
+   * If it is, send request to check if current item is Finalize
+   * @method updateFinalize
+   */
+  updateFinalize: function () {
+    var upgradeState = App.get('upgradeState');
+    if (upgradeState === 'HOLDING') {
+      return App.ajax.send({
+        name: 'admin.upgrade.finalizeContext',
+        sender: this,
+        success: 'updateFinalizeSuccessCallback',
+        error: 'updateFinalizeErrorCallback'
+      })
+    }
+    else {
+      this.set('isFinalizeItem', false);
+    }
+  }.observes('App.upgradeState'),
+
+  /**
+   *
+   * @param {object|null} data
+   * @method updateFinalizeSuccessCallback
+   */
+  updateFinalizeSuccessCallback: function (data) {
+    var context = data ? Em.get(data, 'upgrade_groups.firstObject.upgrade_items.firstObject.UpgradeItem.context') : '';
+    this.set('isFinalizeItem', context === this.get('finalizeContext'));
+  },
+
+  updateFinalizeErrorCallback: function() {
+    this.set('isFinalizeItem', false);
+  },
+
   /**
    * show dialog with tasks of upgrade
    * @return {App.ModalPopup}

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

@@ -1407,6 +1407,7 @@ Em.I18n.translations = {
   'admin.stackVersions.version.reinstall': "Reinstall Packages",
   'admin.stackVersions.version.performUpgrade': "Perform Upgrade",
   'admin.stackVersions.version.upgrade.pause': "Upgrade: Action Required",
+  'admin.stackVersions.version.upgrade.notFinalized.warning': "The upgrade has not been finalized yet. After the cluster is verified to be functional, do not forget to finalize the upgrade as soon as possible (within a couple of days is highly recommended) as running the cluster in unfinalized state causes extra resource requirements on HDFS.",
   'admin.stackVersions.version.upgrade.running': "Upgrade: In Process",
   'admin.stackVersions.version.upgrade.aborted': "Upgrade: Aborted",
   'admin.stackVersions.version.downgrade.pause': "Downgrade: Action Required",

+ 1 - 1
ambari-web/app/styles/application.less

@@ -2040,7 +2040,7 @@ a:focus {
     font-size: 11px;
   }
   .upgrade-status-warning {
-    color: @health-status-orange;
+    color: @health-status-red;
   }
   tr td:first-child {
     width: 180px;

+ 6 - 1
ambari-web/app/templates/application.hbs

@@ -102,8 +102,9 @@
       {{#if App.upgradeIsNotFinished}}
         <div class="ru-badge span12">
           <div class="navbar navbar-static-top clearfix">
-            <div class="span4 offset4">
+            <div class="span11">
               {{#if isExistingClusterDataLoaded}}
+                <p class="span4 offset4">
                 <a class="brand cluster-name" href="#">
                   {{#if App.upgradeInProgress}}
                     {{#if App.router.mainAdminStackAndUpgradeController.isDowngrade}}
@@ -139,6 +140,10 @@
                     {{/if}}
                   {{/if}}
                 </a>
+                </p>
+                {{#if App.router.mainAdminStackAndUpgradeController.isFinalizeItem}}
+                  <p class="span10 alert alert-warning">{{t admin.stackVersions.version.upgrade.notFinalized.warning}}</p>
+                {{/if}}
               {{/if}}
             </div>
           </div>

+ 4 - 0
ambari-web/app/utils/ajax/ajax.js

@@ -1501,6 +1501,10 @@ var urls = {
     'real': '/clusters/{clusterName}/upgrades/{id}?fields=Upgrade',
     'mock': '/data/stack_versions/upgrade.json'
   },
+  'admin.upgrade.finalizeContext': {
+    'real': '/clusters/{clusterName}/upgrades/{id}?upgrade_groups/upgrade_items/UpgradeItem/status=HOLDING&fields=upgrade_groups/upgrade_items/UpgradeItem/context',
+    'mock': '/data/stack_versions/upgrade.json'
+  },
   'admin.upgrade.upgrade_item': {
     'real': '/clusters/{clusterName}/upgrades/{upgradeId}/upgrade_groups/{groupId}/upgrade_items/{stageId}?fields=' +
     'UpgradeItem/group_id,' +

+ 1 - 1
ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js

@@ -174,7 +174,7 @@ App.upgradeWizardView = Em.View.extend({
    * @type {boolean}
    */
   isFinalizeItem: function () {
-    return this.get('manualItem.context') === 'Confirm Finalize';
+    return this.get('manualItem.context') === this.get('controller.finalizeContext');
   }.property('manualItem.context'),
 
   /**

+ 90 - 1
ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js

@@ -274,7 +274,6 @@ describe('App.MainAdminStackAndUpgradeController', function() {
     });
   });
 
-
   describe("#runPreUpgradeCheck()", function() {
     before(function () {
       sinon.stub(App.ajax, 'send', Em.K);
@@ -1122,4 +1121,94 @@ describe('App.MainAdminStackAndUpgradeController', function() {
     });
 
   });
+
+  describe('#updateFinalize', function () {
+
+    beforeEach(function() {
+      sinon.stub($, 'ajax', Em.K);
+      controller.set('isFinalizeItem', true);
+    });
+
+    afterEach(function () {
+      $.ajax.restore();
+    });
+
+    it('should do ajax-request', function () {
+      sinon.stub(App, 'get').withArgs('upgradeState').returns('HOLDING');
+      controller.updateFinalize();
+      App.get.restore();
+      expect($.ajax.calledOnce).to.be.true;
+    });
+
+    it('shouldn\'t do ajax-request', function () {
+      sinon.stub(App, 'get').withArgs('upgradeState').returns('HOLDING_TIMEDOUT');
+      controller.updateFinalize();
+      App.get.restore();
+      expect(controller.get('isFinalizeItem')).to.be.false;
+      expect($.ajax.calledOnce).to.be.false;
+    });
+
+  });
+
+  describe('#updateFinalizeSuccessCallback', function () {
+
+    it('data exists and Finalize should be true', function() {
+      var data = {
+        upgrade_groups: [
+          {
+            upgrade_items: [
+              {
+                UpgradeItem: {
+                  context: controller.get('finalizeContext'),
+                  status: "HOLDING"
+                }
+              }
+            ]
+          }
+        ]
+      };
+      controller.set('isFinalizeItem', false);
+      controller.updateFinalizeSuccessCallback(data);
+      expect(controller.get('isFinalizeItem')).to.be.true;
+    });
+
+    it('data exists and Finalize should be false', function() {
+      var data = {
+        upgrade_groups: [
+          {
+            upgrade_items: [
+              {
+                UpgradeItem: {
+                  context: '!@#$%^&',
+                  status: "HOLDING"
+                }
+              }
+            ]
+          }
+        ]
+      };
+      controller.set('isFinalizeItem', true);
+      controller.updateFinalizeSuccessCallback(data);
+      expect(controller.get('isFinalizeItem')).to.be.false;
+    });
+
+    it('data doesn\'t exist', function() {
+      var data = null;
+      controller.set('isFinalizeItem', true);
+      controller.updateFinalizeSuccessCallback(data);
+      expect(controller.get('isFinalizeItem')).to.be.false;
+    });
+
+  });
+
+  describe('#updateFinalizeErrorCallback', function () {
+
+    it('should set isFinalizeItem to false', function () {
+      controller.set('isFinalizeItem', true);
+      controller.updateFinalizeErrorCallback();
+      expect(controller.get('isFinalizeItem')).to.be.false;
+    });
+
+  });
+
 });

+ 2 - 1
ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js

@@ -26,6 +26,7 @@ describe('App.upgradeWizardView', function () {
   });
   view.reopen({
     controller: Em.Object.create({
+      finalizeContext: 'Confirm Finalize',
       upgradeData: Em.Object.create(),
       loadUpgradeData: Em.K,
       setUpgradeItemStatus: Em.K,
@@ -422,7 +423,7 @@ describe('App.upgradeWizardView', function () {
   });
 
   describe("#isFinalizeItem", function () {
-    it("", function () {
+    it("depends of manualItem.context", function () {
       view.reopen({
         manualItem: {
           context: 'Confirm Finalize'