/** * 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 java.security.PrivilegedExceptionAction; import javax.security.auth.login.LoginException; import org.apache.hadoop.security.UserGroupInformation; public class TestQueueManagerForJobKillAndNonDefaultQueue extends TestQueueManager { public void testDisabledACLForNonDefaultQueue() throws IOException, InterruptedException { try { // allow everyone in default queue JobConf conf = setupConf(QueueManager.toFullPropertyName ("default", submitAcl), "*"); // setup a different queue conf.set("mapred.queue.names", "default,q1"); // setup a different acl for this queue. conf.set(QueueManager.toFullPropertyName ("q1", submitAcl), "dummy-user"); // verify job submission to other queue fails. verifyJobSubmission(conf, false, "user1,group1", "q1"); } finally { tearDownCluster(); } } public void testEnabledACLForNonDefaultQueue() throws IOException, LoginException, InterruptedException { try { UserGroupInformation ugi = createNecessaryUsers(); String[] groups = ugi.getGroupNames(); String userName = ugi.getShortUserName(); // allow everyone in default queue JobConf conf = setupConf(QueueManager.toFullPropertyName ("default", submitAcl), "*"); // setup a different queue conf.set("mapred.queue.names", "default,q2"); // setup a different acl for this queue. conf.set(QueueManager.toFullPropertyName ("q2", submitAcl), userName); // verify job submission to other queue fails. verifyJobSubmission(conf, true, userName + "," + groups[groups.length-1], "q2"); } finally { tearDownCluster(); } } public void testAllEnabledACLForJobKill() throws IOException, InterruptedException { try { UserGroupInformation ugi = createNecessaryUsers(); // create other user who will try to kill the job of ugi. final UserGroupInformation otherUGI = UserGroupInformation. createUserForTesting("user1", new String [] {"group1"}); ugi.doAs(new PrivilegedExceptionAction<Object>() { @Override public Object run() throws Exception { JobConf conf = setupConf(QueueManager.toFullPropertyName ("default", adminAcl), "*"); verifyJobKill(otherUGI, conf, true); return null; } }); } finally { tearDownCluster(); } } public void testAllDisabledACLForJobKill() throws IOException, InterruptedException { try { // Create a fake superuser for all processes to execute within final UserGroupInformation ugi = createNecessaryUsers(); // create other users who will try to kill the job of ugi. final UserGroupInformation otherUGI1 = UserGroupInformation. createUserForTesting("user1", new String [] {"group1"}); final UserGroupInformation otherUGI2 = UserGroupInformation. createUserForTesting("user2", new String [] {"group2"}); ugi.doAs(new PrivilegedExceptionAction<Object>() { @Override public Object run() throws Exception { // No queue admins JobConf conf = setupConf(QueueManager.toFullPropertyName ("default", adminAcl), " "); // Run job as ugi and try to kill job as user1, who // (obviously) should not be able to kill the job. verifyJobKill(otherUGI1, conf, false); verifyJobKill(otherUGI2, conf, false); // Check if cluster administrator can kill job conf.set(JobConf.MR_ADMINS, "user1 group2"); tearDownCluster(); verifyJobKill(otherUGI1, conf, true); verifyJobKill(otherUGI2, conf, true); // Check if MROwner(user who started // the mapreduce cluster) can kill job verifyJobKill(ugi, conf, true); return null; } }); } finally { tearDownCluster(); } } }