Repository: ambari Updated Branches: refs/heads/trunk 20519ec85 -> b750cd8f2
AMBARI-6967. Admin View: default login behavior (route to Admin View, Cluster Dashboard, or Views Landing page). (yusaku) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/b750cd8f Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/b750cd8f Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/b750cd8f Branch: refs/heads/trunk Commit: b750cd8f22443cfb77e7849f6fe42dff400a6200 Parents: 20519ec Author: Yusaku Sako <yus...@hortonworks.com> Authored: Wed Aug 20 19:17:06 2014 -0700 Committer: Yusaku Sako <yus...@hortonworks.com> Committed: Wed Aug 20 19:22:30 2014 -0700 ---------------------------------------------------------------------- ambari-web/app/controllers.js | 1 - .../controllers/global/cluster_controller.js | 44 -------- ambari-web/app/controllers/main.js | 1 + .../app/controllers/main/views_controller.js | 80 +++++++++++++- ambari-web/app/mappers/users_mapper.js | 2 +- ambari-web/app/messages.js | 2 - ambari-web/app/router.js | 108 +++++++++++-------- ambari-web/app/routes/main.js | 22 ---- ambari-web/app/routes/views.js | 53 +++++++++ ambari-web/app/utils/ajax/ajax.js | 2 +- ambari-web/app/views/main/menu.js | 7 +- ambari-web/app/views/main/views_view.js | 4 +- ambari-web/test/mappers/users_mapper_test.js | 2 +- 13 files changed, 209 insertions(+), 119 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/controllers.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers.js b/ambari-web/app/controllers.js index 063af6a..c4a1001 100644 --- a/ambari-web/app/controllers.js +++ b/ambari-web/app/controllers.js @@ -54,7 +54,6 @@ require('controllers/main/admin/highAvailability/resourceManager/step4_controlle require('controllers/main/admin/repositories'); require('controllers/main/admin/stack_upgrade_controller'); require('controllers/main/admin/serviceAccounts_controller'); -require('controllers/main/admin/access_controller'); require('controllers/main/admin/advanced'); require('utils/polling'); require('controllers/main/admin/security'); http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/controllers/global/cluster_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js index d612039..3d14754 100644 --- a/ambari-web/app/controllers/global/cluster_controller.js +++ b/ambari-web/app/controllers/global/cluster_controller.js @@ -22,7 +22,6 @@ App.ClusterController = Em.Controller.extend({ name: 'clusterController', isLoaded: false, ambariProperties: null, - ambariViews: [], clusterDataLoadedPercent: 'width:0', // 0 to 1 isGangliaUrlLoaded: false, @@ -249,7 +248,6 @@ App.ClusterController = Em.Controller.extend({ loadClusterData: function () { var self = this; this.loadAmbariProperties(); - this.loadAmbariViews(); if (!App.get('clusterName')) { return; } @@ -349,48 +347,6 @@ App.ClusterController = Em.Controller.extend({ }, callback) }, - loadAmbariViews: function () { - App.ajax.send({ - name: 'views.info', - sender: this, - success: 'loadAmbariViewsSuccess' - }); - }, - - loadAmbariViewsSuccess: function (data) { - if (data.items.length) { - App.ajax.send({ - name: 'views.instances', - sender: this, - success: 'loadViewInstancesSuccess' - }); - } else { - this.set('ambariViews', []); - } - }, - - loadViewInstancesSuccess: function (data) { - this.set('ambariViews', []); - var self = this; - data.items.forEach(function (view) { - view.versions.forEach(function (version) { - version.instances.forEach(function (instance) { - var current_instance = Em.Object.create({ - iconPath: instance.ViewInstanceInfo.icon_path || "/img/ambari-view-default.png", - label: instance.ViewInstanceInfo.label || version.ViewVersionInfo.label || instance.ViewInstanceInfo.view_name, - visible: instance.ViewInstanceInfo.visible || false, - version: instance.ViewInstanceInfo.version, - description: instance.ViewInstanceInfo.description || Em.I18n.t('views.main.instance.noDescription'), - viewName: instance.ViewInstanceInfo.view_name, - instanceName: instance.ViewInstanceInfo.instance_name, - href: instance.ViewInstanceInfo.context_path - }); - self.get('ambariViews').pushObject(current_instance); - }, this); - }, this); - }, this); - }, - /** * * @param callback http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/controllers/main.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main.js b/ambari-web/app/controllers/main.js index 55db450..b5d83c4 100644 --- a/ambari-web/app/controllers/main.js +++ b/ambari-web/app/controllers/main.js @@ -44,6 +44,7 @@ App.MainController = Em.Controller.extend({ */ initialize: function(){ App.router.get('clusterController').loadClusterData(); + App.router.get('mainViewsController').loadAmbariViews(); }, dataLoading: function () { http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/controllers/main/views_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/views_controller.js b/ambari-web/app/controllers/main/views_controller.js index 5d64da6..687554b 100644 --- a/ambari-web/app/controllers/main/views_controller.js +++ b/ambari-web/app/controllers/main/views_controller.js @@ -21,9 +21,87 @@ var App = require('app'); App.MainViewsController = Em.Controller.extend({ name:'mainViewsController', + isDataLoaded: false, + + ambariViews: [], + + dataLoading: function () { + var viewsController = this; + var dfd = $.Deferred(); + if (this.get('isDataLoaded')) { + dfd.resolve(this.get('ambariViews')); + } else { + var interval = setInterval(function () { + if (viewsController.get('isDataLoaded')) { + dfd.resolve(viewsController.get('ambariViews')); + clearInterval(interval); + } + }, 50); + } + return dfd.promise(); + }, + + + loadAmbariViews: function () { + App.ajax.send({ + name: 'views.info', + sender: this, + success: 'loadAmbariViewsSuccess', + error: 'loadAmbariViewsError' + }); + }, + + loadAmbariViewsSuccess: function (data, opt, params) { + if (data.items.length) { + App.ajax.send({ + name: 'views.instances', + sender: this, + success: 'loadViewInstancesSuccess', + error: 'loadViewInstancesError' + }); + } else { + this.set('ambariViews', []); + this.set('isDataLoaded', true); + } + }, + + loadAmbariViewsError: function () { + this.set('ambariViews', []); + this.set('isDataLoaded', true); + }, + + loadViewInstancesSuccess: function (data, opt, params) { + this.set('ambariViews', []); + var instances = []; + data.items.forEach(function (view) { + view.versions.forEach(function (version) { + version.instances.forEach(function (instance) { + var current_instance = Em.Object.create({ + iconPath: instance.ViewInstanceInfo.icon_path || "/img/ambari-view-default.png", + label: instance.ViewInstanceInfo.label || version.ViewVersionInfo.label || instance.ViewInstanceInfo.view_name, + visible: instance.ViewInstanceInfo.visible || false, + version: instance.ViewInstanceInfo.version, + description: instance.ViewInstanceInfo.description || Em.I18n.t('views.main.instance.noDescription'), + viewName: instance.ViewInstanceInfo.view_name, + instanceName: instance.ViewInstanceInfo.instance_name, + href: instance.ViewInstanceInfo.context_path + }); + instances.push(current_instance); + }, this); + }, this); + }, this); + this.get('ambariViews').pushObjects(instances); + this.set('isDataLoaded', true); + }, + + loadViewInstancesError: function () { + this.set('ambariViews', []); + this.set('isDataLoaded', true); + }, + setView: function(event) { if(event.context){ - App.router.transitionTo('main.views.viewDetails', event.context); + App.router.transitionTo('views.viewDetails', event.context); } } }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/mappers/users_mapper.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/users_mapper.js b/ambari-web/app/mappers/users_mapper.js index 19b3098..0f86ef6 100644 --- a/ambari-web/app/mappers/users_mapper.js +++ b/ambari-web/app/mappers/users_mapper.js @@ -49,6 +49,6 @@ App.usersMapper = App.QuickDataMapper.create({ * @return {Boolean} **/ isAdmin: function(permissionList) { - return permissionList.indexOf('AMBARI.ADMIN') > -1 || permissionList.indexOf('CLUSTER.OPERATOR') > -1; + return permissionList.indexOf('AMBARI.ADMIN') > -1 || permissionList.indexOf('CLUSTER.OPERATE') > -1; } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index 989a657..869ef64 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -277,8 +277,6 @@ Em.I18n.translations = { 'popup.confirmationFeedBack.sending':'Sending...', 'popup.confirmationFeedBack.query.fail':'Request failed', - 'router.hadoopClusterNotSetUp':'Your administrator has not set up a Hadoop cluster yet.', - 'login.header':'Sign in', 'login.username':'Username', 'login.loginButton':'Sign in', http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/router.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/router.js b/ambari-web/app/router.js index 3b4fb07..5510434 100644 --- a/ambari-web/app/router.js +++ b/ambari-web/app/router.js @@ -168,22 +168,21 @@ App.Router = Em.Router.extend({ data: { userName: userName }, - success: 'getUserPrivilegesSuccess' + success: 'getUserPrivilegesSuccess', + error: 'getUserPrivilegesError' }); }, getUserPrivilegesSuccess: function() {}, + getUserPrivilegesError: function(req) { + console.log("Get user privileges error: " + req.statusCode); + }, + setUserLoggedIn: function(userName) { - var controller = this.get('loginController'), - self = this; this.setAuthenticated(true); this.setLoginName(userName); this.setUser(App.User.find().findProperty('id', userName)); - this.getSection(function(route){ - self.transitionTo(route); - controller.postLogin(true,true); - }); }, login: function () { @@ -222,29 +221,15 @@ App.Router = Em.Router.extend({ loginSuccessCallback: function(data, opt, params) { console.log('login success'); - var isAdmin = false; - var self = this; - this.getUserPrivileges(data.Users.user_name).done(function(privileges) { - data.privileges = privileges; - App.usersMapper.map({"items": [data]}); - isAdmin = App.usersMapper.isAdmin(privileges.items.mapProperty('PrivilegeInfo.permission_name')); - if (isAdmin) { - App.set('isAdmin', true); - self.setUserLoggedIn(params.loginName); - return true; - } - else { - return App.ajax.send({ - name: 'router.login2', - sender: self, - data: { - loginName: params.loginName, - loginData: data - }, - success: 'login2SuccessCallback', - error: 'login2ErrorCallback' - }); - } + App.ajax.send({ + name: 'router.login.clusters', + sender: this, + data: { + loginName: params.loginName, + loginData: data + }, + success: 'loginGetClustersSuccessCallback', + error: 'loginGetClustersErrorCallback' }); }, @@ -260,19 +245,55 @@ App.Router = Em.Router.extend({ }, - login2SuccessCallback: function (clusterResp, opt, params) { - var controller = this.get('loginController'); - if (clusterResp.items.length) { - App.usersMapper.map({"items": [params.loginData]}); - this.setUserLoggedIn(params.loginName); - } - else { - controller.set('errorMessage', Em.I18n.t('router.hadoopClusterNotSetUp')); - } + loginGetClustersSuccessCallback: function (clustersData, opt, params) { + var adminViewUrl = '/views/ADMIN_VIEW/1.0.0/INSTANCE/#/'; + //TODO: Replace hard coded value with query. Same in templates/application.hbs + var loginController = this.get('loginController'); + var loginData = params.loginData; + var router = this; + + this.getUserPrivileges(params.loginName).done(function(privileges) { + loginData.privileges = privileges; + App.usersMapper.map({"items": [loginData]}); + router.setUserLoggedIn(params.loginName); + var permissionList = privileges.items.mapProperty('PrivilegeInfo.permission_name'); + var isAdmin = permissionList.indexOf('AMBARI.ADMIN') > -1; + var transitionToApp = false; + if (isAdmin) { + App.set('isAdmin', true); + if (clustersData.items.length) { + transitionToApp = true; + } else { + window.location = adminViewUrl; + return; + } + } else { + if (clustersData.items.length) { + //TODO: Iterate over clusters + var clusterName = clustersData.items[0].Clusters.cluster_name; + var clusterPermissions = privileges.items.filterProperty('PrivilegeInfo.cluster_name', clusterName).mapProperty('PrivilegeInfo.permission_name'); + if (clusterPermissions.indexOf('CLUSTER.OPERATE') > -1) { + App.set('isAdmin', true); + transitionToApp = true; + } else if (clusterPermissions.indexOf('CLUSTER.READ') > -1) { + transitionToApp = true; + } + } + } + if (transitionToApp) { + router.getSection(function (route) { + router.transitionTo(route); + loginController.postLogin(true, true); + }); + } else { + router.transitionTo('views.index'); + loginController.postLogin(true,true); + } + }); }, - login2ErrorCallback: function (req) { - console.log("Server not responding: " + req.statusCode); + loginGetClustersErrorCallback: function (req) { + console.log("Get clusters error: " + req.statusCode); }, getSection: function (callback) { @@ -347,6 +368,7 @@ App.Router = Em.Router.extend({ }); } this.transitionTo('login', context); + window.location.reload(); }, logOffSuccessCallback: function (data) { @@ -408,7 +430,9 @@ App.Router = Em.Router.extend({ installer: require('routes/installer'), main: require('routes/main'), - + + views: require('routes/views'), + experimental: Em.Route.extend({ route: '/experimental', enter: function (router, context) { http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/routes/main.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/main.js b/ambari-web/app/routes/main.js index b73627a..f822c48 100644 --- a/ambari-web/app/routes/main.js +++ b/ambari-web/app/routes/main.js @@ -67,28 +67,6 @@ module.exports = Em.Route.extend({ router.get('applicationController').connectOutlet('main'); }, - - views: Em.Route.extend({ - route: '/views', - index: Em.Route.extend({ - route: '/', - connectOutlets: function (router, context) { - router.get('mainController').connectOutlet('mainViews'); - } - }), - viewDetails: Em.Route.extend({ - route: '/:viewName/:version/:instanceName', - connectOutlets: function (router, params) { - router.get('mainController').dataLoading().done(function() { - // find and set content for `mainViewsDetails` and associated controller - router.get('mainController').connectOutlet('mainViewsDetails', App.router.get('clusterController.ambariViews') - .findProperty('href', ['/views', params.viewName, params.version, params.instanceName].join('/'))); - }); - } - }) - }), - - test: Em.Route.extend({ route: '/test', connectOutlets: function (router, context) { http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/routes/views.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/views.js b/ambari-web/app/routes/views.js new file mode 100644 index 0000000..d72dbf0 --- /dev/null +++ b/ambari-web/app/routes/views.js @@ -0,0 +1,53 @@ +/** + * 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 stringUtils = require('utils/string_utils'); + +module.exports = Em.Route.extend({ + route: '/views', + enter: function (router) { + router.getAuthenticated().done(function (loggedIn) { + if (loggedIn) { + router.get('mainViewsController').loadAmbariViews(); + } else { + Em.run.next(function () { + router.transitionTo('login'); + }); + } + }); + }, + index: Em.Route.extend({ + route: '/', + connectOutlets: function (router) { + router.get('mainViewsController').dataLoading().done(function() { + router.get('applicationController').connectOutlet('mainViews'); + }); + } + }), + viewDetails: Em.Route.extend({ + route: '/:viewName/:version/:instanceName', + connectOutlets: function (router, params) { + // find and set content for `mainViewsDetails` and associated controller + router.get('mainViewsController').dataLoading().done(function() { + router.get('applicationController').connectOutlet('mainViewsDetails', App.router.get('mainViewsController.ambariViews') + .findProperty('href', ['/views', params.viewName, params.version, params.instanceName].join('/'))); + }); + } + }) +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/utils/ajax/ajax.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js index 09d68c6..4213bc5 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -1370,7 +1370,7 @@ var urls = { real: '/privileges?PrivilegeInfo/principal_name={userName}&fields=*', mock: '/data/users/privileges_{userName}.json' }, - 'router.login2': { + 'router.login.clusters': { 'real': '/clusters', 'mock': '/data/clusters/info.json' }, http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/views/main/menu.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/menu.js b/ambari-web/app/views/main/menu.js index ea4a2bd..c9d475a 100644 --- a/ambari-web/app/views/main/menu.js +++ b/ambari-web/app/views/main/menu.js @@ -27,8 +27,8 @@ App.MainMenuView = Em.CollectionView.extend({ classNames:['nav', 'top-nav-menu'], views: function() { - return App.router.get('clusterController.ambariViews'); - }.property('App.router.clusterController.ambariViews'), + return App.router.get('mainViewsController.ambariViews'); + }.property('App.router.mainViewsController.ambariViews'), content: function(){ var result = []; @@ -121,6 +121,9 @@ App.MainMenuView = Em.CollectionView.extend({ goToSection: function (event) { if (event.context === 'hosts') { App.router.set('mainHostController.showFilterConditionsFirstLoad', false); + } else if (event.context === 'views') { + App.router.route('views'); + return; } App.router.route('main/' + event.context); }, http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/app/views/main/views_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/views_view.js b/ambari-web/app/views/main/views_view.js index 5a16bbd..3c97baf 100644 --- a/ambari-web/app/views/main/views_view.js +++ b/ambari-web/app/views/main/views_view.js @@ -25,8 +25,8 @@ App.MainViewsView = Em.View.extend({ classNames: [""], views: function() { - return App.router.get('clusterController.ambariViews'); - }.property('App.ClusterController.ambariViews'), + return App.router.get('mainViewsController.ambariViews'); + }.property('App.router.mainViewsController.ambariViews'), selectedViewBinding: 'controller.selectedView' http://git-wip-us.apache.org/repos/asf/ambari/blob/b750cd8f/ambari-web/test/mappers/users_mapper_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/mappers/users_mapper_test.js b/ambari-web/test/mappers/users_mapper_test.js index 20c6bae..767a002 100644 --- a/ambari-web/test/mappers/users_mapper_test.js +++ b/ambari-web/test/mappers/users_mapper_test.js @@ -29,7 +29,7 @@ describe('App.usersMapper', function () { {i:["AMBARI.ADMIN"],e:true,m:'has admin role'}, {i:["CLUSTER.READ", "AMBARI.ADMIN"],e:true,m:'has admin role'}, {i:["VIEW.USE"],e:false,m:'doesn\'t have admin role'}, - {i:["CLUSTER.OPERATOR"],e:true,m:'has admin role'} + {i:["CLUSTER.OPERATE"],e:true,m:'has admin role'} ]; tests.forEach(function(test) { it(test.m, function() {