Merge pull request #33279 from rishabh-d-dave/fs-move-run_shell-and-related-methods

qa/cephfs: move run_shell to mount.py and add methods for negative testing
This commit is contained in:
Gregory Farnum 2020-03-27 12:59:43 -07:00 committed by GitHub
commit 60504bd048
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 78 additions and 130 deletions

View File

@ -193,15 +193,85 @@ class CephFSMount(object):
return six.ensure_str(p.stdout.getvalue().strip())
def run_shell(self, args, wait=True, stdin=None, check_status=True,
omit_sudo=True):
if isinstance(args, str):
args = args.split()
cwd=None, omit_sudo=True):
args = args.split() if isinstance(args, str) else args
if not cwd:
cwd = self.mountpoint
args = ["cd", self.mountpoint, run.Raw('&&'), "sudo"] + args
return self.client_remote.run(args=args, stdout=BytesIO(),
stderr=BytesIO(), wait=wait,
stdin=stdin, check_status=check_status,
omit_sudo=omit_sudo)
return self.client_remote.run(args=args, stdin=stdin, wait=wait,
stdout=BytesIO(), stderr=BytesIO(),
cwd=cwd, check_status=check_status)
def run_as_user(self, args, user, wait=True, stdin=None,
check_status=True, cwd=None):
if isinstance(args, str):
args = 'sudo -u %s -s /bin/bash -c %s' % (user, args)
elif isinstance(args, list):
cmdlist = args
cmd = ''
for i in cmdlist:
cmd = cmd + i + ' '
args = ['sudo', '-u', user, '-s', '/bin/bash', '-c']
args.append(cmd)
if not cwd:
cwd = self.mountpoint
return self.client_remote.run(args=args, wait=wait, stdin=stdin,
stdout=BytesIO(), stderr=BytesIO(),
check_status=check_status, cwd=cwd)
def run_as_root(self, args, wait=True, stdin=None, check_status=True,
cwd=None):
if isinstance(args, str):
args = 'sudo ' + args
if isinstance(args, list):
args.insert(0, 'sudo')
if not cwd:
cwd = self.mountpoint
return self.client_remote.run(args=args, wait=wait, stdin=stdin,
stdout=BytesIO(), stderr=BytesIO(),
check_status=check_status, cwd=cwd)
def _verify(self, proc, retval=None, errmsg=None):
if retval:
msg = ('expected return value: {}\nreceived return value: '
'{}\n'.format(retval, proc.returncode))
assert proc.returncode == retval, msg
if errmsg:
stderr = proc.stderr.getvalue().lower()
msg = ('didn\'t find given string in stderr -\nexpected string: '
'{}\nreceived error message: {}\nnote: received error '
'message is converted to lowercase'.format(errmsg, stderr))
assert errmsg in stderr, msg
def negtestcmd(self, args, retval=None, errmsg=None, stdin=None,
cwd=None, wait=True):
"""
Conduct a negative test for the given command.
retval and errmsg are parameters to confirm the cause of command
failure.
"""
proc = self.run_shell(args=args, wait=wait, stdin=stdin, cwd=cwd,
check_status=False)
self._verify(proc, retval, errmsg)
return proc
def negtestcmd_as_user(self, args, user, retval=None, errmsg=None,
stdin=None, cwd=None, wait=True):
proc = self.run_as_user(args=args, user=user, wait=wait, stdin=stdin,
cwd=cwd, check_status=False)
self._verify(proc, retval, errmsg)
return proc
def negtestcmd_as_root(self, args, retval=None, errmsg=None, stdin=None,
cwd=None, wait=True):
proc = self.run_as_root(args=args, wait=wait, stdin=stdin, cwd=cwd,
check_status=False)
self._verify(proc, retval, errmsg)
return proc
def open_no_data(self, basename):
"""

View File

@ -502,7 +502,6 @@ def safe_kill(pid):
else:
raise
class LocalKernelMount(KernelMount):
def __init__(self, ctx, test_dir, client_id):
super(LocalKernelMount, self).__init__(ctx, test_dir, client_id, LocalRemote(), None, None, None)
@ -522,67 +521,6 @@ class LocalKernelMount(KernelMount):
else:
return keyring_path
def run_shell(self, args, wait=True, stdin=None, check_status=True,
omit_sudo=False):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.client_remote.run(args=args, wait=wait, cwd=self.mountpoint,
stdin=stdin, check_status=check_status,
omit_sudo=omit_sudo)
def run_as_user(self, args, user, wait=True, stdin=None, check_status=True):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
if isinstance(args, str):
args = 'sudo -u %s -s /bin/bash -c %s' % (user, args)
elif isinstance(args, list):
cmdlist = args
cmd = ''
for i in cmdlist:
cmd = cmd + i + ' '
args = ['sudo', '-u', user, '-s', '/bin/bash', '-c']
args.append(cmd)
return self.client_remote.run(args=args, wait=wait, cwd=self.mountpoint,
check_status=check_status, stdin=stdin,
omit_sudo=False)
def run_as_root(self, args, wait=True, stdin=None, check_status=True):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
if isinstance(args, str):
args = 'sudo ' + args
if isinstance(args, list):
args.insert(0, 'sudo')
return self.client_remote.run(args=args, wait=wait, cwd=self.mountpoint,
check_status=check_status,
omit_sudo=False)
def testcmd(self, args, wait=True, stdin=None, omit_sudo=False):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.run_shell(args, wait=wait, stdin=stdin, check_status=False,
omit_sudo=omit_sudo)
def testcmd_as_user(self, args, user, wait=True, stdin=None):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.run_as_user(args, user=user, wait=wait, stdin=stdin,
check_status=False)
def testcmd_as_root(self, args, wait=True, stdin=None):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.run_as_root(args, wait=wait, stdin=stdin,
check_status=False)
def setupfs(self, name=None):
if name is None and self.fs is not None:
# Previous mount existed, reuse the old name
@ -711,66 +649,6 @@ class LocalFuseMount(FuseMount):
# to avoid assumptions about daemons' pwd
return os.path.abspath("./client.{0}.keyring".format(self.client_id))
def run_shell(self, args, wait=True, stdin=None, check_status=True, omit_sudo=True):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.client_remote.run(args=args, wait=wait, cwd=self.mountpoint,
stdin=stdin, check_status=check_status,
omit_sudo=omit_sudo)
def run_as_user(self, args, user, wait=True, stdin=None, check_status=True):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
if isinstance(args, str):
args = 'sudo -u %s -s /bin/bash -c %s' % (user, args)
elif isinstance(args, list):
cmdlist = args
cmd = ''
for i in cmdlist:
cmd = cmd + i + ' '
args = ['sudo', '-u', user, '-s', '/bin/bash', '-c']
args.append(cmd)
return self.client_remote.run(args=args, wait=wait, cwd=self.mountpoint,
check_status=check_status, stdin=stdin,
omit_sudo=False)
def run_as_root(self, args, wait=True, stdin=None, check_status=True):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
if isinstance(args, str):
args = 'sudo ' + args
if isinstance(args, list):
args.insert(0, 'sudo')
return self.client_remote.run(args=args, wait=wait, cwd=self.mountpoint,
check_status=check_status,
omit_sudo=False)
def testcmd(self, args, wait=True, stdin=None, omit_sudo=True):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.run_shell(args, wait=wait, stdin=stdin, check_status=False,
omit_sudo=omit_sudo)
def testcmd_as_user(self, args, user, wait=True, stdin=None):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.run_as_user(args, user=user, wait=wait, stdin=stdin,
check_status=False)
def testcmd_as_root(self, args, wait=True, stdin=None):
# FIXME maybe should add a pwd arg to teuthology.orchestra so that
# the "cd foo && bar" shenanigans isn't needed to begin with and
# then we wouldn't have to special case this
return self.run_as_root(args, wait=wait, stdin=stdin,
check_status=False)
def setupfs(self, name=None):
if name is None and self.fs is not None:
# Previous mount existed, reuse the old name