blob: 57af33664e61e7ee3df68129c77bf68cb98c6fc1 [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.test;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
/**
* Helper to configure FileSystemAccess user/group and proxyuser
* configuration for testing using Java System properties.
* <p/>
* It uses the {@link SysPropsForTestsLoader} to load JavaSystem
* properties for testing.
*/
public class HadoopUsersConfTestHelper {
static {
SysPropsForTestsLoader.init();
}
public static final String HADOOP_PROXYUSER = "test.hadoop.proxyuser";
public static final String HADOOP_PROXYUSER_HOSTS = "test.hadoop.proxyuser.hosts";
public static final String HADOOP_PROXYUSER_GROUPS = "test.hadoop.proxyuser.groups";
public static final String HADOOP_USER_PREFIX = "test.hadoop.user.";
/**
* Returns a valid FileSystemAccess proxyuser for the FileSystemAccess cluster.
* <p/>
* The user is read from the Java System property
* <code>test.hadoop.proxyuser</code> which defaults to the current user
* (java System property <code>user.name</code>).
* <p/>
* This property should be set in the <code>test.properties</code> file.
* <p/>
* When running FileSystemAccess minicluster it is used to configure the FileSystemAccess minicluster.
* <p/>
* When using an external FileSystemAccess cluster, it is expected this property is set to
* a valid proxy user.
*
* @return a valid FileSystemAccess proxyuser for the FileSystemAccess cluster.
*/
public static String getHadoopProxyUser() {
return System.getProperty(HADOOP_PROXYUSER, System.getProperty("user.name"));
}
/**
* Returns the hosts for the FileSystemAccess proxyuser settings.
* <p/>
* The hosts are read from the Java System property
* <code>test.hadoop.proxyuser.hosts</code> which defaults to <code>*</code>.
* <p/>
* This property should be set in the <code>test.properties</code> file.
* <p/>
* This property is ONLY used when running FileSystemAccess minicluster, it is used to
* configure the FileSystemAccess minicluster.
* <p/>
* When using an external FileSystemAccess cluster this property is ignored.
*
* @return the hosts for the FileSystemAccess proxyuser settings.
*/
public static String getHadoopProxyUserHosts() {
return System.getProperty(HADOOP_PROXYUSER_HOSTS, "*");
}
/**
* Returns the groups for the FileSystemAccess proxyuser settings.
* <p/>
* The hosts are read from the Java System property
* <code>test.hadoop.proxyuser.groups</code> which defaults to <code>*</code>.
* <p/>
* This property should be set in the <code>test.properties</code> file.
* <p/>
* This property is ONLY used when running FileSystemAccess minicluster, it is used to
* configure the FileSystemAccess minicluster.
* <p/>
* When using an external FileSystemAccess cluster this property is ignored.
*
* @return the groups for the FileSystemAccess proxyuser settings.
*/
public static String getHadoopProxyUserGroups() {
return System.getProperty(HADOOP_PROXYUSER_GROUPS, "*");
}
private static final String[] DEFAULT_USERS = new String[]{"user1", "user2"};
private static final String[] DEFAULT_USERS_GROUP = new String[]{"group1", "supergroup"};
/**
* Returns the FileSystemAccess users to be used for tests. These users are defined
* in the <code>test.properties</code> file in properties of the form
* <code>test.hadoop.user.#USER#=#GROUP1#,#GROUP2#,...</code>.
* <p/>
* These properties are used to configure the FileSystemAccess minicluster user/group
* information.
* <p/>
* When using an external FileSystemAccess cluster these properties should match the
* user/groups settings in the cluster.
*
* @return the FileSystemAccess users used for testing.
*/
public static String[] getHadoopUsers() {
List<String> users = new ArrayList<String>();
for (String name : System.getProperties().stringPropertyNames()) {
if (name.startsWith(HADOOP_USER_PREFIX)) {
users.add(name.substring(HADOOP_USER_PREFIX.length()));
}
}
return (users.size() != 0) ? users.toArray(new String[users.size()]) : DEFAULT_USERS;
}
/**
* Returns the groups a FileSystemAccess user belongs to during tests. These users/groups
* are defined in the <code>test.properties</code> file in properties of the
* form <code>test.hadoop.user.#USER#=#GROUP1#,#GROUP2#,...</code>.
* <p/>
* These properties are used to configure the FileSystemAccess minicluster user/group
* information.
* <p/>
* When using an external FileSystemAccess cluster these properties should match the
* user/groups settings in the cluster.
*
* @param user user name to get gropus.
*
* @return the groups of FileSystemAccess users used for testing.
*/
public static String[] getHadoopUserGroups(String user) {
if (getHadoopUsers() == DEFAULT_USERS) {
for (String defaultUser : DEFAULT_USERS) {
if (defaultUser.equals(user)) {
return DEFAULT_USERS_GROUP;
}
}
return new String[0];
} else {
String groups = System.getProperty(HADOOP_USER_PREFIX + user);
return (groups != null) ? groups.split(",") : new String[0];
}
}
public static Configuration getBaseConf() {
Configuration conf = new Configuration();
for (String name : System.getProperties().stringPropertyNames()) {
conf.set(name, System.getProperty(name));
}
return conf;
}
public static void addUserConf(Configuration conf) {
conf.set("hadoop.security.authentication", "simple");
conf.set("hadoop.proxyuser." + HadoopUsersConfTestHelper.getHadoopProxyUser() + ".hosts",
HadoopUsersConfTestHelper.getHadoopProxyUserHosts());
conf.set("hadoop.proxyuser." + HadoopUsersConfTestHelper.getHadoopProxyUser() + ".groups",
HadoopUsersConfTestHelper.getHadoopProxyUserGroups());
for (String user : HadoopUsersConfTestHelper.getHadoopUsers()) {
String[] groups = HadoopUsersConfTestHelper.getHadoopUserGroups(user);
UserGroupInformation.createUserForTesting(user, groups);
}
}
}