| /** |
| * 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.File; |
| import java.io.IOException; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.FileUtil; |
| import org.apache.hadoop.mapreduce.MRConfig; |
| import org.apache.hadoop.mapreduce.server.tasktracker.TTConfig; |
| import org.apache.hadoop.security.Groups; |
| import org.apache.hadoop.security.UserGroupInformation; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import junit.framework.TestCase; |
| |
| public class TestLinuxTaskController extends TestCase { |
| private static int INVALID_TASKCONTROLLER_PERMISSIONS = 24; |
| private static File testDir = new File(System.getProperty("test.build.data", |
| "/tmp"), TestLinuxTaskController.class.getName()); |
| private static String taskControllerPath = System |
| .getProperty(ClusterWithLinuxTaskController.TASKCONTROLLER_PATH); |
| |
| @Before |
| protected void setUp() throws Exception { |
| testDir.mkdirs(); |
| } |
| |
| @After |
| protected void tearDown() throws Exception { |
| FileUtil.fullyDelete(testDir); |
| } |
| |
| public static class MyLinuxTaskController extends LinuxTaskController { |
| String taskControllerExePath = taskControllerPath + "/task-controller"; |
| |
| @Override |
| protected String getTaskControllerExecutablePath() { |
| return taskControllerExePath; |
| } |
| } |
| |
| private void validateTaskControllerSetup(TaskController controller, |
| boolean shouldFail) throws IOException { |
| if (shouldFail) { |
| // task controller setup should fail validating permissions. |
| Throwable th = null; |
| try { |
| controller.setup(); |
| } catch (IOException ie) { |
| th = ie; |
| } |
| assertNotNull("No exception during setup", th); |
| assertTrue("Exception message does not contain exit code" |
| + INVALID_TASKCONTROLLER_PERMISSIONS, th.getMessage().contains( |
| "with exit code " + INVALID_TASKCONTROLLER_PERMISSIONS)); |
| } else { |
| controller.setup(); |
| } |
| |
| } |
| |
| @Test |
| public void testTaskControllerGroup() throws Exception { |
| if (!ClusterWithLinuxTaskController.isTaskExecPathPassed()) { |
| return; |
| } |
| // cleanup configuration file. |
| ClusterWithLinuxTaskController |
| .getTaskControllerConfFile(taskControllerPath).delete(); |
| Configuration conf = new Configuration(); |
| // create local dirs and set in the conf. |
| File mapredLocal = new File(testDir, "mapred/local"); |
| mapredLocal.mkdirs(); |
| conf.set(MRConfig.LOCAL_DIR, mapredLocal.toString()); |
| |
| // setup task-controller without setting any group name |
| TaskController controller = new MyLinuxTaskController(); |
| controller.setConf(conf); |
| validateTaskControllerSetup(controller, true); |
| |
| // set an invalid group name for the task controller group |
| conf.set(TTConfig.TT_GROUP, "invalid"); |
| // write the task-controller's conf file |
| ClusterWithLinuxTaskController.createTaskControllerConf(taskControllerPath, |
| conf); |
| validateTaskControllerSetup(controller, true); |
| |
| conf.set(TTConfig.TT_GROUP, |
| ClusterWithLinuxTaskController.taskTrackerSpecialGroup); |
| // write the task-controller's conf file |
| ClusterWithLinuxTaskController.createTaskControllerConf(taskControllerPath, |
| conf); |
| validateTaskControllerSetup(controller, false); |
| } |
| } |