blob: 26d35008bb24b9513b89ef09674e812bbd0033fe [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.gridmix;
import java.io.IOException;
import java.net.URI;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.security.UserGroupInformation;
public class TestUserResolve {
private static Path rootDir = null;
private static Configuration conf = null;
private static FileSystem fs = null;
@BeforeClass
public static void createRootDir() throws IOException {
conf = new Configuration();
fs = FileSystem.getLocal(conf);
rootDir = new Path(new Path(System.getProperty("test.build.data", "/tmp"))
.makeQualified(fs), "gridmixUserResolve");
}
/**
* Creates users file with the content as the String usersFileContent.
* @param usersFilePath the path to the file that is to be created
* @param usersFileContent Content of users file
* @throws IOException
*/
private static void writeUserList(Path usersFilePath, String usersFileContent)
throws IOException {
FSDataOutputStream out = null;
try {
out = fs.create(usersFilePath, true);
out.writeBytes(usersFileContent);
} finally {
if (out != null) {
out.close();
}
}
}
/**
* Validate RoundRobinUserResolver's behavior for bad user resource file.
* RoundRobinUserResolver.setTargetUsers() should throw proper Exception for
* the cases like
* <li> non existent user resource file and
* <li> empty user resource file
*
* @param rslv The RoundRobinUserResolver object
* @param userRsrc users file
* @param expectedErrorMsg expected error message
*/
private void validateBadUsersFile(UserResolver rslv, URI userRsrc,
String expectedErrorMsg) {
boolean fail = false;
try {
rslv.setTargetUsers(userRsrc, conf);
} catch (IOException e) {
assertTrue("Exception message from RoundRobinUserResolver is wrong",
e.getMessage().equals(expectedErrorMsg));
fail = true;
}
assertTrue("User list required for RoundRobinUserResolver", fail);
}
/**
* Validate the behavior of {@link RoundRobinUserResolver} for different
* user resource files like
* <li> Empty user resource file
* <li> Non existent user resource file
* <li> User resource file with valid content
* @throws Exception
*/
@Test
public void testRoundRobinResolver() throws Exception {
final UserResolver rslv = new RoundRobinUserResolver();
Path usersFilePath = new Path(rootDir, "users");
URI userRsrc = new URI(usersFilePath.toString());
// Check if the error message is as expected for non existent
// user resource file.
fs.delete(usersFilePath, false);
String expectedErrorMsg = "File " + userRsrc + " does not exist.";
validateBadUsersFile(rslv, userRsrc, expectedErrorMsg);
// Check if the error message is as expected for empty user resource file
writeUserList(usersFilePath, "");// creates empty users file
expectedErrorMsg =
RoundRobinUserResolver.buildEmptyUsersErrorMsg(userRsrc);
validateBadUsersFile(rslv, userRsrc, expectedErrorMsg);
// Create user resource file with valid content like older users list file
// with usernames and groups
writeUserList(usersFilePath,
"user0,groupA,groupB,groupC\nuser1,groupA,groupC\n");
validateValidUsersFile(rslv, userRsrc);
// Create user resource file with valid content with
// usernames with groups and without groups
writeUserList(usersFilePath, "user0,groupA,groupB\nuser1,");
validateValidUsersFile(rslv, userRsrc);
// Create user resource file with valid content with
// usernames without groups
writeUserList(usersFilePath, "user0\nuser1");
validateValidUsersFile(rslv, userRsrc);
}
// Validate RoundRobinUserResolver for the case of
// user resource file with valid content.
private void validateValidUsersFile(UserResolver rslv, URI userRsrc)
throws IOException {
assertTrue(rslv.setTargetUsers(userRsrc, conf));
UserGroupInformation ugi1 = UserGroupInformation.createRemoteUser("hfre0");
assertEquals("user0", rslv.getTargetUgi(ugi1).getUserName());
assertEquals("user1",
rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre1"))
.getUserName());
assertEquals("user0",
rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre2"))
.getUserName());
assertEquals("user0", rslv.getTargetUgi(ugi1).getUserName());
assertEquals("user1",
rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre3"))
.getUserName());
// Verify if same user comes again, its mapped user name should be
// correct even though UGI is constructed again.
assertEquals("user0", rslv.getTargetUgi(
UserGroupInformation.createRemoteUser("hfre0")).getUserName());
assertEquals("user0",
rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre5"))
.getUserName());
assertEquals("user0",
rslv.getTargetUgi(UserGroupInformation.createRemoteUser("hfre0"))
.getUserName());
}
@Test
public void testSubmitterResolver() throws Exception {
final UserResolver rslv = new SubmitterUserResolver();
assertFalse(rslv.needsTargetUsersList());
UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
assertEquals(ugi, rslv.getTargetUgi((UserGroupInformation)null));
}
}