You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by al...@apache.org on 2015/09/11 19:07:10 UTC
ambari git commit: AMBARI-13076. Incorrect UI behaviour if host
registration request fails (alexantonenko)
Repository: ambari
Updated Branches:
refs/heads/trunk 7c2dd3944 -> 8cd6cfc6f
AMBARI-13076. Incorrect UI behaviour if host registration request fails (alexantonenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8cd6cfc6
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8cd6cfc6
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8cd6cfc6
Branch: refs/heads/trunk
Commit: 8cd6cfc6f01f224195a76e3ad362be41e69d17bb
Parents: 7c2dd39
Author: Alex Antonenko <hi...@gmail.com>
Authored: Fri Sep 11 18:41:45 2015 +0300
Committer: Alex Antonenko <hi...@gmail.com>
Committed: Fri Sep 11 18:41:45 2015 +0300
----------------------------------------------------------------------
.../app/controllers/wizard/step3_controller.js | 50 +++------
.../app/controllers/wizard/step9_controller.js | 40 +++----
ambari-web/app/mixins/common/reload_popup.js | 36 ++++++-
ambari-web/app/utils/polling.js | 41 +++----
.../test/controllers/wizard/step3_test.js | 6 +-
.../test/controllers/wizard/step6_test.js | 9 +-
.../test/controllers/wizard/step7_test.js | 6 +-
.../test/controllers/wizard/step8_test.js | 5 +
.../test/controllers/wizard/step9_test.js | 4 +-
.../test/mixins/common/reload_popup_test.js | 107 +++++++++++++++++++
10 files changed, 217 insertions(+), 87 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/app/controllers/wizard/step3_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step3_controller.js b/ambari-web/app/controllers/wizard/step3_controller.js
index 1e707c9..8905993 100644
--- a/ambari-web/app/controllers/wizard/step3_controller.js
+++ b/ambari-web/app/controllers/wizard/step3_controller.js
@@ -541,7 +541,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
* @return {$.ajax|null}
*/
doBootstrap: function () {
- var self = this;
if (this.get('stopBootstrap')) {
return null;
}
@@ -552,23 +551,14 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
sender: this,
data: {
bootRequestId: this.get('content.installOptions.bootRequestId'),
- numPolls: this.get('numPolls')
+ numPolls: this.get('numPolls'),
+ errorLogMessage: 'Bootstrap failed',
+ callback: this.doBootstrap,
+ shouldUseDefaultHandler: true
},
- success: 'doBootstrapSuccessCallback'
- }).
- retry({
- times: App.maxRetries,
- timeout: App.timeout
- }).
- then(
- function () {
- self.closeReloadPopup();
- },
- function () {
- self.showReloadPopup();
- console.log('Bootstrap failed');
- }
- );
+ success: 'doBootstrapSuccessCallback',
+ error: 'reloadErrorCallback'
+ });
},
/**
@@ -579,6 +569,7 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
doBootstrapSuccessCallback: function (data) {
var self = this;
var pollingInterval = 3000;
+ this.reloadSuccessCallback();
if (Em.isNone(data.hostsStatus)) {
console.log('Invalid response, setting timeout');
window.setTimeout(function () {
@@ -646,25 +637,17 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
if (this.get('stopBootstrap')) {
return null;
}
- var self = this;
return App.ajax.send({
name: 'wizard.step3.is_hosts_registered',
sender: this,
- success: 'isHostsRegisteredSuccessCallback'
- }).
- retry({
- times: App.maxRetries,
- timeout: App.timeout
- }).
- then(
- function () {
- self.closeReloadPopup();
- },
- function () {
- self.showReloadPopup();
- console.log('Error: Getting registered host information from the server');
- }
- );
+ success: 'isHostsRegisteredSuccessCallback',
+ error: 'reloadErrorCallback',
+ data: {
+ errorLogMessage: 'Error: Getting registered host information from the server',
+ callback: this.isHostsRegistered,
+ shouldUseDefaultHandler: true
+ }
+ });
},
/**
@@ -676,6 +659,7 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
console.log('registration attempt...');
var hosts = this.get('bootHosts');
var jsonData = data;
+ this.reloadSuccessCallback();
if (!jsonData) {
console.warn("Error: jsonData is null");
return;
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/app/controllers/wizard/step9_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step9_controller.js b/ambari-web/app/controllers/wizard/step9_controller.js
index abfb56a..bd1d173 100644
--- a/ambari-web/app/controllers/wizard/step9_controller.js
+++ b/ambari-web/app/controllers/wizard/step9_controller.js
@@ -1033,7 +1033,6 @@ App.WizardStep9Controller = Em.Controller.extend(App.ReloadPopupMixin, {
* @return {$.ajax|null}
*/
getLogsByRequest: function (polling, requestId) {
- var self = this;
return App.ajax.send({
name: 'wizard.step9.load_log',
sender: this,
@@ -1041,19 +1040,15 @@ App.WizardStep9Controller = Em.Controller.extend(App.ReloadPopupMixin, {
polling: polling,
cluster: this.get('content.cluster.name'),
requestId: requestId,
- numPolls: this.get('numPolls')
- },
- success: 'getLogsByRequestSuccessCallback',
- error: 'getLogsByRequestErrorCallback'
- }).retry({times: App.maxRetries, timeout: 3000}).then(
- function () {
- self.closeReloadPopup();
+ numPolls: this.get('numPolls'),
+ callback: this.getLogsByRequest,
+ args: [polling, requestId],
+ timeout: 3000,
+ errorLogMessage: 'Install services all retries failed'
},
- function () {
- self.showReloadPopup();
- console.log('Install services all retries failed');
- }
- );
+ success: 'reloadSuccessCallback',
+ error: 'reloadErrorCallback'
+ });
},
/**
@@ -1061,10 +1056,11 @@ App.WizardStep9Controller = Em.Controller.extend(App.ReloadPopupMixin, {
* @param {object} data
* @param {object} opt
* @param {object} params
- * @method getLogsByRequestSuccessCallback
+ * @method reloadSuccessCallback
*/
- getLogsByRequestSuccessCallback: function (data, opt, params) {
+ reloadSuccessCallback: function (data, opt, params) {
var parsedData = jQuery.parseJSON(data);
+ this._super();
console.log("TRACE: In success function for the GET logs data");
console.log("TRACE: Step9 -> The value is: ", parsedData);
this.set('isPolling', params.polling);
@@ -1073,10 +1069,18 @@ App.WizardStep9Controller = Em.Controller.extend(App.ReloadPopupMixin, {
/**
* Error-callback for get log by request
- * @method getLogsByRequestErrorCallback
+ * @param {object} jqXHR
+ * @param {string} ajaxOptions
+ * @param {string} error
+ * @param {object} opt
+ * @param {object} params
+ * @method reloadErrorCallback
*/
- getLogsByRequestErrorCallback: function () {
- this.loadLogData(true);
+ reloadErrorCallback: function (jqXHR, ajaxOptions, error, opt, params) {
+ this._super(jqXHR, ajaxOptions, error, opt, params);
+ if (jqXHR.status) {
+ this.loadLogData(true);
+ }
},
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/app/mixins/common/reload_popup.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/reload_popup.js b/ambari-web/app/mixins/common/reload_popup.js
index 539d1d5..1a2a9be 100644
--- a/ambari-web/app/mixins/common/reload_popup.js
+++ b/ambari-web/app/mixins/common/reload_popup.js
@@ -20,8 +20,39 @@ var App = require('app');
App.ReloadPopupMixin = Em.Mixin.create({
+ retryCount: 0,
+
reloadPopup: null,
+ reloadSuccessCallback: function () {
+ this.closeReloadPopup();
+ },
+
+ reloadErrorCallback: function (jqXHR, ajaxOptions, error, opt, params) {
+ if (jqXHR.status) {
+ if (params.errorLogMessage) {
+ console.log(params.errorLogMessage);
+ }
+ this.closeReloadPopup();
+ if (params.shouldUseDefaultHandler) {
+ App.ajax.defaultErrorHandler(jqXHR, opt.url, opt.method, jqXHR.status);
+ }
+ } else {
+ var times = Em.isNone(params.times) ? App.get('maxRetries') : params.times,
+ timeout = Em.isNone(params.timeout) ? App.get('timeout') : params.timeout;
+ this.showReloadPopup();
+ if (this.get('retryCount') < times) {
+ if (params.callback) {
+ var self = this;
+ window.setTimeout(function () {
+ params.callback.apply(self, params.args || []);
+ }, timeout);
+ }
+ this.incrementProperty('retryCount');
+ }
+ }
+ },
+
showReloadPopup: function () {
var self = this;
if (!this.get('reloadPopup')) {
@@ -35,7 +66,10 @@ App.ReloadPopupMixin = Em.Mixin.create({
this.t('app.reloadPopup.link') + "</a></div>",
encodeBody: false,
onClose: function () {
- self.set('reloadPopup', null);
+ self.setProperties({
+ reloadPopup: null,
+ retryCount: 0
+ });
this._super();
}
}));
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/app/utils/polling.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/polling.js b/ambari-web/app/utils/polling.js
index 339efcf..7442a31 100644
--- a/ambari-web/app/utils/polling.js
+++ b/ambari-web/app/utils/polling.js
@@ -151,34 +151,26 @@ App.Poll = Em.Object.extend(App.ReloadPopupMixin, {
*/
startPolling: function () {
if (!this.get('requestId')) return false;
- var self = this;
this.pollTaskLog();
App.ajax.send({
name: 'background_operations.get_by_request',
sender: this,
data: {
- requestId: this.get('requestId')
+ requestId: this.get('requestId'),
+ callback: this.startPolling,
+ errorLogMessage: 'Install services all retries failed'
},
- success: 'startPollingSuccessCallback',
- error: 'startPollingErrorCallback'
- })
- .retry({times: App.maxRetries, timeout: App.timeout})
- .then(
- function () {
- self.closeReloadPopup();
- },
- function () {
- self.showReloadPopup();
- console.log('Install services all retries failed');
- }
- );
+ success: 'reloadSuccessCallback',
+ error: 'reloadErrorCallback'
+ });
return true;
},
- startPollingSuccessCallback: function (data) {
+ reloadSuccessCallback: function (data) {
var self = this;
var result = this.parseInfo(data);
+ this._super();
if (!result) {
window.setTimeout(function () {
self.startPolling();
@@ -186,12 +178,15 @@ App.Poll = Em.Object.extend(App.ReloadPopupMixin, {
}
},
- startPollingErrorCallback: function (request, ajaxOptions, error) {
- console.log("TRACE: In error function for the GET data");
- console.log("TRACE: value of the url is: " + url);
- console.log("TRACE: error code status is: " + request.status);
- if (!this.get('isSuccess')) {
- this.set('isError', true);
+ reloadErrorCallback: function (request, ajaxOptions, error, opt, params) {
+ this._super(request, ajaxOptions, error, opt, params);
+ if (request.status) {
+ console.log("TRACE: In error function for the GET data");
+ console.log("TRACE: value of the url is: " + url);
+ console.log("TRACE: error code status is: " + request.status);
+ if (!this.get('isSuccess')) {
+ this.set('isError', true);
+ }
}
},
@@ -244,8 +239,6 @@ App.Poll = Em.Object.extend(App.ReloadPopupMixin, {
parseInfo: function (polledData) {
console.log('TRACE: Entering task info function');
- var self = this;
- var totalProgress = 0;
var tasksData = polledData.tasks;
console.log("The value of tasksData is: ", tasksData);
if (!tasksData) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/test/controllers/wizard/step3_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step3_test.js b/ambari-web/test/controllers/wizard/step3_test.js
index aede550..6cab32a 100644
--- a/ambari-web/test/controllers/wizard/step3_test.js
+++ b/ambari-web/test/controllers/wizard/step3_test.js
@@ -811,11 +811,7 @@ describe('App.WizardStep3Controller', function () {
describe('#isHostsRegistered', function () {
beforeEach(function () {
- sinon.stub(App.ajax, 'send', function () {
- return {retry: function () {
- return {then: Em.K}
- }}
- });
+ sinon.stub(App.ajax, 'send', Em.K);
});
afterEach(function () {
App.ajax.send.restore();
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/test/controllers/wizard/step6_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step6_test.js b/ambari-web/test/controllers/wizard/step6_test.js
index cc53d6f..b5630c6 100644
--- a/ambari-web/test/controllers/wizard/step6_test.js
+++ b/ambari-web/test/controllers/wizard/step6_test.js
@@ -47,6 +47,7 @@ var controller,
describe('App.WizardStep6Controller', function () {
beforeEach(function () {
+ sinon.stub(console, 'error', Em.K);
controller = App.WizardStep6Controller.create();
controller.set('content', Em.Object.create({
hosts: {},
@@ -71,6 +72,10 @@ describe('App.WizardStep6Controller', function () {
});
+ afterEach(function () {
+ console.error.restore();
+ });
+
describe('#isAddHostWizard', function () {
it('true if content.controllerName is addHostController', function () {
controller.set('content.controllerName', 'addHostController');
@@ -289,7 +294,7 @@ describe('App.WizardStep6Controller', function () {
};
controller.set('content.hosts', hosts);
controller.set('content.masterComponentHosts', masterComponentHosts);
- controller.set('content.recommendations', recommendations)
+ controller.set('content.recommendations', recommendations);
controller.set('headers', headers);
controller.render();
expect(controller.get('isLoaded')).to.equal(true);
@@ -485,7 +490,7 @@ describe('App.WizardStep6Controller', function () {
])
})
])
- })
+ });
controller.updateValidationsSuccessCallback(validationData);
expect(controller.get('generalErrorMessages').length).to.equal(0);
expect(controller.get('generalWarningMessages').length).to.equal(0);
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/test/controllers/wizard/step7_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js
index 8bf9ca7..d60dc15 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -106,10 +106,12 @@ describe('App.InstallerStep7Controller', function () {
serviceConfigProperties: []
}
});
+ sinon.stub(console, 'error', Em.K);
});
afterEach(function() {
App.config.setPreDefinedServiceConfigs.restore();
+ console.error.restore();
});
describe('#installedServiceNames', function () {
@@ -288,7 +290,7 @@ describe('App.InstallerStep7Controller', function () {
site1: true,
site3: true
};
- var siteToTagMap = installerStep7Controller._createSiteToTagMap(desired_configs,sites)
+ var siteToTagMap = installerStep7Controller._createSiteToTagMap(desired_configs,sites);
expect(siteToTagMap).to.eql({
site1: "tag1",
site3: "tag3"
@@ -520,7 +522,7 @@ describe('App.InstallerStep7Controller', function () {
desired_configs: desired_configs
}
};
- var siteToTagMap = installerStep7Controller.getConfigTagsSuccess(data)
+ var siteToTagMap = installerStep7Controller.getConfigTagsSuccess(data);
expect(installerStep7Controller.get('serviceConfigTags')).to.eql([
{
"siteName": "site1",
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/test/controllers/wizard/step8_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step8_test.js b/ambari-web/test/controllers/wizard/step8_test.js
index 5317f07..f1784e3 100644
--- a/ambari-web/test/controllers/wizard/step8_test.js
+++ b/ambari-web/test/controllers/wizard/step8_test.js
@@ -60,6 +60,11 @@ describe('App.WizardStep8Controller', function () {
configs: configs
});
configurationController = App.MainServiceInfoConfigsController.create({});
+ sinon.stub(console, 'error', Em.K);
+ });
+
+ afterEach(function () {
+ console.error.restore();
});
var siteObjTests = Em.A([
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/test/controllers/wizard/step9_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step9_test.js b/ambari-web/test/controllers/wizard/step9_test.js
index 80982cb..414867f 100644
--- a/ambari-web/test/controllers/wizard/step9_test.js
+++ b/ambari-web/test/controllers/wizard/step9_test.js
@@ -1318,10 +1318,10 @@ describe('App.InstallerStep9Controller', function () {
describe('#startPolling', function () {
beforeEach(function () {
- sinon.stub(c, 'getLogsByRequestErrorCallback', Em.K);
+ sinon.stub(c, 'reloadErrorCallback', Em.K);
});
afterEach(function () {
- c.getLogsByRequestErrorCallback.restore();
+ c.reloadErrorCallback.restore();
});
it('should set isSubmitDisabled to true', function () {
c.set('isSubmitDisabled', false);
http://git-wip-us.apache.org/repos/asf/ambari/blob/8cd6cfc6/ambari-web/test/mixins/common/reload_popup_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/reload_popup_test.js b/ambari-web/test/mixins/common/reload_popup_test.js
index 28c865a..1018983 100644
--- a/ambari-web/test/mixins/common/reload_popup_test.js
+++ b/ambari-web/test/mixins/common/reload_popup_test.js
@@ -51,9 +51,116 @@ describe('App.ReloadPopupMixin', function () {
describe('#closeReloadPopup', function () {
it('should hide modal popup', function () {
+ obj.set('retryCount', 1);
obj.showReloadPopup();
obj.closeReloadPopup();
expect(obj.get('reloadPopup')).to.be.null;
+ expect(obj.get('retryCount')).to.equal(0);
+ });
+
+ });
+
+ describe('#reloadSuccessCallback', function () {
+
+ it('should hide modal popup', function () {
+ obj.set('retryCount', 1);
+ obj.showReloadPopup();
+ obj.reloadSuccessCallback();
+ expect(obj.get('reloadPopup')).to.be.null;
+ expect(obj.get('retryCount')).to.equal(0);
+ });
+
+ });
+
+ describe('#reloadErrorCallback', function () {
+
+ var cases = [
+ {
+ args: [{status: 404}, null, null, {}, {shouldUseDefaultHandler: true}],
+ closeReloadPopupCallCount: 1,
+ consoleLogCallCount: 0,
+ defaultErrorHandlerCallCount: 1,
+ showReloadPopupCallCount: 0,
+ setTimeoutCount: 0,
+ title: 'status received, no console message, default error handler'
+ },
+ {
+ args: [{status: 404}, null, null, {}, {errorLogMessage: 'error'}],
+ closeReloadPopupCallCount: 1,
+ consoleLogCallCount: 1,
+ defaultErrorHandlerCallCount: 0,
+ showReloadPopupCallCount: 0,
+ setTimeoutCount: 0,
+ title: 'status received, console message displayed, no default error handler'
+ },
+ {
+ args: [{status: 0}, null, null, {}, {times: 5}],
+ retryCount: 5,
+ retryCountResult: 5,
+ closeReloadPopupCallCount: 0,
+ consoleLogCallCount: 0,
+ defaultErrorHandlerCallCount: 0,
+ showReloadPopupCallCount: 1,
+ setTimeoutCount: 0,
+ title: 'no status received, custom retries count, max retries reached'
+ },
+ {
+ args: [{status: 0}, null, null, {}, {}],
+ retryCount: 2,
+ retryCountResult: 3,
+ closeReloadPopupCallCount: 0,
+ consoleLogCallCount: 0,
+ defaultErrorHandlerCallCount: 0,
+ showReloadPopupCallCount: 1,
+ setTimeoutCount: 0,
+ title: 'no status received, default retries count, max retries not reached, no callback'
+ },
+ {
+ args: [{status: 0}, null, null, {}, {callback: Em.K}],
+ retryCount: 2,
+ retryCountResult: 3,
+ closeReloadPopupCallCount: 0,
+ consoleLogCallCount: 0,
+ defaultErrorHandlerCallCount: 0,
+ showReloadPopupCallCount: 1,
+ setTimeoutCount: 1,
+ title: 'no status received, default retries count, max retries not reached, callback specified'
+ }
+ ];
+
+ beforeEach(function () {
+ sinon.stub(obj, 'closeReloadPopup', Em.K);
+ sinon.stub(console, 'log', Em.K);
+ sinon.stub(App.ajax, 'defaultErrorHandler', Em.K);
+ sinon.stub(obj, 'showReloadPopup', Em.K);
+ sinon.stub(App, 'get').withArgs('maxRetries').returns(3);
+ sinon.stub(window, 'setTimeout', Em.K);
+ });
+
+ afterEach(function () {
+ obj.closeReloadPopup.restore();
+ console.log.restore();
+ App.ajax.defaultErrorHandler.restore();
+ obj.showReloadPopup.restore();
+ App.get.restore();
+ window.setTimeout.restore();
+ });
+
+ cases.forEach(function (item) {
+ it(item.title, function () {
+ if (!Em.isNone(item.retryCount)) {
+ obj.set('retryCount', item.retryCount);
+ }
+ obj.reloadErrorCallback.apply(obj, item.args);
+ expect(obj.closeReloadPopup.callCount).to.equal(item.closeReloadPopupCallCount);
+ expect(console.log.callCount).to.equal(item.consoleLogCallCount);
+ expect(App.ajax.defaultErrorHandler.callCount).to.equal(item.defaultErrorHandlerCallCount);
+ expect(obj.showReloadPopup.callCount).to.equal(item.showReloadPopupCallCount);
+ expect(window.setTimeout.callCount).to.equal(item.setTimeoutCount);
+ if (!Em.isNone(item.retryCountResult)) {
+ obj.set('retryCount', item.retryCountResult);
+ }
+ });
});
});