Repository: ambari Updated Branches: refs/heads/trunk 01aff40b9 -> 9fd4a0ccc
AMBARI-9701. User may navigate to dashboard on the not installed cluster (onechiporenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9fd4a0cc Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9fd4a0cc Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9fd4a0cc Branch: refs/heads/trunk Commit: 9fd4a0ccc2744ab989e15029096e1e2e4f59f635 Parents: 01aff40 Author: Oleg Nechiporenko <onechipore...@apache.org> Authored: Thu Feb 19 15:40:58 2015 +0200 Committer: Oleg Nechiporenko <onechipore...@apache.org> Committed: Thu Feb 19 15:40:58 2015 +0200 ---------------------------------------------------------------------- ambari-web/app/assets/test/tests.js | 1 + ambari-web/app/mixins.js | 1 + ambari-web/app/mixins/routers/redirections.js | 87 +++++++++++++ ambari-web/app/routes/installer.js | 49 ++------ ambari-web/app/routes/main.js | 13 +- .../test/mixins/routers/redirections_test.js | 125 +++++++++++++++++++ 6 files changed, 234 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/9fd4a0cc/ambari-web/app/assets/test/tests.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js index f9b3f18..048f2e5 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -132,6 +132,7 @@ var files = ['test/init_model_test', 'test/mixins/common/serverValidator_test', 'test/mixins/common/table_server_view_mixin_test', 'test/mixins/main/host/details/host_components/decommissionable_test', + 'test/mixins/routers/redirections_test', 'test/mixins/wizard/addSeccurityConfigs_test', 'test/mixins/wizard/wizard_menu_view_test', 'test/mixins/wizard/wizardProgressPageController_test', http://git-wip-us.apache.org/repos/asf/ambari/blob/9fd4a0cc/ambari-web/app/mixins.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins.js b/ambari-web/app/mixins.js index 4ac2dce..c17e58c 100644 --- a/ambari-web/app/mixins.js +++ b/ambari-web/app/mixins.js @@ -26,6 +26,7 @@ require('mixins/common/serverValidator'); require('mixins/common/table_server_view_mixin'); require('mixins/common/table_server_mixin'); require('mixins/main/host/details/host_components/decommissionable'); +require('mixins/routers/redirections'); require('mixins/wizard/wizardProgressPageController'); require('mixins/wizard/wizardDeployProgressController'); require('mixins/wizard/wizardProgressPageView'); http://git-wip-us.apache.org/repos/asf/ambari/blob/9fd4a0cc/ambari-web/app/mixins/routers/redirections.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/routers/redirections.js b/ambari-web/app/mixins/routers/redirections.js new file mode 100644 index 0000000..574cc5c --- /dev/null +++ b/ambari-web/app/mixins/routers/redirections.js @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var App = require('app'); + +/** + * Mixin for routers which may redirect user to the some cluster installer steps + * Based on cluster state + * @type {Em.Mixin} + */ +App.RouterRedirections = Em.Mixin.create({ + + /** + * List of cluster statuses when it's not installed + * @type {string[]} + */ + installerStatuses: ['CLUSTER_NOT_CREATED_1', 'CLUSTER_DEPLOY_PREP_2', 'CLUSTER_INSTALLING_3', 'SERVICE_STARTING_3', 'CLUSTER_INSTALLED_4'], + + /** + * Redirect user to the proper installer step if needed + * Based on cluster state: + * 1. CLUSTER_NOT_CREATED_1 - to current step + * 2. CLUSTER_DEPLOY_PREP_2 - to step 8 + * 3. CLUSTER_INSTALLING_3/SERVICE_STARTING_3 - to step 9 + * 4. CLUSTER_INSTALLED_4 - to step 10 + * @param {Em.Router} router + * @param {Object} currentClusterStatus + * @param {Boolean} isOnInstaller true - user is on the cluster installer, false - something else + * @method redirectToInstaller + */ + redirectToInstaller: function (router, currentClusterStatus, isOnInstaller) { + + var installerController = router.get('installerController'); + var path = isOnInstaller ? '' : 'installer.'; + switch (currentClusterStatus.clusterState) { + case 'CLUSTER_NOT_CREATED_1' : + var localDb = currentClusterStatus.localdb; + if (localDb && localDb.Installer && localDb.Installer.currentStep) { + App.db.data = currentClusterStatus.localdb; + App.get('router').setAuthenticated(true); + var controllerName = installerController.get('name'); + var suffixLength = 10; + var currentStep = App.get('router').getWizardCurrentStep(controllerName.substr(0, controllerName.length - suffixLength)); + installerController.setCurrentStep(currentStep); + } + router.transitionTo(path + 'step' + installerController.get('currentStep')); + break; + case 'CLUSTER_DEPLOY_PREP_2' : + installerController.setCurrentStep('8'); + App.db.data = currentClusterStatus.localdb; + App.get('router').setAuthenticated(true); + router.transitionTo(path + 'step' + installerController.get('currentStep')); + break; + case 'CLUSTER_INSTALLING_3' : + case 'SERVICE_STARTING_3' : + if (!installerController.get('isStep9')) { + installerController.setCurrentStep('9'); + } + router.transitionTo(path + 'step' + installerController.get('currentStep')); + break; + case 'CLUSTER_INSTALLED_4' : + if (!installerController.get('isStep10')) { + installerController.setCurrentStep('10'); + } + App.db.data = currentClusterStatus.localdb; + App.get('router').setAuthenticated(true); + router.transitionTo(path + 'step' + installerController.get('currentStep')); + break; + } + } + +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/9fd4a0cc/ambari-web/app/routes/installer.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/installer.js b/ambari-web/app/routes/installer.js index 57fe93a..7c24e38 100644 --- a/ambari-web/app/routes/installer.js +++ b/ambari-web/app/routes/installer.js @@ -18,12 +18,13 @@ var App = require('app'); -module.exports = Em.Route.extend({ +module.exports = Em.Route.extend(App.RouterRedirections, { route: '/installer', App: require('app'), enter: function (router) { console.log('in /installer:enter'); + var self = this; App.clusterStatus.set('wizardControllerName', App.router.get('installerController.name')); @@ -42,51 +43,17 @@ module.exports = Em.Route.extend({ router.get('mainController').stopPolling(); console.log('In installer with successful authenticated'); console.log('current step=' + router.get('installerController.currentStep')); - Ember.run.next(function () { - var installerController = router.get('installerController'); + Em.run.next(function () { App.clusterStatus.updateFromServer().complete(function () { var currentClusterStatus = App.clusterStatus.get('value'); //@TODO: Clean up following states. Navigation should be done solely via currentStep stored in the localDb and API persist endpoint. // Actual currentStep value for the installer controller should always remain in sync with localdb and at persist store in the server. if (currentClusterStatus) { - switch (currentClusterStatus.clusterState) { - case 'CLUSTER_NOT_CREATED_1' : - var localDb = currentClusterStatus.localdb; - if (localDb && localDb.Installer && localDb.Installer.currentStep) { - App.db.data = currentClusterStatus.localdb; - App.router.setAuthenticated(true); - var controllerName = installerController.get('name'); - var suffixLength = 10; - var currentStep = App.get('router').getWizardCurrentStep(controllerName.substr(0, controllerName.length - suffixLength)); - installerController.setCurrentStep(currentStep); - } - router.transitionTo('step' + installerController.get('currentStep')); - break; - case 'CLUSTER_DEPLOY_PREP_2' : - installerController.setCurrentStep('8'); - App.db.data = currentClusterStatus.localdb; - App.router.setAuthenticated(true); - router.transitionTo('step' + installerController.get('currentStep')); - break; - case 'CLUSTER_INSTALLING_3' : - case 'SERVICE_STARTING_3' : - if (!installerController.get('isStep9')) { - installerController.setCurrentStep('9'); - } - router.transitionTo('step' + installerController.get('currentStep')); - break; - case 'CLUSTER_INSTALLED_4' : - if (!installerController.get('isStep10')) { - installerController.setCurrentStep('10'); - } - App.db.data = currentClusterStatus.localdb; - App.router.setAuthenticated(true); - router.transitionTo('step' + installerController.get('currentStep')); - break; - case 'DEFAULT' : - default: - router.transitionTo('main.dashboard.index'); - break; + if (self.get('installerStatuses').contains(currentClusterStatus.clusterState)) { + self.redirectToInstaller(router, currentClusterStatus, true); + } + else { + router.transitionTo('main.dashboard.index'); } } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/9fd4a0cc/ambari-web/app/routes/main.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/main.js b/ambari-web/app/routes/main.js index 8175370..6ad614d 100644 --- a/ambari-web/app/routes/main.js +++ b/ambari-web/app/routes/main.js @@ -19,11 +19,12 @@ var App = require('app'); var stringUtils = require('utils/string_utils'); -module.exports = Em.Route.extend({ +module.exports = Em.Route.extend(App.RouterRedirections, { route: '/main', enter: function (router) { App.db.updateStorage(); console.log('in /main:enter'); + var self = this; router.getAuthenticated().done(function (loggedIn) { if (loggedIn) { var applicationController = App.router.get('applicationController'); @@ -42,6 +43,16 @@ module.exports = Em.Route.extend({ }); } else { + Em.run.next(function () { + App.clusterStatus.updateFromServer().complete(function () { + var currentClusterStatus = App.clusterStatus.get('value'); + if (currentClusterStatus) { + if (self.get('installerStatuses').contains(currentClusterStatus.clusterState)) { + self.redirectToInstaller(router, currentClusterStatus, false); + } + } + }); + }); App.router.get('clusterController').set('isLoaded', true); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/9fd4a0cc/ambari-web/test/mixins/routers/redirections_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/mixins/routers/redirections_test.js b/ambari-web/test/mixins/routers/redirections_test.js new file mode 100644 index 0000000..7b3eed7 --- /dev/null +++ b/ambari-web/test/mixins/routers/redirections_test.js @@ -0,0 +1,125 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var App = require('app'); + +var route, installerController, currentClusterStatus; + +describe('App.Redirections', function () { + + beforeEach(function () { + + installerController = Em.Object.create({ + currentStep: '', + setCurrentStep: function (k) { + this.set('currentStep', k); + } + }); + + router = Em.Object.create(App.RouterRedirections, { + transitionTo: Em.K, + setAuthenticated: Em.K, + installerController: installerController + }); + + currentClusterStatus = {}; + + sinon.spy(router, 'transitionTo'); + sinon.spy(router, 'setAuthenticated'); + sinon.stub(App, 'get').withArgs('router').returns(router); + + }); + + afterEach(function () { + router.transitionTo.restore(); + router.setAuthenticated.restore(); + App.get.restore(); + currentClusterStatus = {}; + }); + + describe('#redirectToInstaller', function () { + + it('CLUSTER_NOT_CREATED_1. user is on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_NOT_CREATED_1'; + installerController.set('currentStep', '4'); + router.redirectToInstaller(router, currentClusterStatus, true); + expect(router.transitionTo.calledWith('step4')).to.be.true; + }); + + it('CLUSTER_NOT_CREATED_1. user is not on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_NOT_CREATED_1'; + installerController.set('currentStep', '4'); + router.redirectToInstaller(router, currentClusterStatus, false); + expect(router.transitionTo.calledWith('installer.step4')).to.be.true; + }); + + it('CLUSTER_DEPLOY_PREP_2. user is on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_DEPLOY_PREP_2'; + router.redirectToInstaller(router, currentClusterStatus, true); + expect(router.transitionTo.calledWith('step8')).to.be.true; + expect(router.setAuthenticated.calledWith(true)).to.be.true; + }); + + it('CLUSTER_DEPLOY_PREP_2. user is not on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_DEPLOY_PREP_2'; + router.redirectToInstaller(router, currentClusterStatus, false); + expect(router.transitionTo.calledWith('installer.step8')).to.be.true; + expect(router.setAuthenticated.calledWith(true)).to.be.true; + }); + + it('CLUSTER_INSTALLING_3. user is on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_INSTALLING_3'; + router.redirectToInstaller(router, currentClusterStatus, true); + expect(router.transitionTo.calledWith('step9')).to.be.true; + }); + + it('CLUSTER_INSTALLING_3. user is not on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_INSTALLING_3'; + router.redirectToInstaller(router, currentClusterStatus, false); + expect(router.transitionTo.calledWith('installer.step9')).to.be.true; + }); + + it('SERVICE_STARTING_3. user is on installer', function () { + currentClusterStatus.clusterState = 'SERVICE_STARTING_3'; + router.redirectToInstaller(router, currentClusterStatus, true); + expect(router.transitionTo.calledWith('step9')).to.be.true; + }); + + it('SERVICE_STARTING_3. user is not on installer', function () { + currentClusterStatus.clusterState = 'SERVICE_STARTING_3'; + router.redirectToInstaller(router, currentClusterStatus, false); + expect(router.transitionTo.calledWith('installer.step9')).to.be.true; + }); + + it('CLUSTER_INSTALLED_4. user is on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_INSTALLED_4'; + router.redirectToInstaller(router, currentClusterStatus, true); + expect(router.transitionTo.calledWith('step10')).to.be.true; + expect(router.setAuthenticated.calledWith(true)).to.be.true; + }); + + it('CLUSTER_INSTALLED_4. user is not on installer', function () { + currentClusterStatus.clusterState = 'CLUSTER_INSTALLED_4'; + router.redirectToInstaller(router, currentClusterStatus, false); + expect(router.transitionTo.calledWith('installer.step10')).to.be.true; + expect(router.setAuthenticated.calledWith(true)).to.be.true; + }); + + }); + +}); \ No newline at end of file