| /** |
| * 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.system.process; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.apache.hadoop.test.system.process.HadoopDaemonRemoteCluster.HadoopDaemonInfo; |
| |
| public abstract class MultiUserHadoopDaemonRemoteCluster |
| extends HadoopDaemonRemoteCluster { |
| |
| public MultiUserHadoopDaemonRemoteCluster(List<HadoopDaemonInfo> daemonInfos) { |
| super(daemonInfos); |
| } |
| |
| @Override |
| protected RemoteProcess getProcessManager( |
| HadoopDaemonInfo info, String hostName) { |
| return new MultiUserScriptDaemon(info.cmd, hostName, info.role); |
| } |
| |
| @Override |
| public boolean isMultiUserSupported() throws IOException { |
| return true; |
| } |
| |
| class MultiUserScriptDaemon extends ScriptDaemon { |
| |
| private static final String MULTI_USER_BINARY_PATH_KEY = |
| "test.system.hdrc.multi-user.binary.path"; |
| private static final String MULTI_USER_MANAGING_USER = |
| "test.system.hdrc.multi-user.managinguser."; |
| private String binaryPath; |
| /** |
| * Manging user for a particular daemon is gotten by |
| * MULTI_USER_MANAGING_USER + daemonname |
| */ |
| private String mangingUser; |
| |
| public MultiUserScriptDaemon( |
| String daemonName, String hostName, Enum<?> role) { |
| super(daemonName, hostName, role); |
| initialize(daemonName); |
| } |
| |
| private void initialize(String daemonName) { |
| binaryPath = conf.get(MULTI_USER_BINARY_PATH_KEY); |
| if (binaryPath == null || binaryPath.trim().isEmpty()) { |
| throw new IllegalArgumentException( |
| "Binary path for multi-user path is not present. Please set " |
| + MULTI_USER_BINARY_PATH_KEY + " correctly"); |
| } |
| File binaryFile = new File(binaryPath); |
| if (!binaryFile.exists() || !binaryFile.canExecute()) { |
| throw new IllegalArgumentException( |
| "Binary file path is not configured correctly. Please set " |
| + MULTI_USER_BINARY_PATH_KEY |
| + " to properly configured binary file."); |
| } |
| mangingUser = conf.get(MULTI_USER_MANAGING_USER + daemonName); |
| if (mangingUser == null || mangingUser.trim().isEmpty()) { |
| throw new IllegalArgumentException( |
| "Manging user for daemon not present please set : " |
| + MULTI_USER_MANAGING_USER + daemonName + " to correct value."); |
| } |
| } |
| |
| @Override |
| protected String[] getCommand(String command,String confDir) { |
| ArrayList<String> commandList = new ArrayList<String>(); |
| commandList.add(binaryPath); |
| commandList.add(mangingUser); |
| commandList.add(hostName); |
| commandList.add("--config " |
| + confDir + " " + command + " " + daemonName); |
| return (String[]) commandList.toArray(new String[commandList.size()]); |
| } |
| } |
| } |