blob: 3227045a0ef0cfe86e82fbb7ecbca8b97d000c86 [file] [log] [blame]
/**
* 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.
*/
package org.apache.sentry.provider.db.generic.service.persistent;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import java.io.File;
import java.util.Arrays;
import java.util.Properties;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;
import javax.jdo.Transaction;
import org.apache.commons.io.FileUtils;
import org.apache.sentry.core.model.search.Collection;
import org.apache.sentry.provider.db.service.model.MSentryGMPrivilege;
import org.apache.sentry.provider.db.service.model.MSentryPrivilege;
import org.apache.sentry.provider.db.service.model.MSentryRole;
import org.apache.sentry.provider.db.service.persistent.SentryStore;
import org.apache.sentry.provider.db.service.persistent.StoreUtils;
import org.apache.sentry.service.thrift.ServiceConstants.ServerConfig;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.base.Preconditions;
import com.google.common.io.Files;
/**
* The class tests that the new feature SENTRY-398 generic model adds the new field in the MSentryRole
* will not affect the functionality of the origin hive/impala authorization model
*/
public class TestSentryRole {
private static PersistenceManagerFactory pmf;
private static File dataDir;
@Before
public void setup() throws Exception {
dataDir = new File(Files.createTempDir(), "sentry_policy_db");
Properties prop = new Properties();
prop.setProperty(ServerConfig.JAVAX_JDO_URL, "jdbc:derby:;databaseName=" + dataDir.getPath() + ";create=true");
prop.setProperty(ServerConfig.JAVAX_JDO_USER, "Sentry");
prop.setProperty(ServerConfig.JAVAX_JDO_PASS, "Sentry");
prop.setProperty(ServerConfig.JAVAX_JDO_DRIVER_NAME, "org.apache.derby.jdbc.EmbeddedDriver");
prop.setProperty("datanucleus.autoCreateSchema", "true");
prop.setProperty("datanucleus.fixedDatastore", "false");
prop.setProperty("datanucleus.NontransactionalRead", "false");
prop.setProperty("datanucleus.NontransactionalWrite", "false");
pmf = JDOHelper.getPersistenceManagerFactory(prop);
}
@After
public void tearDown() throws Exception {
pmf.close();
FileUtils.deleteQuietly(dataDir);
}
@Test
public void grantMixedPrivilegeTest() throws Exception {
String roleName = "r1";
//hive/impala privilege
MSentryPrivilege hivePrivilege = new MSentryPrivilege();
hivePrivilege.setServerName("hive.server1");
hivePrivilege.setDbName("db1");
hivePrivilege.setTableName("tb1");
hivePrivilege.setPrivilegeScope("table");
hivePrivilege.setAction("select");
hivePrivilege.setGrantOption(true);
//solr privilege
MSentryGMPrivilege solrPrivilege = new MSentryGMPrivilege();
solrPrivilege.setComponentName("solr");
solrPrivilege.setServiceName("solr.server1");
solrPrivilege.setAuthorizables(Arrays.asList(new Collection("c1")));
solrPrivilege.setAction("query");
solrPrivilege.setGrantOption(true);
PersistenceManager pm = null;
//create role
pm = openTransaction();
pm.makePersistent(new MSentryRole(roleName, System.currentTimeMillis()));
commitTransaction(pm);
//add hivePrivilege to role
pm = openTransaction();
MSentryRole role = getMSentryRole(pm, roleName);
hivePrivilege.appendRole(role);
pm.makePersistent(hivePrivilege);
commitTransaction(pm);
//check hivePrivlege and solrPrivilege
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(1, role.getPrivileges().size());
assertEquals(0, role.getGmPrivileges().size());
commitTransaction(pm);
//add solrPrivilege to role
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
solrPrivilege.appendRole(role);
pm.makePersistent(solrPrivilege);
commitTransaction(pm);
//check hivePrivlege and solrPrivilege
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(1, role.getPrivileges().size());
assertEquals(1, role.getGmPrivileges().size());
commitTransaction(pm);
}
@Test
public void testWantGrantPrivilegeTwice() throws Exception {
String roleName = "r1";
//hive/impala privilege
MSentryPrivilege hivePrivilege = new MSentryPrivilege();
hivePrivilege.setServerName("hive.server1");
hivePrivilege.setDbName("db1");
hivePrivilege.setTableName("tb1");
hivePrivilege.setPrivilegeScope("table");
hivePrivilege.setAction("select");
hivePrivilege.setURI(StoreUtils.NULL_COL);
hivePrivilege.setColumnName(StoreUtils.NULL_COL);
hivePrivilege.setGrantOption(true);
//The same hivePrivilege
MSentryPrivilege hivePrivilege2 = new MSentryPrivilege(hivePrivilege);
//solr privilege
MSentryGMPrivilege solrPrivilege = new MSentryGMPrivilege();
solrPrivilege.setComponentName("solr");
solrPrivilege.setServiceName("solr.server1");
solrPrivilege.setAuthorizables(Arrays.asList(new Collection("c1")));
solrPrivilege.setAction("query");
solrPrivilege.setGrantOption(true);
//The same solrPrivilege
MSentryGMPrivilege solrPrivilege2 = new MSentryGMPrivilege(solrPrivilege);
PersistenceManager pm = null;
//create role
pm = openTransaction();
pm.makePersistent(new MSentryRole(roleName, System.currentTimeMillis()));
commitTransaction(pm);
//grant hivePrivilege and solrPrivilege to role
pm = openTransaction();
MSentryRole role = getMSentryRole(pm, roleName);
solrPrivilege.appendRole(role);
hivePrivilege.appendRole(role);
pm.makePersistent(solrPrivilege);
pm.makePersistent(hivePrivilege);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(1, role.getPrivileges().size());
assertEquals(1, role.getGmPrivileges().size());
commitTransaction(pm);
//want to grant the same hivePrivilege and solrPrivilege to role again
//hivePrivilege2 is equal to hivePrivilege
//solrPrivilege2 is equal to solrPrivilege
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
if (!role.getGmPrivileges().contains(solrPrivilege2)) {
fail("unexpect happend: the MSentryGMPrivilege:" + solrPrivilege2 + " already be granted");
}
if (!role.getPrivileges().contains(hivePrivilege2)) {
fail("unexpect happend: the MSentryPrivilege:" + hivePrivilege2 + " already be granted");
}
commitTransaction(pm);
}
@Test
public void testMixedRevokePrivilege() throws Exception {
String roleName = "r1";
//hive/impala privilege
MSentryPrivilege hivePrivilege = new MSentryPrivilege();
hivePrivilege.setServerName("hive.server1");
hivePrivilege.setDbName("db1");
hivePrivilege.setTableName("tb1");
hivePrivilege.setPrivilegeScope("table");
hivePrivilege.setAction("select");
hivePrivilege.setURI(StoreUtils.NULL_COL);
hivePrivilege.setColumnName(StoreUtils.NULL_COL);
hivePrivilege.setGrantOption(true);
//solr privilege
MSentryGMPrivilege solrPrivilege = new MSentryGMPrivilege();
solrPrivilege.setComponentName("solr");
solrPrivilege.setServiceName("solr.server1");
solrPrivilege.setAuthorizables(Arrays.asList(new Collection("c1")));
solrPrivilege.setAction("query");
solrPrivilege.setGrantOption(true);
PersistenceManager pm = null;
//create role
pm = openTransaction();
pm.makePersistent(new MSentryRole(roleName, System.currentTimeMillis()));
commitTransaction(pm);
//grant hivePrivilege and solrPrivilege to role
pm = openTransaction();
MSentryRole role = getMSentryRole(pm, roleName);
hivePrivilege.appendRole(role);
solrPrivilege.appendRole(role);
pm.makePersistent(hivePrivilege);
pm.makePersistent(solrPrivilege);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(1, role.getPrivileges().size());
assertEquals(1, role.getGmPrivileges().size());
commitTransaction(pm);
//revoke solrPrivilege from role
pm = openTransaction();
role = getMSentryRole(pm, roleName);
solrPrivilege = (MSentryGMPrivilege)role.getGmPrivileges().toArray()[0];
solrPrivilege.removeRole(role);
pm.makePersistent(solrPrivilege);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(1, role.getPrivileges().size());
assertEquals(0, role.getGmPrivileges().size());
commitTransaction(pm);
//revoke hivePrivilege from role
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
hivePrivilege = (MSentryPrivilege)role.getPrivileges().toArray()[0];
hivePrivilege.removeRole(role);
pm.makePersistent(hivePrivilege);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(0, role.getPrivileges().size());
assertEquals(0, role.getGmPrivileges().size());
commitTransaction(pm);
}
@Test
public void testDeletePrivilegeAndRole() throws Exception {
String roleName = "r1";
//hive/impala privilege
MSentryPrivilege hivePrivilege = new MSentryPrivilege();
hivePrivilege.setServerName("hive.server1");
hivePrivilege.setDbName("db1");
hivePrivilege.setTableName("tb1");
hivePrivilege.setPrivilegeScope("table");
hivePrivilege.setAction("select");
hivePrivilege.setURI(StoreUtils.NULL_COL);
hivePrivilege.setColumnName(StoreUtils.NULL_COL);
hivePrivilege.setGrantOption(true);
//solr privilege
MSentryGMPrivilege solrPrivilege = new MSentryGMPrivilege();
solrPrivilege.setComponentName("solr");
solrPrivilege.setServiceName("solr.server1");
solrPrivilege.setAuthorizables(Arrays.asList(new Collection("c1")));
solrPrivilege.setAction("query");
solrPrivilege.setGrantOption(true);
PersistenceManager pm = null;
//create role
pm = openTransaction();
pm.makePersistent(new MSentryRole(roleName, System.currentTimeMillis()));
commitTransaction(pm);
//grant hivePrivilege and solrPrivilege to role
pm = openTransaction();
MSentryRole role = getMSentryRole(pm, roleName);
hivePrivilege.appendRole(role);
solrPrivilege.appendRole(role);
pm.makePersistent(hivePrivilege);
pm.makePersistent(solrPrivilege);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(1, role.getPrivileges().size());
assertEquals(1, role.getGmPrivileges().size());
commitTransaction(pm);
//remove all privileges
pm = openTransaction();
role = getMSentryRole(pm, roleName);
role.removeGMPrivileges();
role.removePrivileges();
pm.makePersistent(role);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.retrieve(role);
assertEquals(0, role.getPrivileges().size());
assertEquals(0, role.getGmPrivileges().size());
commitTransaction(pm);
//delete role
pm = openTransaction();
role = getMSentryRole(pm, roleName);
pm.deletePersistent(role);
commitTransaction(pm);
//check
pm = openTransaction();
role = getMSentryRole(pm, roleName);
assertTrue(role == null);
commitTransaction(pm);
}
private PersistenceManager openTransaction() {
PersistenceManager pm = pmf.getPersistenceManager();
Transaction currentTransaction = pm.currentTransaction();
currentTransaction.begin();
return pm;
}
private void commitTransaction(PersistenceManager pm) {
Transaction currentTransaction = pm.currentTransaction();
try {
Preconditions.checkState(currentTransaction.isActive(), "Transaction is not active");
currentTransaction.commit();
} finally {
pm.close();
}
}
private MSentryRole getMSentryRole(PersistenceManager pm, String roleName) {
Query query = pm.newQuery(MSentryRole.class);
query.setFilter("this.roleName == t");
query.declareParameters("java.lang.String t");
query.setUnique(true);
MSentryRole sentryRole = (MSentryRole) query.execute(roleName);
return sentryRole;
}
}