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> + <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> - <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; - }); - }); - }); });
