AMBARI-13447 Redirect to Admin View after navigating to Install Wizard. (atkach)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c402daed Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c402daed Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c402daed Branch: refs/heads/branch-dev-patch-upgrade Commit: c402daed925c8b1f6085cca154fa737567b377ba Parents: 1076ec7 Author: Andrii Tkach <[email protected]> Authored: Fri Oct 16 13:42:09 2015 +0300 Committer: Andrii Tkach <[email protected]> Committed: Fri Oct 16 13:42:09 2015 +0300 ---------------------------------------------------------------------- ambari-web/app/router.js | 116 +++++++++++------- ambari-web/test/router_test.js | 238 ++++++++++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/c402daed/ambari-web/app/router.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/router.js b/ambari-web/app/router.js index 462ae66..934d434 100644 --- a/ambari-web/app/router.js +++ b/ambari-web/app/router.js @@ -313,57 +313,81 @@ App.Router = Em.Router.extend({ }, + /** + * success callback of login request + * @param {object} clustersData + * @param {object} opt + * @param {object} params + */ loginGetClustersSuccessCallback: function (clustersData, opt, params) { - var loginController = this.get('loginController'); - var loginData = params.loginData; - var privileges = loginData.privileges || []; + var privileges = params.loginData.privileges || []; var router = this; - var permissionList = privileges.mapProperty('PrivilegeInfo.permission_name'); - var isAdmin = permissionList.contains('AMBARI.ADMIN'); - var transitionToApp = false; - if (isAdmin) { - App.set('isAdmin', true); - if (clustersData.items.length) { - router.setClusterInstalled(clustersData); - transitionToApp = true; - } else { - App.ajax.send({ - name: 'ambari.service.load_server_version', - sender: this, - success: 'adminViewInfoSuccessCallback' - }); - } + var isAdmin = privileges.mapProperty('PrivilegeInfo.permission_name').contains('AMBARI.ADMIN'); + + App.set('isAdmin', isAdmin); + + if (clustersData.items.length) { + var clusterPermissions = privileges. + filterProperty('PrivilegeInfo.cluster_name', clustersData.items[0].Clusters.cluster_name). + mapProperty('PrivilegeInfo.permission_name'); + + //cluster installed + router.setClusterInstalled(clustersData); + if (clusterPermissions.contains('CLUSTER.OPERATE')) { + App.setProperties({ + isAdmin: true, + isOperator: true + }); + } + if (isAdmin || clusterPermissions.contains('CLUSTER.READ') || clusterPermissions.contains('CLUSTER.OPERATE')) { + router.transitionToApp(); } else { - if (clustersData.items.length) { - router.setClusterInstalled(clustersData); - //TODO: Iterate over clusters - var clusterName = clustersData.items[0].Clusters.cluster_name; - var clusterPermissions = privileges.filterProperty('PrivilegeInfo.cluster_name', clusterName).mapProperty('PrivilegeInfo.permission_name'); - if (clusterPermissions.contains('CLUSTER.OPERATE')) { - App.setProperties({ - isAdmin: true, - isOperator: true - }); - transitionToApp = true; - } else if (clusterPermissions.contains('CLUSTER.READ')) { - transitionToApp = true; - } - } + router.transitionToViews(); } - App.set('isPermissionDataLoaded', true); - if (transitionToApp) { - if (!router.restorePreferedPath()) { - router.getSection(function (route) { - router.transitionTo(route); - loginController.postLogin(true, true); - }); - } + } else { + if (isAdmin) { + router.transitionToAdminView(); } else { - App.router.get('mainViewsController').loadAmbariViews(); - router.transitionTo('main.views.index'); - loginController.postLogin(true,true); + router.transitionToViews(); } + } + App.set('isPermissionDataLoaded', true); + App.router.get('userSettingsController').dataLoading(); }, + + /** + * redirect user to Admin View + * @returns {$.ajax} + */ + transitionToAdminView: function() { + return App.ajax.send({ + name: 'ambari.service.load_server_version', + sender: this, + success: 'adminViewInfoSuccessCallback', + error: 'adminViewInfoErrorCallback' + }); + }, + + /** + * redirect user to application Dashboard + */ + transitionToApp: function () { + var router = this; + if (!router.restorePreferedPath()) { + router.getSection(function (route) { + router.transitionTo(route); + }); + } + }, + + /** + * redirect user to application Views + */ + transitionToViews: function() { + App.router.get('mainViewsController').loadAmbariViews(); + this.transitionTo('main.views.index'); + }, + adminViewInfoSuccessCallback: function(data) { var components = Em.get(data,'components'); if (Em.isArray(components)) { @@ -378,6 +402,10 @@ App.Router = Em.Router.extend({ } }, + adminViewInfoErrorCallback: function() { + this.transitionToViews(); + }, + getSection: function (callback) { if (App.get('testMode')) { if (App.alwaysGoToInstaller) { http://git-wip-us.apache.org/repos/asf/ambari/blob/c402daed/ambari-web/test/router_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/router_test.js b/ambari-web/test/router_test.js index 9122b54..057a13f 100644 --- a/ambari-web/test/router_test.js +++ b/ambari-web/test/router_test.js @@ -208,4 +208,242 @@ describe('App.Router', function () { expect(router.get('preferedPath')).to.be.null; }); }); + + describe("#loginGetClustersSuccessCallback()", function () { + var mock = {dataLoading: Em.K}; + beforeEach(function () { + sinon.stub(router, 'setClusterInstalled'); + sinon.stub(router, 'transitionToApp'); + sinon.stub(router, 'transitionToViews'); + sinon.stub(router, 'transitionToAdminView'); + sinon.stub(App.router, 'get').returns(mock); + sinon.spy(mock, 'dataLoading'); + App.setProperties({ + isAdmin: false, + isOperator: false, + isPermissionDataLoaded: false + }); + }); + afterEach(function () { + router.setClusterInstalled.restore(); + router.transitionToApp.restore(); + router.transitionToViews.restore(); + router.transitionToAdminView.restore(); + App.router.get.restore(); + mock.dataLoading.restore(); + }); + it("cluster exists, OPERATOR privileges", function () { + var clusterData = { + items: [{ + Clusters: { + cluster_name: 'c1' + } + }] + }; + var params = { + loginData: { + privileges: [{ + PrivilegeInfo: { + cluster_name: 'c1', + permission_name: 'CLUSTER.OPERATE' + } + }] + } + }; + router.loginGetClustersSuccessCallback(clusterData, {}, params); + expect(router.setClusterInstalled.calledWith(clusterData)).to.be.true; + expect(router.transitionToApp.calledOnce).to.be.true; + expect(App.get('isAdmin')).to.be.true; + expect(App.get('isOperator')).to.be.true; + expect(App.get('isPermissionDataLoaded')).to.be.true; + expect(mock.dataLoading.calledOnce).to.be.true; + }); + it("cluster exists, READ privileges", function () { + var clusterData = { + items: [{ + Clusters: { + cluster_name: 'c1' + } + }] + }; + var params = { + loginData: { + privileges: [{ + PrivilegeInfo: { + cluster_name: 'c1', + permission_name: 'CLUSTER.READ' + } + }] + } + }; + router.loginGetClustersSuccessCallback(clusterData, {}, params); + expect(router.setClusterInstalled.calledWith(clusterData)).to.be.true; + expect(router.transitionToApp.calledOnce).to.be.true; + expect(App.get('isAdmin')).to.be.false; + expect(App.get('isOperator')).to.be.false; + expect(App.get('isPermissionDataLoaded')).to.be.true; + expect(mock.dataLoading.calledOnce).to.be.true; + }); + it("cluster exists, ADMIN privileges", function () { + var clusterData = { + items: [{ + Clusters: { + cluster_name: 'c1' + } + }] + }; + var params = { + loginData: { + privileges: [{ + PrivilegeInfo: { + cluster_name: 'c1', + permission_name: 'AMBARI.ADMIN' + } + }] + } + }; + router.loginGetClustersSuccessCallback(clusterData, {}, params); + expect(router.setClusterInstalled.calledWith(clusterData)).to.be.true; + expect(router.transitionToApp.calledOnce).to.be.true; + expect(App.get('isAdmin')).to.be.true; + expect(App.get('isOperator')).to.be.false; + expect(App.get('isPermissionDataLoaded')).to.be.true; + expect(mock.dataLoading.calledOnce).to.be.true; + }); + it("cluster exists, no privileges", function () { + var clusterData = { + items: [{ + Clusters: { + cluster_name: 'c1' + } + }] + }; + var params = { + loginData: { + privileges: [] + } + }; + router.loginGetClustersSuccessCallback(clusterData, {}, params); + expect(router.setClusterInstalled.calledWith(clusterData)).to.be.true; + expect(router.transitionToViews.calledOnce).to.be.true; + expect(App.get('isAdmin')).to.be.false; + expect(App.get('isOperator')).to.be.false; + expect(App.get('isPermissionDataLoaded')).to.be.true; + expect(mock.dataLoading.calledOnce).to.be.true; + }); + it("cluster not installed, ADMIN privileges", function () { + var clusterData = { + items: [] + }; + var params = { + loginData: { + privileges: [{ + PrivilegeInfo: { + cluster_name: 'c1', + permission_name: 'AMBARI.ADMIN' + } + }] + } + }; + router.loginGetClustersSuccessCallback(clusterData, {}, params); + expect(router.transitionToAdminView.calledOnce).to.be.true; + expect(App.get('isAdmin')).to.be.true; + expect(App.get('isOperator')).to.be.false; + expect(App.get('isPermissionDataLoaded')).to.be.true; + expect(mock.dataLoading.calledOnce).to.be.true; + }); + it("cluster not installed, non-admin privileges", function () { + var clusterData = { + items: [] + }; + var params = { + loginData: { + privileges: [] + } + }; + router.loginGetClustersSuccessCallback(clusterData, {}, params); + expect(router.transitionToViews.calledOnce).to.be.true; + expect(App.get('isAdmin')).to.be.false; + expect(App.get('isOperator')).to.be.false; + expect(App.get('isPermissionDataLoaded')).to.be.true; + expect(mock.dataLoading.calledOnce).to.be.true; + }); + }); + + describe("#transitionToAdminView()", function () { + beforeEach(function () { + sinon.stub(App.ajax, 'send'); + }); + afterEach(function () { + App.ajax.send.restore(); + }); + it("", function () { + router.transitionToAdminView(); + expect(App.ajax.send.calledWith({ + name: 'ambari.service.load_server_version', + sender: router, + success: 'adminViewInfoSuccessCallback', + error: 'adminViewInfoErrorCallback' + })).to.be.true; + }); + }); + + describe("#transitionToApp()", function () { + beforeEach(function () { + this.mock = sinon.stub(router, 'restorePreferedPath'); + sinon.stub(router, 'getSection', function (callback) { + callback('route'); + }); + sinon.stub(router, 'transitionTo'); + }); + afterEach(function () { + this.mock.restore(); + router.getSection.restore(); + router.transitionTo.restore(); + }); + it("has restore path", function () { + this.mock.returns(true); + router.transitionToApp(); + expect(router.getSection.called).to.be.false; + expect(router.transitionTo.called).to.be.false; + }); + it("does not have restore path", function () { + this.mock.returns(false); + router.transitionToApp(); + expect(router.getSection.calledOnce).to.be.true; + expect(router.transitionTo.calledWith('route')).to.be.true; + }); + }); + + describe("#transitionToViews()", function () { + var mock = {loadAmbariViews: Em.K}; + beforeEach(function () { + sinon.stub(App.router, 'get').returns(mock); + sinon.stub(router, 'transitionTo'); + sinon.spy(mock, 'loadAmbariViews'); + }); + afterEach(function () { + App.router.get.restore(); + router.transitionTo.restore(); + mock.loadAmbariViews.restore(); + }); + it("", function () { + router.transitionToViews(); + expect(mock.loadAmbariViews.calledOnce).to.be.true; + expect(router.transitionTo.calledWith('main.views.index')).to.be.true; + }); + }); + + describe("#adminViewInfoErrorCallback()", function () { + beforeEach(function () { + sinon.stub(router, 'transitionToViews'); + }); + afterEach(function () { + router.transitionToViews.restore(); + }); + it("", function () { + router.adminViewInfoErrorCallback(); + expect(router.transitionToViews.calledOnce).to.be.true; + }); + }); });
