AMBARI-18773 Upgrade Options popup: no handling for the case of failed request 
for supported upgrade types. (atkach)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8d6924df
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8d6924df
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8d6924df

Branch: refs/heads/branch-feature-AMBARI-18634
Commit: 8d6924df2c59307da9e395b03a984c26a1e813d5
Parents: 512905d
Author: Andrii Tkach <[email protected]>
Authored: Wed Nov 2 17:17:50 2016 +0200
Committer: Andrii Tkach <[email protected]>
Committed: Wed Nov 2 17:17:50 2016 +0200

----------------------------------------------------------------------
 .../main/admin/stack_and_upgrade_controller.js  |  48 +++++++-
 ambari-web/app/messages.js                      |   3 +
 ambari-web/app/styles/application.less          |   4 +
 ambari-web/app/templates/common/modal_popup.hbs |   6 +-
 .../admin/stack_upgrade/upgrade_options.hbs     | 110 +++++++++++--------
 ambari-web/app/views/common/modal_popup.js      |   4 +-
 .../admin/stack_and_upgrade_controller_test.js  |  34 +++++-
 .../utils/configs/config_initializer_test.js    |  18 ---
 8 files changed, 151 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js 
b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index 32b2d73..3c69b84 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -107,6 +107,17 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
   serviceCheckFailuresServicenames: [],
 
   /**
+   * @type {boolean}
+   * @default false
+   */
+  isUpgradeTypesLoaded: false,
+
+  /**
+   * @type {string}
+   */
+  getSupportedUpgradeError: '',
+
+  /**
    * methods through which cluster could be upgraded, "allowed" indicated if 
the method is allowed
    * by stack upgrade path
    * @type {Array}
@@ -930,7 +941,8 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
             self.runUpgradeMethodChecks(version);
           }
       }).always(function () {
-          self.set('runningCheckRequests', 
runningCheckRequests.rejectProperty('type', 'ALL'));
+        self.set('isUpgradeTypesLoaded', true);
+        self.set('runningCheckRequests', 
runningCheckRequests.rejectProperty('type', 'ALL'));
         });
       request.type = 'ALL';
       this.get('runningCheckRequests').push(request);
@@ -938,10 +950,21 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
 
     return App.ModalPopup.show({
       encodeBody: false,
-      primary: isInUpgradeWizard ? Em.I18n.t('ok') : 
Em.I18n.t('common.proceed'),
+      primary: function() {
+        return isInUpgradeWizard || 
this.get('controller.getSupportedUpgradeError')
+               ? Em.I18n.t('ok')
+               : Em.I18n.t('common.proceed')
+      }.property('controller.getSupportedUpgradeError'),
+      secondary: function() {
+        return this.get('controller.getSupportedUpgradeError') ? null : 
Em.I18n.t('common.cancel');
+      }.property('controller.getSupportedUpgradeError'),
       primaryClass: 'btn-success',
       classNames: ['upgrade-options-popup'],
       header: 
Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.header'),
+      controller: this,
+      showFooter: function() {
+        return this.get('controller.isUpgradeTypesLoaded');
+      }.property('controller.isUpgradeTypesLoaded'),
       bodyClass: Em.View.extend({
         templateName: 
require('templates/main/admin/stack_upgrade/upgrade_options'),
         didInsertElement: function () {
@@ -1039,7 +1062,7 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
       skipComponentFailures: 
self.get('failuresTolerance.skipComponentFailures'),
       skipSCFailures: self.get('failuresTolerance.skipSCFailures'),
       disablePrimary: function () {
-        if (isInUpgradeWizard) return false;
+        if (isInUpgradeWizard || 
this.get('controller.getSupportedUpgradeError')) return false;
         var selectedMethod = this.get('selectedMethod');
         if (selectedMethod) {
           if (App.get('supports.preUpgradeCheck')) {
@@ -1136,11 +1159,14 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
    * send request to get available upgrade tye names
    */
   getSupportedUpgradeTypes: function(data) {
+    this.set('isUpgradeTypesLoaded', false);
+    this.set('getSupportedUpgradeError', '');
     return App.ajax.send({
       name: "admin.upgrade.get_supported_upgradeTypes",
       sender: this,
       data: data,
-      success: "getSupportedUpgradeTypesSuccess"
+      success: "getSupportedUpgradeTypesSuccess",
+      error: "getSupportedUpgradeTypesError"
     });
   },
 
@@ -1156,6 +1182,20 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
   },
 
   /**
+   * error callback of <code>getSupportedUpgradeTypes()</code>
+   * @param xhr {object}
+   */
+  getSupportedUpgradeTypesError: function (xhr) {
+    var response;
+    try {
+      response = JSON.parse(xhr.responseText);
+    } catch (e) {
+      response = {message: xhr.statusText};
+    }
+    this.set('getSupportedUpgradeError', response.message);
+  },
+
+  /**
    * success callback of <code>runPreUpgradeCheckOnly()</code>
    * Show a message how many fails/warnings/bypass/passed
    * on clicking that message a popup window show up

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 45dfc2c..e26d2bb 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1703,6 +1703,9 @@ Em.I18n.translations = {
   'admin.stackVersions.version.upgrade.upgradeOptions.notAllowed':'Not allowed 
by the current version',
   'admin.stackVersions.version.upgrade.upgradeOptions.EU.confirm.msg': 'You 
are about to perform an <b>Express Upgrade</b> from <b>{0}</b> to <b>{1}</b>. 
This will incur cluster downtime. Are you sure you want to proceed?',
   'admin.stackVersions.version.upgrade.upgradeOptions.RU.confirm.msg': 'You 
are about to perform a <b>Rolling Upgrade</b> from <b>{0}</b> to <b>{1}</b>. 
Are you sure you want to proceed?',
+  'admin.stackVersions.version.upgrade.upgradeOptions.error': 'Could not 
proceed with upgrade:',
+  'admin.stackVersions.version.upgrade.upgradeOptions.loading': 'Checking for 
supported upgrade types...',
+
   'admin.stackVersions.version.upgrade.alertsWarning': 'Cluster alerts will 
still be visible and recorded in Ambari but notifications (such as Email and 
SNMP) will be suppressed during the upgrade.',
 
   'admin.stackVersions.version.column.showDetails': "Show Details",

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less 
b/ambari-web/app/styles/application.less
index d0eebce..e1ca6aa 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -134,6 +134,10 @@ table.diff {
   line-height: 30px;
 }
 
+.spinner-text {
+  line-height: @spinner-default-height;
+}
+
 .heatmap-select-metric-btn, .heatmap-select-metric-btn:focus {
   font-size: 13px;
   padding: 10px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/app/templates/common/modal_popup.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/modal_popup.hbs 
b/ambari-web/app/templates/common/modal_popup.hbs
index 67801f1..863eb44 100644
--- a/ambari-web/app/templates/common/modal_popup.hbs
+++ b/ambari-web/app/templates/common/modal_popup.hbs
@@ -55,13 +55,13 @@
         {{else}}
           <div class="modal-footer">
             {{#if view.third}}
-              <button {{bindAttr disabled="view.disableThird" class=":btn 
:btn-default view.thirdClass"}} {{action onThird 
target="view"}}>{{view.third}}</button>
+              <button {{bindAttr disabled="view.disableThird" class=":btn 
view.thirdClass"}} {{action onThird target="view"}}>{{view.third}}</button>
             {{/if}}
             {{#if view.secondary}}
-              <button {{bindAttr disabled="view.disableSecondary" class=":btn 
:btn-default view.secondaryClass"}} {{action onSecondary 
target="view"}}>{{view.secondary}}</button>
+              <button {{bindAttr disabled="view.disableSecondary" class=":btn 
view.secondaryClass"}} {{action onSecondary 
target="view"}}>{{view.secondary}}</button>
             {{/if}}
             {{#if view.primary}}
-              <button {{bindAttr disabled="view.disablePrimary" class=":btn 
:btn-default view.primaryClass"}} {{action onPrimary 
target="view"}}>{{view.primary}}</button>
+              <button {{bindAttr disabled="view.disablePrimary" class=":btn 
view.primaryClass"}} {{action onPrimary 
target="view"}}>{{view.primary}}</button>
             {{/if}}
           </div>
         {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_options.hbs
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_options.hbs 
b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_options.hbs
index d13f95f..18fcfcf 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_options.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_options.hbs
@@ -16,57 +16,73 @@
 * limitations under the License.
 }}
 
-<div id="upgrade-options-popup-content">
-  <div class="text version-text">{{{view.versionText}}}</div>
-  <div class="text method-text">{{t 
admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.method}}</div>
-  <div {{bindAttr class=":row :method-options 
view.isInUpgradeWizard:disabled"}}>
-    {{#each method in view.upgradeMethods}}
-      <div class="method-option col-md-6">
-        <div {{bindAttr class="method.allowed::not-allowed 
method.allowed::not-allowed-by-version
+{{#if view.parentView.controller.isUpgradeTypesLoaded}}
+    {{#if view.parentView.controller.getSupportedUpgradeError}}
+        <i class="glyphicon glyphicon-remove"/>{{t 
admin.stackVersions.version.upgrade.upgradeOptions.error}}
+        <pre>{{view.parentView.controller.getSupportedUpgradeError}}</pre>
+    {{else}}
+      <div id="upgrade-options-popup-content">
+        <div class="text version-text">{{{view.versionText}}}</div>
+        <div class="text method-text">{{t 
admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.method}}</div>
+        <div {{bindAttr class=":row :method-options 
view.isInUpgradeWizard:disabled"}}>
+            {{#each method in view.upgradeMethods}}
+              <div class="method-option col-md-6">
+                <div {{bindAttr class="method.allowed::not-allowed 
method.allowed::not-allowed-by-version
           method.isPrecheckFailed:not-allowed 
method.isPrecheckFailed:check-failed
           method.selected:selected method.type :img-thumbnail"}}
-          {{action selectMethod method target="view"}}>
-            <div {{bindAttr class="method.icon :method-icon"}}></div>
-            <div class="method-name">{{method.displayName}}</div>
-            <div class="method-description">{{{method.description}}}</div>
-            {{#if view.showPreUpgradeChecks}}
-              {{#if method.isCheckRequestInProgress}}
-                <div class="method-precheck-message checking">
-                  {{view App.SpinnerView 
message="admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.checking"}}
+                    {{action selectMethod method target="view"}}>
+                  <div {{bindAttr class="method.icon :method-icon"}}></div>
+                  <div class="method-name">{{method.displayName}}</div>
+                  <div 
class="method-description">{{{method.description}}}</div>
+                    {{#if view.showPreUpgradeChecks}}
+                        {{#if method.isCheckRequestInProgress}}
+                          <div class="method-precheck-message checking">
+                              {{view App.SpinnerView 
message="admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.checking"}}
+                          </div>
+                        {{else}}
+                          <div {{bindAttr class=":method-precheck-message 
method.precheckResultsMessageClass"}}>
+                            <i {{bindAttr 
class="method.precheckResultsMessageIconClass"}}></i>
+                            <b>{{method.precheckResultsTitle}}</b>&nbsp;
+                            <a {{action runAction method target="view"}}>
+                                {{method.precheckResultsMessage}}
+                            </a>
+                              {{#if method.bypassedFailures}}
+                                <div
+                                  class="alert-danger">{{t 
admin.stackVersions.version.upgrade.upgradeOptions.errors_bypassed}}</div>
+                              {{/if}}
+                          </div>
+                        {{/if}}
+                    {{/if}}
                 </div>
-              {{else}}
-                <div {{bindAttr class=":method-precheck-message 
method.precheckResultsMessageClass"}}>
-                  <i {{bindAttr 
class="method.precheckResultsMessageIconClass"}}></i>
-                  <b>{{method.precheckResultsTitle}}</b>&nbsp;
-                  <a {{action runAction method target="view"}}>
-                    {{method.precheckResultsMessage}}
-                  </a>
-                  {{#if method.bypassedFailures}}
-                    <div class="alert-danger">{{t 
admin.stackVersions.version.upgrade.upgradeOptions.errors_bypassed}}</div>
-                  {{/if}}
-                </div>
-              {{/if}}
-            {{/if}}
+              </div>
+            {{/each}}
         </div>
-      </div>
-    {{/each}}
-  </div>
 
-  <div class="text tolerance-text">{{t 
admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.tolerance}}
-    <i class="glyphicon glyphicon-question-sign failure-tolerance-tooltip" 
data-toggle="tooltip"></i>
-    <div>
-        {{view App.CheckboxView
-          labelClassNames="tolerance-option"
-          
labelTranslate="admin.stackVersions.version.upgrade.upgradeOptions.tolerance.option2"
-          checkedBinding="view.parentView.skipSCFailures"}}
-    </div>
-    <div>
-      {{view App.CheckboxView
-        labelClassNames="tolerance-option"
-        
labelTranslate="admin.stackVersions.version.upgrade.upgradeOptions.tolerance.option1"
-        checkedBinding="view.parentView.skipComponentFailures"
-      }}
+        <div class="text tolerance-text">{{t 
admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.tolerance}}
+          <i class="glyphicon glyphicon-question-sign 
failure-tolerance-tooltip" data-toggle="tooltip"></i>
+
+          <div>
+              {{view App.CheckboxView
+              labelClassNames="tolerance-option"
+              
labelTranslate="admin.stackVersions.version.upgrade.upgradeOptions.tolerance.option2"
+              checkedBinding="view.parentView.skipSCFailures"}}
+          </div>
+          <div>
+              {{view App.CheckboxView
+              labelClassNames="tolerance-option"
+              
labelTranslate="admin.stackVersions.version.upgrade.upgradeOptions.tolerance.option1"
+              checkedBinding="view.parentView.skipComponentFailures"
+              }}
+          </div>
+        </div>
+        <div class="alert alert-warning">{{t 
admin.stackVersions.version.upgrade.alertsWarning}}</div>
+      </div>
+    {{/if}}
+{{else}}
+  <div class="row">
+    <div class="col-md-1 col-md-offset-3">{{view App.SpinnerView}}</div>
+    <div class="col-md-8 spinner-text">
+      {{t admin.stackVersions.version.upgrade.upgradeOptions.loading}}
     </div>
   </div>
-  <div class="alert alert-warning">{{t 
admin.stackVersions.version.upgrade.alertsWarning}}</div>
-</div>
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/app/views/common/modal_popup.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/modal_popup.js 
b/ambari-web/app/views/common/modal_popup.js
index f9ee2ae..d5e033a 100644
--- a/ambari-web/app/views/common/modal_popup.js
+++ b/ambari-web/app/views/common/modal_popup.js
@@ -36,8 +36,8 @@ App.ModalPopup = Ember.View.extend({
   disableSecondary: false,
   disableThird: false,
   primaryClass: 'btn-success',
-  secondaryClass: '',
-  thirdClass: '',
+  secondaryClass: 'btn-default',
+  thirdClass: 'btn-default',
   modalDialogClassesStr: function () {
     var modalDialogClasses = this.get('modalDialogClasses');
     if (!Em.isArray(modalDialogClasses)) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js 
b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
index 7fc183b..21def14 100644
--- 
a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
+++ 
b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
@@ -2670,16 +2670,28 @@ describe('App.MainAdminStackAndUpgradeController', 
function() {
 
   describe("#getSupportedUpgradeTypes()", function () {
 
-    it("App.ajax.send should be called", function() {
+    beforeEach(function() {
       controller.getSupportedUpgradeTypes({});
+    });
+
+    it("App.ajax.send should be called", function() {
       var args = testHelpers.findAjaxRequest('name', 
'admin.upgrade.get_supported_upgradeTypes');
       expect(args[0]).to.be.eql({
         name: "admin.upgrade.get_supported_upgradeTypes",
         sender: controller,
         data: {},
-        success: "getSupportedUpgradeTypesSuccess"
+        success: "getSupportedUpgradeTypesSuccess",
+        error: "getSupportedUpgradeTypesError"
       });
     });
+
+    it("getSupportedUpgradeError should be empty", function() {
+      expect(controller.get('getSupportedUpgradeError')).to.be.empty;
+    });
+
+    it("isUpgradeTypesLoaded should be false", function() {
+      expect(controller.get('isUpgradeTypesLoaded')).to.be.false;
+    });
   });
 
   describe("#getSupportedUpgradeTypesSuccess()", function () {
@@ -2732,6 +2744,24 @@ describe('App.MainAdminStackAndUpgradeController', 
function() {
     });
   });
 
+  describe("#getSupportedUpgradeTypesError", function () {
+
+    it("correct responseText", function() {
+      controller.getSupportedUpgradeTypesError({responseText: JSON.stringify({
+        message: 'error'
+      })});
+      expect(controller.get('getSupportedUpgradeError')).to.be.equal('error');
+    });
+
+    it("invalid responseText", function() {
+      controller.getSupportedUpgradeTypesError({
+        responseText: '',
+        statusText: 'statusError'
+      });
+      
expect(controller.get('getSupportedUpgradeError')).to.be.equal('statusError');
+    });
+  });
+
   describe("#runPreUpgradeCheckOnlySuccess()", function () {
 
     beforeEach(function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8d6924df/ambari-web/test/utils/configs/config_initializer_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/configs/config_initializer_test.js 
b/ambari-web/test/utils/configs/config_initializer_test.js
index 833794c..ceed065 100644
--- a/ambari-web/test/utils/configs/config_initializer_test.js
+++ b/ambari-web/test/utils/configs/config_initializer_test.js
@@ -950,22 +950,4 @@ describe('App.ConfigInitializer', function () {
     });
 
   });
-
-  describe('winReplacersMap', function () {
-
-    var winReplacersMap = App.ConfigInitializer.get('winReplacersMap');
-    var winReplacerNames = Em.keys(winReplacersMap).map(function (key) {
-      return winReplacersMap[key];
-    });
-
-    it('should contains only unique methods', function () {
-      expect(winReplacerNames.length).to.equal(winReplacerNames.uniq().length);
-    });
-
-    winReplacerNames.forEach(function (name) {
-      it(name, function () {
-        expect(App.ConfigInitializer[name]).to.be.a.function;
-      });
-    });
-  });
 });

Reply via email to