HBASE-8350 enable ChaosMonkey to run commands as different users

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1469551 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
sershe 2013-04-18 20:28:20 +00:00
parent 21f3899165
commit b7391e5449
2 changed files with 31 additions and 20 deletions

View File

@ -24,6 +24,7 @@ import java.util.Map;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseClusterManager.CommandProvider.Operation; import org.apache.hadoop.hbase.HBaseClusterManager.CommandProvider.Operation;
import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.Pair;
import org.apache.hadoop.util.Shell; import org.apache.hadoop.util.Shell;
@ -37,16 +38,33 @@ import org.apache.hadoop.util.Shell;
*/ */
@InterfaceAudience.Private @InterfaceAudience.Private
public class HBaseClusterManager extends ClusterManager { public class HBaseClusterManager extends ClusterManager {
private String sshUserName;
private String sshOptions;
@Override
public void setConf(Configuration conf) {
super.setConf(conf);
if (conf == null) {
// Configured gets passed null before real conf. Why? I don't know.
return;
}
sshUserName = conf.get("hbase.it.clustermanager.ssh.user", "");
String extraSshOptions = conf.get("hbase.it.clustermanager.ssh.opts", "");
sshOptions = System.getenv("HBASE_SSH_OPTS");
if (!extraSshOptions.isEmpty()) {
sshOptions = StringUtils.join(new Object[] { sshOptions, extraSshOptions }, " ");
}
LOG.info("Running with SSH user [" + sshUserName + "] and options [" + sshOptions + "]");
}
/** /**
* Executes commands over SSH * Executes commands over SSH
*/ */
static class RemoteShell extends Shell.ShellCommandExecutor { protected class RemoteShell extends Shell.ShellCommandExecutor {
private String hostname; private String hostname;
private String sshCmd = "/usr/bin/ssh"; private String sshCmd = "/usr/bin/ssh";
private String sshOptions = System.getenv("HBASE_SSH_OPTS"); //from conf/hbase-env.sh
public RemoteShell(String hostname, String[] execString, File dir, Map<String, String> env, public RemoteShell(String hostname, String[] execString, File dir, Map<String, String> env,
long timeout) { long timeout) {
@ -71,11 +89,12 @@ public class HBaseClusterManager extends ClusterManager {
@Override @Override
public String[] getExecString() { public String[] getExecString() {
String userAndHost = sshUserName.isEmpty() ? hostname : (sshUserName + "@" + hostname);
return new String[] { return new String[] {
"bash", "-c", "bash", "-c",
StringUtils.join(new String[] { sshCmd, StringUtils.join(new String[] { sshCmd,
sshOptions == null ? "" : sshOptions, (sshOptions == null) ? "" : sshOptions,
hostname, userAndHost,
"\"" + StringUtils.join(super.getExecString(), " ") + "\"" "\"" + StringUtils.join(super.getExecString(), " ") + "\""
}, " ")}; }, " ")};
} }
@ -84,22 +103,6 @@ public class HBaseClusterManager extends ClusterManager {
public void execute() throws IOException { public void execute() throws IOException {
super.execute(); super.execute();
} }
public void setSshCmd(String sshCmd) {
this.sshCmd = sshCmd;
}
public void setSshOptions(String sshOptions) {
this.sshOptions = sshOptions;
}
public String getSshCmd() {
return sshCmd;
}
public String getSshOptions() {
return sshOptions;
}
} }
/** /**

View File

@ -665,6 +665,14 @@ cluster uniformly, <code>IntegrationTestingUtility</code>, and <code>HBaseCluste
and public client API's can be used. and public client API's can be used.
</para> </para>
<para>
On a distributed cluster, integration tests that use ChaosMonkey or otherwise manipulate services thru cluster manager (e.g. restart regionservers) use SSH to do it.
To run these, test process should be able to run commands on remote end, so ssh should be configured accordingly (for example, if HBase runs under hbase
user in your cluster, you can set up passwordless ssh for that user and run the test also under it). To facilitate that, <code>hbase.it.clustermanager.ssh.user</code> and
<code>hbase.it.clustermanager.ssh.opts</code> configuration settings can be used. The former is the remote user that cluster manager should use to perform ssh commands.
The latter contains additional options that are passed to SSH (for example, "-i /tmp/my-key").
</para>
<section xml:id="maven.build.commands.integration.tests.mini"> <section xml:id="maven.build.commands.integration.tests.mini">
<title>Running integration tests against mini cluster</title> <title>Running integration tests against mini cluster</title>
<para>HBase 0.92 added a <varname>verify</varname> maven target. <para>HBase 0.92 added a <varname>verify</varname> maven target.