blob: 6518c9327b01edbc04704430b8668ab3940a17d1 [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.hadoop.mapred;
import java.io.IOException;
import junit.framework.TestCase;
import org.apache.hadoop.mapreduce.MRConfig;
import static org.apache.hadoop.mapred.QueueManagerTestUtils.*;
import org.apache.hadoop.security.UserGroupInformation;
/**
* Unit test class to test queue acls
*
*/
public class TestQueueAclsForCurrentUser extends TestCase {
private QueueManager queueManager;
private JobConf conf = null;
UserGroupInformation currentUGI = null;
String submitAcl = QueueACL.SUBMIT_JOB.getAclName();
String adminAcl = QueueACL.ADMINISTER_JOBS.getAclName();
@Override
protected void tearDown() {
deleteQueuesConfigFile();
}
// No access for queues for the user currentUGI
private void setupConfForNoAccess() throws Exception {
currentUGI = UserGroupInformation.getLoginUser();
String userName = currentUGI.getUserName();
String[] queueNames = {"qu1", "qu2"};
// Only user u1 has access for queue qu1
// Only group g2 has acls for the queue qu2
createQueuesConfigFile(
queueNames, new String[]{"u1", " g2"}, new String[]{"u1", " g2"});
conf = new JobConf();
conf.setBoolean(MRConfig.MR_ACLS_ENABLED, true);
queueManager = new QueueManager(conf);
}
/**
* sets up configuration for acls test.
* @return
*/
private void setupConf(boolean aclSwitch) throws Exception{
currentUGI = UserGroupInformation.getLoginUser();
String userName = currentUGI.getUserName();
StringBuilder groupNames = new StringBuilder("");
String[] ugiGroupNames = currentUGI.getGroupNames();
int max = ugiGroupNames.length-1;
for(int j=0;j< ugiGroupNames.length;j++) {
groupNames.append(ugiGroupNames[j]);
if(j<max) {
groupNames.append(",");
}
}
String groupsAcl = " " + groupNames.toString();
//q1 Has acls for all the users, supports both submit and administer
//q2 only u2 has acls for the queues
//q3 Only u2 has submit operation access rest all have administer access
//q4 Only u2 has administer access , anyone can do submit
//qu5 only current user's groups has access
//qu6 only current user has submit access
//qu7 only current user has administrator access
String[] queueNames =
{"qu1", "qu2", "qu3", "qu4", "qu5", "qu6", "qu7"};
String[] submitAcls =
{"*", "u2", "u2", "*", groupsAcl, userName, "u2"};
String[] adminsAcls =
{"*", "u2", "*", "u2", groupsAcl, "u2", userName};
createQueuesConfigFile(queueNames, submitAcls, adminsAcls);
conf = new JobConf();
conf.setBoolean(MRConfig.MR_ACLS_ENABLED, aclSwitch);
queueManager = new QueueManager(conf);
}
public void testQueueAclsForCurrentuser() throws Exception {
setupConf(true);
QueueAclsInfo[] queueAclsInfoList =
queueManager.getQueueAcls(currentUGI);
checkQueueAclsInfo(queueAclsInfoList);
}
// Acls are disabled on the mapreduce cluster
public void testQueueAclsForCurrentUserAclsDisabled() throws Exception {
setupConf(false);
//fetch the acls info for current user.
QueueAclsInfo[] queueAclsInfoList = queueManager.
getQueueAcls(currentUGI);
checkQueueAclsInfo(queueAclsInfoList);
}
public void testQueueAclsForNoAccess() throws Exception {
setupConfForNoAccess();
QueueAclsInfo[] queueAclsInfoList = queueManager.
getQueueAcls(currentUGI);
assertTrue(queueAclsInfoList.length == 0);
}
private void checkQueueAclsInfo(QueueAclsInfo[] queueAclsInfoList)
throws IOException {
if (conf.get(MRConfig.MR_ACLS_ENABLED).equalsIgnoreCase("true")) {
for (int i = 0; i < queueAclsInfoList.length; i++) {
QueueAclsInfo acls = queueAclsInfoList[i];
String queueName = acls.getQueueName();
assertFalse(queueName.contains("qu2"));
if (queueName.equals("qu1")) {
assertTrue(acls.getOperations().length == 2);
assertTrue(checkAll(acls.getOperations()));
} else if (queueName.equals("qu3")) {
assertTrue(acls.getOperations().length == 1);
assertTrue(acls.getOperations()[0].equalsIgnoreCase(adminAcl));
} else if (queueName.equals("qu4")) {
assertTrue(acls.getOperations().length == 1);
assertTrue(acls.getOperations()[0].equalsIgnoreCase(submitAcl));
} else if (queueName.equals("qu5")) {
assertTrue(acls.getOperations().length == 2);
assertTrue(checkAll(acls.getOperations()));
} else if(queueName.equals("qu6")) {
assertTrue(acls.getOperations()[0].equals(submitAcl));
} else if(queueName.equals("qu7")) {
assertTrue(acls.getOperations()[0].equals(adminAcl));
}
}
} else {
for (int i = 0; i < queueAclsInfoList.length; i++) {
QueueAclsInfo acls = queueAclsInfoList[i];
String queueName = acls.getQueueName();
assertTrue(acls.getOperations().length == 2);
assertTrue(checkAll(acls.getOperations()));
}
}
}
private boolean checkAll(String[] operations){
boolean submit = false;
boolean admin = false;
for(String val: operations){
if(val.equalsIgnoreCase(submitAcl))
submit = true;
else if(val.equalsIgnoreCase(adminAcl))
admin = true;
}
if(submit && admin) return true;
return false;
}
}