You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2015/02/19 14:54:29 UTC
ambari git commit: AMBARI-9701. User may navigate to dashboard on the
not installed cluster (onechiporenko)
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 <on...@apache.org>
Authored: Thu Feb 19 15:40:58 2015 +0200
Committer: Oleg Nechiporenko <on...@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