浏览代码

AMBARI-13750. UI changes for 'Verifying Skipped Failures' stage. (xiwang via yusaku)

Yusaku Sako 9 年之前
父节点
当前提交
31e73c6c04

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

@@ -1526,6 +1526,12 @@ Em.I18n.translations = {
   'admin.stackUpgrade.dialog.inProgress': "Now Running:",
   'admin.stackUpgrade.dialog.inProgress': "Now Running:",
   'admin.stackUpgrade.dialog.keepRunning': "Keep running Upgrade in background",
   'admin.stackUpgrade.dialog.keepRunning': "Keep running Upgrade in background",
   'admin.stackUpgrade.dialog.failed': "Failed on:",
   'admin.stackUpgrade.dialog.failed': "Failed on:",
+  'admin.stackUpgrade.dialog.manual.slaveComponentFailures.title': "Slave Component Failures",
+  'admin.stackUpgrade.dialog.manual.slaveComponentFailures.msg1': "The following hosts failed to upgrade but were skipped:",
+  'admin.stackUpgrade.dialog.manual.slaveComponentFailures.msg2': "Before proceeding, Pause Upgrade and remove these hosts or manually upgrade them before proceeding.",
+  'admin.stackUpgrade.dialog.manual.serviceCheckFailures.title': "Service Check Failures",
+  'admin.stackUpgrade.dialog.manual.serviceCheckFailures.msg1': "The following service checks failed but were skipped:",
+  'admin.stackUpgrade.dialog.manual.serviceCheckFailures.msg2': "You have the option to Pause Upgrade and fix the above issue(s) before proceeding.",
   'admin.stackUpgrade.dialog.manual': "Manual steps required",
   'admin.stackUpgrade.dialog.manual': "Manual steps required",
   'admin.stackUpgrade.dialog.manualDone': "I have performed the manual steps above.",
   'admin.stackUpgrade.dialog.manualDone': "I have performed the manual steps above.",
   'admin.stackUpgrade.dialog.closeProgress': "Upgrade is in progress. \n If you dismiss this window, Upgrade will keep running in background.",
   'admin.stackUpgrade.dialog.closeProgress': "Upgrade is in progress. \n If you dismiss this window, Upgrade will keep running in background.",

+ 4 - 0
ambari-web/app/styles/stack_versions.less

@@ -267,6 +267,10 @@
   .task-list-main-warp i {
   .task-list-main-warp i {
     font-size: 16px;
     font-size: 16px;
   }
   }
+  ul.failed-info-list {
+    max-height: 500px;
+    margin-top: 5px;
+  }
   .upgrade-options-link {
   .upgrade-options-link {
     position: absolute;
     position: absolute;
     cursor: pointer;
     cursor: pointer;

+ 125 - 37
ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs

@@ -88,27 +88,23 @@
           </div>
           </div>
         {{/if}}
         {{/if}}
         {{#if view.manualItem}}
         {{#if view.manualItem}}
-          {{#if view.isFinalizeItem}}
+          {{#if view.isSlaveComponentFailuresItem}}
             <div class="box details-box">
             <div class="box details-box">
               <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
               <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
-              {{#if isDowngrade}}
-                <p>{{t admin.stackUpgrade.finalize.message.downgrade}}</p>
-              {{else}}
-                <p>{{t admin.stackUpgrade.finalize.message.upgrade}}</p>
-              {{/if}}
+              <p><strong>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.title}}</strong></p>
 
 
-              {{#if areSkippedServiceChecksLoaded}}
-                {{#if skippedServiceChecks.length}}
-                  <div>{{t admin.stackUpgrade.finalize.message.skippedServiceChecks}}</div>
-                  <ul>
-                    {{#each serviceName in skippedServiceChecks}}
-                      <li>{{serviceName}}</li>
+              {{#if areSlaveComponentFailuresHostsLoaded}}
+                {{#if slaveComponentFailuresHosts.length}}
+                  <div>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.msg1}}</div>
+                  <ul class="failed-info-list">
+                    {{#each hostName in slaveComponentFailuresHosts}}
+                      <li>{{hostName}}</li>
                     {{/each}}
                     {{/each}}
                   </ul>
                   </ul>
-                  <div>{{t admin.stackUpgrade.finalize.message.testServices}}</div>
+                  <div>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.msg2}}</div>
                 {{/if}}
                 {{/if}}
               {{else}}
               {{else}}
-                <div class="spinner"></div>
+                  <div class="spinner"></div>
               {{/if}}
               {{/if}}
 
 
               <label class="message">
               <label class="message">
@@ -117,37 +113,129 @@
               </label>
               </label>
               <div class="button-row">
               <div class="button-row">
                 {{#if view.isDowngradeAvailable}}
                 {{#if view.isDowngradeAvailable}}
-                  <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
+                    <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
+                {{/if}}
+                {{#if isDowngrade}}
+                    <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
+                {{else}}
+                    <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
                 {{/if}}
                 {{/if}}
-                <button class="btn" {{action pauseUpgrade target="view"}}>{{t admin.stackUpgrade.finalize.later}}</button>
-                <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
-                  {{t common.finalize}}
-                </button>
+                  <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
+                    {{t common.proceed}}
+                  </button>
               </div>
               </div>
             </div>
             </div>
           {{else}}
           {{else}}
-            <div class="box details-box">
-              <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
-              <p>{{view.manualItem.text}}</p>
+            {{#if view.isServiceCheckFailuresItem}}
+              <div class="box details-box">
+                <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
 
 
-              <label class="message">
-                {{view Em.Checkbox checkedBinding="view.isManualDone"}}
-                {{t admin.stackUpgrade.dialog.manualDone}}
-              </label>
-              <div class="button-row">
-                {{#if view.isDowngradeAvailable}}
-                  <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
-                {{/if}}
-                {{#if isDowngrade}}
-                  <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
+                {{#if areServiceCheckFailuresServicenamesLoaded}}
+                  {{#if serviceCheckFailuresServicenames.length}}
+                    <p><strong>{{t admin.stackUpgrade.dialog.manual.serviceCheckFailures.title}}</strong></p>
+                    <div>{{t admin.stackUpgrade.dialog.manual.serviceCheckFailures.msg1}}</div>
+                    <ul class="failed-info-list">
+                      {{#each serviceName in serviceCheckFailuresServicenames}}
+                        <li>{{serviceName}}</li>
+                      {{/each}}
+                    </ul>
+                    <div>{{t admin.stackUpgrade.dialog.manual.serviceCheckFailures.msg2}}</div>
+                  {{/if}}
+                  {{#if slaveComponentFailuresHosts.length}}
+                    <p><strong>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.title}}</strong></p>
+                    <div>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.msg1}}</div>
+                    <ul class="failed-info-list">
+                      {{#each hostName in slaveComponentFailuresHosts}}
+                        <li>{{hostName}}</li>
+                      {{/each}}
+                    </ul>
+                    <div>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.msg2}}</div>
+                  {{/if}}
                 {{else}}
                 {{else}}
-                  <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
+                    <div class="spinner"></div>
                 {{/if}}
                 {{/if}}
-                <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
-                  {{t common.proceed}}
-                </button>
+
+                <label class="message">
+                  {{view Em.Checkbox checkedBinding="view.isManualDone"}}
+                  {{t admin.stackUpgrade.dialog.manualDone}}
+                </label>
+                <div class="button-row">
+                  {{#if view.isDowngradeAvailable}}
+                      <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
+                  {{/if}}
+                  {{#if isDowngrade}}
+                      <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
+                  {{else}}
+                      <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
+                  {{/if}}
+                    <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
+                      {{t common.proceed}}
+                    </button>
+                </div>
               </div>
               </div>
-            </div>
+            {{else}}
+              {{#if view.isFinalizeItem}}
+                <div class="box details-box">
+                    <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
+                  {{#if isDowngrade}}
+                      <p>{{t admin.stackUpgrade.finalize.message.downgrade}}</p>
+                  {{else}}
+                      <p>{{t admin.stackUpgrade.finalize.message.upgrade}}</p>
+                  {{/if}}
+
+                  {{#if areSkippedServiceChecksLoaded}}
+                    {{#if skippedServiceChecks.length}}
+                      <div>{{t admin.stackUpgrade.finalize.message.skippedServiceChecks}}</div>
+                      <ul>
+                        {{#each serviceName in skippedServiceChecks}}
+                          <li>{{serviceName}}</li>
+                        {{/each}}
+                      </ul>
+                      <div>{{t admin.stackUpgrade.finalize.message.testServices}}</div>
+                    {{/if}}
+                  {{else}}
+                      <div class="spinner"></div>
+                  {{/if}}
+
+                    <label class="message">
+                      {{view Em.Checkbox checkedBinding="view.isManualDone"}}
+                      {{t admin.stackUpgrade.dialog.manualDone}}
+                    </label>
+                    <div class="button-row">
+                      {{#if view.isDowngradeAvailable}}
+                         <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
+                      {{/if}}
+                        <button class="btn" {{action pauseUpgrade target="view"}}>{{t admin.stackUpgrade.finalize.later}}</button>
+                        <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
+                          {{t common.finalize}}
+                        </button>
+                    </div>
+                </div>
+              {{else}}
+                <div class="box details-box">
+                  <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
+                  <p>{{view.manualItem.text}}</p>
+
+                  <label class="message">
+                    {{view Em.Checkbox checkedBinding="view.isManualDone"}}
+                    {{t admin.stackUpgrade.dialog.manualDone}}
+                  </label>
+                  <div class="button-row">
+                    {{#if view.isDowngradeAvailable}}
+                      <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
+                    {{/if}}
+                    {{#if isDowngrade}}
+                      <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
+                    {{else}}
+                      <button class="btn" {{action closeWizard target="view.parentView"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
+                    {{/if}}
+                      <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
+                        {{t common.proceed}}
+                      </button>
+                  </div>
+                </div>
+              {{/if}}
+            {{/if}}
           {{/if}}
           {{/if}}
         {{/if}}
         {{/if}}
         {{#if view.noActiveItem}}
         {{#if view.noActiveItem}}

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

@@ -1565,7 +1565,6 @@ var urls = {
     'upgrade_groups/upgrade_items/UpgradeItem/request_id,' +
     'upgrade_groups/upgrade_items/UpgradeItem/request_id,' +
     'upgrade_groups/upgrade_items/UpgradeItem/skippable,' +
     'upgrade_groups/upgrade_items/UpgradeItem/skippable,' +
     'upgrade_groups/upgrade_items/UpgradeItem/stage_id,' +
     'upgrade_groups/upgrade_items/UpgradeItem/stage_id,' +
-    'upgrade_groups/upgrade_items/UpgradeItem/status,' +
     'upgrade_groups/upgrade_items/UpgradeItem/text&' +
     'upgrade_groups/upgrade_items/UpgradeItem/text&' +
     'minimal_response=true',
     'minimal_response=true',
     'mock': '/data/stack_versions/upgrade.json'
     'mock': '/data/stack_versions/upgrade.json'

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

@@ -170,7 +170,35 @@ App.upgradeWizardView = Em.View.extend({
   }.property('activeGroup.upgradeItems.@each.status'),
   }.property('activeGroup.upgradeItems.@each.status'),
 
 
   /**
   /**
-   * indicate whether the step is Finalize
+   * Context for Slave component failures manual item
+   * @type {string}
+   */
+  slaveFailuresContext: "Check Component Versions",
+
+  /**
+   * Context for Service check (may include slave component) failures manual item
+   * @type {string}
+   */
+  serviceCheckFailuresContext: "Verifying Skipped Failures",
+
+  /**
+   * manualItem: indicate whether the step is "Slave component failures", a dialog with instructions will show up for manual steps
+   * @type {boolean}
+   */
+  isSlaveComponentFailuresItem: function () {
+    return this.get('manualItem.context') === this.get("slaveFailuresContext");
+  }.property('manualItem.context'),
+
+  /**
+   * manualItem: indicate whether the step is "Service check failures", a dialog with instructions will show up for manual steps
+   * @type {boolean}
+   */
+  isServiceCheckFailuresItem: function () {
+    return this.get('manualItem.context') === this.get("serviceCheckFailuresContext");
+  }.property('manualItem.context'),
+
+  /**
+   * manualItem: indicate whether the step is Finalize
    * @type {boolean}
    * @type {boolean}
    */
    */
   isFinalizeItem: function () {
   isFinalizeItem: function () {
@@ -285,6 +313,86 @@ App.upgradeWizardView = Em.View.extend({
     }
     }
   },
   },
 
 
+  getSlaveComponentFailureHosts: function() {
+    if (this.get('isSlaveComponentFailuresItem')) {
+      if (!this.get('controller.areSlaveComponentFailuresHostsLoaded')) {
+        var self = this;
+        var item = this.get('manualItem');
+        App.ajax.send({
+          name: 'admin.upgrade.upgrade_item',
+          sender: this,
+          data: {
+            upgradeId: item.get('request_id'),
+            groupId: item.get('group_id'),
+            stageId: item.get('stage_id')
+          },
+          success: 'getSlaveComponentFailureHostsSuccessCallback'
+        }).complete(function () {
+            self.set('controller.areSlaveComponentFailuresHostsLoaded', true);
+          });
+      }
+    } else {
+      this.set('controller.areSlaveComponentFailuresHostsLoaded', false);
+    }
+  }.observes('isSlaveComponentFailuresItem'),
+
+  getSlaveComponentFailureHostsSuccessCallback: function(data) {
+    var hostsNames = [];
+    if (data.tasks && data.tasks.length) {
+      data.tasks.forEach(function(task) {
+        if(task.Tasks && task.Tasks.structured_out) {
+          hostsNames = task.Tasks.structured_out.hosts;
+        }
+      });
+    }
+    this.set('controller.slaveComponentFailuresHosts', hostsNames.uniq());
+  },
+
+  getServiceCheckFailureServicenames: function() {
+    if (this.get('isServiceCheckFailuresItem')) {
+      if (!this.get('controller.areServiceCheckFailuresServicenamesLoaded')) {
+        var self = this;
+        var item = this.get('manualItem');
+        App.ajax.send({
+          name: 'admin.upgrade.upgrade_item',
+          sender: this,
+          data: {
+            upgradeId: item.get('request_id'),
+            groupId: item.get('group_id'),
+            stageId: item.get('stage_id')
+          },
+          success: 'getServiceCheckFailureServicenamesSuccessCallback'
+        }).complete(function () {
+            self.set('controller.areServiceCheckFailuresServicenamesLoaded', true);
+          });
+      }
+    } else {
+      this.set('controller.areServiceCheckFailuresServicenamesLoaded', false);
+    }
+  }.observes('isServiceCheckFailuresItem'),
+
+
+  /**
+   * Failures info may includes service_check and host_component failures. These two types should be displayed separately.
+   */
+  getServiceCheckFailureServicenamesSuccessCallback: function(data) {
+    var hostsNames = [], serviceNames = [];
+    if (data.tasks && data.tasks.length) {
+      data.tasks.forEach(function(task) {
+        if(task.Tasks && task.Tasks.structured_out && task.Tasks.structured_out.failures) {
+          serviceNames = task.Tasks.structured_out.failures.service_check || [];
+          if (task.Tasks.structured_out.failures.host_component) {
+            for (var hostname in task.Tasks.structured_out.failures.host_component){
+              hostsNames.push(hostname);
+            }
+          }
+        }
+      });
+    }
+    this.set('controller.serviceCheckFailuresServicenames', serviceNames.uniq());
+    this.set('controller.slaveComponentFailuresHosts', hostsNames.uniq());
+  },
+
   /**
   /**
    * start polling upgrade data
    * start polling upgrade data
    */
    */