From 968f1b3a0ba6f98e987ff1def82e08d05935e12f Mon Sep 17 00:00:00 2001 From: David Kranz Date: Thu, 18 Jun 2015 16:58:18 -0400 Subject: [PATCH] Provide a config option to customize remote shell command Our remote ssh code makes all kinds of assumptions about the shell and path of the guest. Recently some code was added to the command to generate errors more promptly but it does not work if the shell is /bin/sh. This commit allows the user to configure tempest with a desired prologue to handle this case. It does nothing to solve the more general problem and, like the other image-related options, cannot be customized individually for various images that tempest may use. Debug logging of remote commands was also added. Change-Id: I669dd4386ffb539dad88a9487bef6c172b5d65fa Closes-Bug: #1465682 --- etc/tempest.conf.sample | 4 ++++ tempest/common/utils/linux/remote_client.py | 6 +++++- tempest/config.py | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/etc/tempest.conf.sample b/etc/tempest.conf.sample index 6424f55550..4fe7044a79 100644 --- a/etc/tempest.conf.sample +++ b/etc/tempest.conf.sample @@ -254,6 +254,10 @@ # value) #build_timeout = 300 +# Shell fragments to use before executing a command when sshing to a +# guest. (string value) +#ssh_shell_prologue = set -eu -o pipefail; PATH=$$PATH:/sbin; + # Auth method used for authenticate to the instance. Valid choices # are: keypair, configured, adminpass and disabled. Keypair: start the # servers with a ssh keypair. Configured: use the configured user and diff --git a/tempest/common/utils/linux/remote_client.py b/tempest/common/utils/linux/remote_client.py index 4b3995b261..d4e6eb86dc 100644 --- a/tempest/common/utils/linux/remote_client.py +++ b/tempest/common/utils/linux/remote_client.py @@ -14,6 +14,7 @@ import netaddr import re import time +from oslo_log import log as logging import six from tempest_lib.common import ssh @@ -22,6 +23,8 @@ from tempest import exceptions CONF = config.CONF +LOG = logging.getLogger(__name__) + class RemoteClient(object): @@ -48,7 +51,8 @@ class RemoteClient(object): def exec_command(self, cmd): # Shell options below add more clearness on failures, # path is extended for some non-cirros guest oses (centos7) - cmd = "set -eu -o pipefail; PATH=$PATH:/sbin; " + cmd + cmd = CONF.compute.ssh_shell_prologue + " " + cmd + LOG.debug("Remote command: %s" % cmd) return self.ssh_client.exec_command(cmd) def validate_authentication(self): diff --git a/tempest/config.py b/tempest/config.py index 0fa5bf55c2..fc5572303f 100644 --- a/tempest/config.py +++ b/tempest/config.py @@ -206,6 +206,10 @@ ComputeGroup = [ help="Timeout in seconds to wait for an instance to build. " "Other services that do not define build_timeout will " "inherit this value."), + cfg.StrOpt('ssh_shell_prologue', + default="set -eu -o pipefail; PATH=$$PATH:/sbin;", + help="Shell fragments to use before executing a command " + "when sshing to a guest."), cfg.StrOpt('ssh_auth_method', default='keypair', help="Auth method used for authenticate to the instance. "