You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2014/08/22 14:48:17 UTC
[19/46] git commit: AMBARI-6950. Jobs View: set up default access to
Jobs view for operators and users on initial install and also upgrade.
AMBARI-6950. Jobs View: set up default access to Jobs view for operators and users on initial install and also upgrade.
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f6d7e8b3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f6d7e8b3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f6d7e8b3
Branch: refs/heads/branch-alerts-dev
Commit: f6d7e8b3a930d1bed8843a4b439d9a6a912dd16f
Parents: 6fddbb7
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Wed Aug 20 14:16:55 2014 -0700
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Wed Aug 20 14:18:26 2014 -0700
----------------------------------------------------------------------
.../apache/ambari/server/orm/dao/ViewDAO.java | 18 +++++
.../server/orm/entities/ViewInstanceEntity.java | 13 +++-
.../server/upgrade/UpgradeCatalog170.java | 71 ++++++++++++++++++++
.../server/upgrade/UpgradeCatalog170Test.java | 53 +++++++++++----
.../controllers/main/admin/access_controller.js | 66 ------------------
ambari-web/app/routes/main.js | 20 +++---
contrib/views/jobs/src/main/resources/view.xml | 3 -
7 files changed, 150 insertions(+), 94 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewDAO.java
index 13f7b04..bbbab63 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ViewDAO.java
@@ -51,6 +51,24 @@ public class ViewDAO {
}
/**
+ * Find a view with a given common name.
+ *
+ * @param viewCommonName common name of view to find
+ *
+ * @return a matching view or null
+ */
+ public ViewEntity findByCommonName(String viewCommonName) {
+ if (viewCommonName != null) {
+ for (ViewEntity viewEntity : findAll()) {
+ if (viewCommonName.equals(viewEntity.getCommonName())) {
+ return viewEntity;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
* Find all views.
*
* @return all views or an empty List
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
index 66917e7..643bac2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
@@ -226,13 +226,24 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
* @param name the instance name
*/
public ViewInstanceEntity(ViewEntity view, String name) {
+ this(view, name, view.getLabel());
+ }
+
+ /**
+ * Construct a view instance definition.
+ *
+ * @param view the parent view definition
+ * @param name the instance name
+ * @param label the instance label
+ */
+ public ViewInstanceEntity(ViewEntity view, String name, String label) {
this.name = name;
this.instanceConfig = null;
this.view = view;
this.viewName = view.getName();
this.description = null;
this.visible = 'Y';
- this.label = view.getLabel();
+ this.label = label;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
index 144900e..eb3a578 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
@@ -46,6 +46,7 @@ import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
import org.apache.ambari.server.orm.dao.ClusterDAO;
import org.apache.ambari.server.orm.dao.DaoUtils;
import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
+import org.apache.ambari.server.orm.dao.KeyValueDAO;
import org.apache.ambari.server.orm.dao.PermissionDAO;
import org.apache.ambari.server.orm.dao.PrincipalDAO;
import org.apache.ambari.server.orm.dao.PrincipalTypeDAO;
@@ -58,6 +59,7 @@ import org.apache.ambari.server.orm.dao.ViewInstanceDAO;
import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
import org.apache.ambari.server.orm.entities.HostRoleCommandEntity_;
+import org.apache.ambari.server.orm.entities.KeyValueEntity;
import org.apache.ambari.server.orm.entities.PermissionEntity;
import org.apache.ambari.server.orm.entities.PrincipalEntity;
import org.apache.ambari.server.orm.entities.PrincipalTypeEntity;
@@ -72,6 +74,7 @@ import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Config;
import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.view.configuration.InstanceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -96,6 +99,10 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
private static final String ALERT_TABLE_GROUP_TARGET = "alert_group_target";
private static final String ALERT_TABLE_GROUPING = "alert_grouping";
private static final String ALERT_TABLE_NOTICE = "alert_notice";
+ public static final String JOBS_VIEW_NAME = "JOBS";
+ public static final String JOBS_VIEW_INSTANCE_NAME = "JOBS_1";
+ public static final String SHOW_JOBS_FOR_NON_ADMIN_KEY = "showJobsForNonAdmin";
+ public static final String JOBS_VIEW_INSTANCE_LABEL = "Jobs";
//SourceVersion is only for book-keeping purpos
@Override
@@ -560,6 +567,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
addMissingConfigs();
renamePigProperties();
upgradePermissionModel();
+ addJobsViewPermissions();
}
/**
@@ -981,4 +989,67 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
}
}
}
+
+ protected void addJobsViewPermissions() {
+
+ final UserDAO userDAO = injector.getInstance(UserDAO.class);
+ final ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
+ final ResourceDAO resourceDAO = injector.getInstance(ResourceDAO.class);
+ final ViewDAO viewDAO = injector.getInstance(ViewDAO.class);
+ final ViewInstanceDAO viewInstanceDAO = injector.getInstance(ViewInstanceDAO.class);
+ final KeyValueDAO keyValueDAO = injector.getInstance(KeyValueDAO.class);
+ final PermissionDAO permissionDAO = injector.getInstance(PermissionDAO.class);
+ final PrivilegeDAO privilegeDAO = injector.getInstance(PrivilegeDAO.class);
+
+ ViewEntity jobsView = viewDAO.findByCommonName(JOBS_VIEW_NAME);
+ if (jobsView != null) {
+ ViewInstanceEntity jobsInstance = jobsView.getInstanceDefinition(JOBS_VIEW_INSTANCE_NAME);
+ if (jobsInstance == null) {
+ jobsInstance = new ViewInstanceEntity(jobsView, JOBS_VIEW_INSTANCE_NAME, JOBS_VIEW_INSTANCE_LABEL);
+ ResourceEntity resourceEntity = new ResourceEntity();
+ resourceEntity.setResourceType(resourceTypeDAO.findByName(
+ ViewEntity.getViewName(
+ jobsView.getCommonName(),
+ jobsView.getVersion())));
+ jobsInstance.setResource(resourceEntity);
+ jobsView.addInstanceDefinition(jobsInstance);
+ resourceDAO.create(resourceEntity);
+ viewInstanceDAO.create(jobsInstance);
+ viewDAO.merge(jobsView);
+ }
+ // get showJobsForNonAdmin value and remove it
+ boolean showJobsForNonAdmin = false;
+ KeyValueEntity showJobsKeyValueEntity = keyValueDAO.findByKey(SHOW_JOBS_FOR_NON_ADMIN_KEY);
+ if (showJobsKeyValueEntity != null) {
+ String value = showJobsKeyValueEntity.getValue();
+ showJobsForNonAdmin = Boolean.parseBoolean(value);
+ keyValueDAO.remove(showJobsKeyValueEntity);
+ }
+ if (showJobsForNonAdmin) {
+ ResourceEntity jobsResource = jobsInstance.getResource();
+ PermissionEntity viewUsePermission = permissionDAO.findViewUsePermission();
+ for (UserEntity userEntity : userDAO.findAll()) {
+ // check if user has VIEW.USE privilege for JOBS view
+ List<PrivilegeEntity> privilegeEntities = privilegeDAO.findAllByPrincipal(
+ Collections.singletonList(userEntity.getPrincipal()));
+ boolean hasJobsUsePrivilege = false;
+ for (PrivilegeEntity privilegeEntity : privilegeEntities) {
+ if (privilegeEntity.getResource().getId() == jobsInstance.getResource().getId() &&
+ privilegeEntity.getPermission().getId() == viewUsePermission.getId()) {
+ hasJobsUsePrivilege = true;
+ break;
+ }
+ }
+ // if not - add VIEW.use privilege
+ if (!hasJobsUsePrivilege) {
+ PrivilegeEntity privilegeEntity = new PrivilegeEntity();
+ privilegeEntity.setResource(jobsResource);
+ privilegeEntity.setPermission(viewUsePermission);
+ privilegeEntity.setPrincipal(userEntity.getPrincipal());
+ privilegeDAO.create(privilegeEntity);
+ }
+ }
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
index 6262a2b..fbee5e2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
@@ -63,6 +63,7 @@ import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.dao.ClusterDAO;
+import org.apache.ambari.server.orm.dao.KeyValueDAO;
import org.apache.ambari.server.orm.dao.PermissionDAO;
import org.apache.ambari.server.orm.dao.PrincipalDAO;
import org.apache.ambari.server.orm.dao.PrincipalTypeDAO;
@@ -74,6 +75,9 @@ import org.apache.ambari.server.orm.dao.ViewDAO;
import org.apache.ambari.server.orm.dao.ViewInstanceDAO;
import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
+import org.apache.ambari.server.orm.entities.KeyValueEntity;
+import org.apache.ambari.server.orm.entities.PrivilegeEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
import org.apache.ambari.server.orm.entities.UserEntity;
import org.apache.ambari.server.orm.entities.ViewEntity;
import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
@@ -231,6 +235,7 @@ public class UpgradeCatalog170Test {
ViewInstanceDAO viewInstanceDAO = createNiceMock(ViewInstanceDAO.class);
PermissionDAO permissionDAO = createNiceMock(PermissionDAO.class);
PrivilegeDAO privilegeDAO = createNiceMock(PrivilegeDAO.class);
+ KeyValueDAO keyValueDAO = createNiceMock(KeyValueDAO.class);
EntityTransaction trans = createNiceMock(EntityTransaction.class);
CriteriaBuilder cb = createNiceMock(CriteriaBuilder.class);
@@ -316,18 +321,19 @@ public class UpgradeCatalog170Test {
expect(configHelper.findConfigTypesByPropertyName(new StackId("HDP", "2.1"), "content")).andReturn(envDicts).once();
expect(configHelper.getPropertyValueFromStackDefenitions(cluster, "hadoop-env", "content")).andReturn("env file contents").once();
- expect(injector.getInstance(UserDAO.class)).andReturn(userDAO).once();
- expect(injector.getInstance(PrincipalDAO.class)).andReturn(principalDAO).once();
- expect(injector.getInstance(PrincipalTypeDAO.class)).andReturn(principalTypeDAO).once();
- expect(injector.getInstance(ClusterDAO.class)).andReturn(clusterDAO).once();
- expect(injector.getInstance(ResourceTypeDAO.class)).andReturn(resourceTypeDAO).once();
- expect(injector.getInstance(ResourceDAO.class)).andReturn(resourceDAO).once();
- expect(injector.getInstance(ViewDAO.class)).andReturn(viewDAO).once();
- expect(injector.getInstance(ViewInstanceDAO.class)).andReturn(viewInstanceDAO).once();
- expect(injector.getInstance(PermissionDAO.class)).andReturn(permissionDAO).once();
- expect(injector.getInstance(PrivilegeDAO.class)).andReturn(privilegeDAO).once();
-
- expect(userDAO.findAll()).andReturn(Collections.<UserEntity> emptyList()).anyTimes();
+ expect(injector.getInstance(UserDAO.class)).andReturn(userDAO).anyTimes();
+ expect(injector.getInstance(PrincipalDAO.class)).andReturn(principalDAO).anyTimes();
+ expect(injector.getInstance(PrincipalTypeDAO.class)).andReturn(principalTypeDAO).anyTimes();
+ expect(injector.getInstance(ClusterDAO.class)).andReturn(clusterDAO).anyTimes();
+ expect(injector.getInstance(ResourceTypeDAO.class)).andReturn(resourceTypeDAO).anyTimes();
+ expect(injector.getInstance(ResourceDAO.class)).andReturn(resourceDAO).anyTimes();
+ expect(injector.getInstance(ViewDAO.class)).andReturn(viewDAO).anyTimes();
+ expect(injector.getInstance(ViewInstanceDAO.class)).andReturn(viewInstanceDAO).anyTimes();
+ expect(injector.getInstance(PermissionDAO.class)).andReturn(permissionDAO).anyTimes();
+ expect(injector.getInstance(PrivilegeDAO.class)).andReturn(privilegeDAO).anyTimes();
+ expect(injector.getInstance(KeyValueDAO.class)).andReturn(keyValueDAO).anyTimes();
+
+ expect(userDAO.findAll()).andReturn(Collections.<UserEntity> emptyList()).times(2);
expect(clusterDAO.findAll()).andReturn(Collections.<ClusterEntity> emptyList()).anyTimes();
expect(viewDAO.findAll()).andReturn(Collections.<ViewEntity> emptyList()).anyTimes();
expect(viewInstanceDAO.findAll()).andReturn(Collections.<ViewInstanceEntity> emptyList()).anyTimes();
@@ -338,9 +344,29 @@ public class UpgradeCatalog170Test {
expect(cluster.getDesiredConfigByType("pig-properties")).andReturn(pigConfig).anyTimes();
expect(pigConfig.getProperties()).andReturn(pigSettings).anyTimes();
+ ViewEntity jobsView = createNiceMock(ViewEntity.class);
+ KeyValueEntity showJobsKeyValue = createNiceMock(KeyValueEntity.class);
+ UserEntity user = createNiceMock(UserEntity.class);
+
+ expect(userDAO.findAll()).andReturn(Collections.singletonList(user));
+ expect(jobsView.getCommonName()).andReturn(UpgradeCatalog170.JOBS_VIEW_NAME);
+ expect(jobsView.getVersion()).andReturn("1.0.0");
+ expect(viewDAO.findByCommonName(UpgradeCatalog170.JOBS_VIEW_NAME)).andReturn(jobsView).once();
+ expect(showJobsKeyValue.getValue()).andReturn("true");
+ expect(keyValueDAO.findByKey(UpgradeCatalog170.SHOW_JOBS_FOR_NON_ADMIN_KEY)).andReturn(showJobsKeyValue);
+ expect(privilegeDAO.findAllByPrincipal(anyObject(List.class))).andReturn(Collections.<PrivilegeEntity>emptyList());
+ expect(viewDAO.merge(jobsView)).andReturn(jobsView);
+
+ resourceDAO.create(anyObject(ResourceEntity.class));
+ viewInstanceDAO.create(anyObject(ViewInstanceEntity.class));
+ keyValueDAO.remove(showJobsKeyValue);
+ privilegeDAO.create(anyObject(PrivilegeEntity.class));
+
replay(entityManager, trans, upgradeCatalog, cb, cq, hrc, q);
replay(dbAccessor, configuration, injector, cluster, clusters, amc, config, configHelper, pigConfig);
replay(userDAO, clusterDAO, viewDAO, viewInstanceDAO, permissionDAO);
+ replay(resourceTypeDAO, resourceDAO, keyValueDAO, privilegeDAO);
+ replay(jobsView, showJobsKeyValue, user);
Class<?> c = AbstractUpgradeCatalog.class;
Field f = c.getDeclaredField("configuration");
@@ -355,7 +381,8 @@ public class UpgradeCatalog170Test {
upgradeCatalog.executeDMLUpdates();
- verify(upgradeCatalog, dbAccessor, configuration, injector, cluster, clusters, amc, config, configHelper);
+ verify(upgradeCatalog, dbAccessor, configuration, injector, cluster, clusters, amc, config, configHelper,
+ jobsView, showJobsKeyValue, privilegeDAO, viewDAO, viewInstanceDAO, resourceDAO, keyValueDAO);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/ambari-web/app/controllers/main/admin/access_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/access_controller.js b/ambari-web/app/controllers/main/admin/access_controller.js
deleted file mode 100644
index 82bc9f3..0000000
--- a/ambari-web/app/controllers/main/admin/access_controller.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * 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');
-
-App.MainAdminAccessController = Em.Controller.extend(App.UserPref, {
- name:'mainAdminAccessController',
-
- /**
- * Show jobs by default
- * @type {bool}
- */
- showJobs: false,
-
- /**
- * User pref key
- * @type {string}
- */
- persistKey: 'showJobsForNonAdmin',
-
- /**
- * Handle Save button click event
- */
- save: function() {
- this.postUserPref(this.get('persistKey'), this.get('showJobs'));
- },
-
- loadShowJobsForUsers: function () {
- var dfd = $.Deferred();
- this.getUserPref(this.get('persistKey')).done(function (value) {
- dfd.resolve(value);
- }).fail(function(value) {
- dfd.resolve(value);
- });
- return dfd.promise();
- },
-
- getUserPrefSuccessCallback: function (data) {
- this.set('showJobs', data);
- return data;
- },
-
- getUserPrefErrorCallback: function () {
- if (App.get('isAdmin')) {
- this.postUserPref(this.get('persistKey'), false);
- }
- this.set('showJobs', false);
- return true;
- }
-
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/ambari-web/app/routes/main.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/main.js b/ambari-web/app/routes/main.js
index 7598695..b73627a 100644
--- a/ambari-web/app/routes/main.js
+++ b/ambari-web/app/routes/main.js
@@ -26,18 +26,16 @@ module.exports = Em.Route.extend({
console.log('in /main:enter');
router.getAuthenticated().done(function (loggedIn) {
if (loggedIn) {
- App.router.get('mainAdminAccessController').loadShowJobsForUsers().done(function () {
- App.router.get('clusterController').loadClusterName(false).done(function () {
- if (App.get('testMode')) {
- router.get('mainController').initialize();
- } else {
- App.router.get('mainController').checkServerClientVersion().done(function () {
- App.router.get('clusterController').loadClientServerClockDistance().done(function () {
- router.get('mainController').initialize();
- });
+ App.router.get('clusterController').loadClusterName(false).done(function () {
+ if (App.get('testMode')) {
+ router.get('mainController').initialize();
+ } else {
+ App.router.get('mainController').checkServerClientVersion().done(function () {
+ App.router.get('clusterController').loadClientServerClockDistance().done(function () {
+ router.get('mainController').initialize();
});
- }
- });
+ });
+ }
});
// TODO: redirect to last known state
} else {
http://git-wip-us.apache.org/repos/asf/ambari/blob/f6d7e8b3/contrib/views/jobs/src/main/resources/view.xml
----------------------------------------------------------------------
diff --git a/contrib/views/jobs/src/main/resources/view.xml b/contrib/views/jobs/src/main/resources/view.xml
index 0c47bda..c48f6b5 100644
--- a/contrib/views/jobs/src/main/resources/view.xml
+++ b/contrib/views/jobs/src/main/resources/view.xml
@@ -18,7 +18,4 @@ limitations under the License. Kerberos, LDAP, Custom. Binary/Htt
<name>JOBS</name>
<label>Jobs View</label>
<version>1.0.0</version>
- <instance>
- <name>JOBS_1</name>
- </instance>
</view>