From: Rishabh Dave Date: Wed, 10 Jun 2020 09:55:53 +0000 (+0530) Subject: vstart_runner: set default values of stdout and stderr to None X-Git-Tag: v14.2.17~28^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=83ef48cfc448c40e3324402c555fdb22f011a852;p=ceph.git vstart_runner: set default values of stdout and stderr to None Not doing so leads to tests run successfully with vstart_runner.py but crash when triggered with teuthology since the default values of these variables there is None. Fixes: https://tracker.ceph.com/issues/45815 Signed-off-by: Rishabh Dave --- diff --git a/qa/tasks/ceph_manager.py b/qa/tasks/ceph_manager.py index 36d44259c9cd..f31c4234a969 100644 --- a/qa/tasks/ceph_manager.py +++ b/qa/tasks/ceph_manager.py @@ -1154,17 +1154,18 @@ class CephManager: 'ceph-coverage', '{tdir}/archive/coverage'.format(tdir=testdir), 'timeout', - '900', + '120', 'ceph', '--cluster', self.cluster, + '--log-early', ] ceph_args.extend(args) proc = self.controller.run( args=ceph_args, - stdout=BytesIO(), + stdout=StringIO(), ) - return six.ensure_str(proc.stdout.getvalue()) + return proc.stdout.getvalue() def raw_cluster_cmd_result(self, *args, **kwargs): """ diff --git a/qa/tasks/vstart_runner.py b/qa/tasks/vstart_runner.py index f815c9e6f88d..5e66dafb04bf 100644 --- a/qa/tasks/vstart_runner.py +++ b/qa/tasks/vstart_runner.py @@ -144,8 +144,13 @@ class LocalRemoteProcess(object): def __init__(self, args, subproc, check_status, stdout, stderr): self.args = args self.subproc = subproc - self.stdout = stdout or BytesIO() - self.stderr = stderr or BytesIO() + self.stdout = stdout + self.stderr = stderr + # this variable is meant for instance of this class named fuse_daemon. + # child process of the command launched with sudo must be killed, + # since killing parent process alone has no impact on the child + # process. + self.fuse_pid = -1 self.check_status = check_status self.exitstatus = self.returncode = None @@ -162,10 +167,14 @@ class LocalRemoteProcess(object): out, err = self.subproc.communicate() if isinstance(self.stdout, StringIO): self.stdout.write(out.decode(errors='ignore')) + elif self.stdout is None: + pass else: self.stdout.write(out) if isinstance(self.stderr, StringIO): self.stderr.write(err.decode(errors='ignore')) + elif self.stderr is None: + pass else: self.stderr.write(err) @@ -185,8 +194,18 @@ class LocalRemoteProcess(object): if self.subproc.poll() is not None: out, err = self.subproc.communicate() - self.stdout.write(out) - self.stderr.write(err) + if isinstance(self.stdout, StringIO): + self.stdout.write(out.decode(errors='ignore')) + elif self.stdout is None: + pass + else: + self.stdout.write(out) + if isinstance(self.stderr, StringIO): + self.stderr.write(err.decode(errors='ignore')) + elif self.stderr is None: + pass + else: + self.stderr.write(err) self.exitstatus = self.returncode = self.subproc.returncode return True else: @@ -347,9 +366,9 @@ class LocalDaemon(object): """ Return PID as an integer or None if not found """ - ps_txt = six.ensure_str(self.controller.run( - args=["ps", "ww", "-u"+str(os.getuid())] - ).stdout.getvalue()).strip() + ps_txt = self.controller.run(args=["ps", "ww", "-u"+str(os.getuid())], + stdout=StringIO()).\ + stdout.getvalue().strip() lines = ps_txt.split("\n")[1:] for line in lines: @@ -494,15 +513,14 @@ class LocalFuseMount(FuseMount): args=["mount", "-t", "fusectl", "/sys/fs/fuse/connections", "/sys/fs/fuse/connections"], check_status=False ) - p = self.client_remote.run( - args=["ls", "/sys/fs/fuse/connections"], - check_status=False - ) + + p = self.client_remote.run(args=["ls", "/sys/fs/fuse/connections"], + check_status=False, stdout=StringIO()) if p.exitstatus != 0: log.warning("ls conns failed with {0}, assuming none".format(p.exitstatus)) return [] - ls_str = six.ensure_str(p.stdout.getvalue().strip()) + ls_str = p.stdout.getvalue().strip() if ls_str: return [int(n) for n in ls_str.split("\n")] else: @@ -571,7 +589,7 @@ class LocalFuseMount(FuseMount): to make the process killable. """ return self.client_remote.run(args=[py_version, '-c', pyscript], - wait=False) + wait=False, stdout=StringIO()) class LocalCephManager(CephManager): def __init__(self): @@ -616,9 +634,9 @@ class LocalCephManager(CephManager): args like ["osd", "dump"} return stdout string """ - proc = self.controller.run(args=[os.path.join(BIN_PREFIX, "ceph")] + \ - list(args), **kwargs) - return six.ensure_str(proc.stdout.getvalue()) + proc = self.controller.run(args=[os.path.join(BIN_PREFIX, "ceph")] +\ + list(args), **kwargs, stdout=StringIO()) + return proc.stdout.getvalue() def raw_cluster_cmd_result(self, *args, **kwargs): """ @@ -628,12 +646,15 @@ class LocalCephManager(CephManager): proc = self.controller.run([os.path.join(BIN_PREFIX, "ceph")] + list(args), **kwargs) return proc.exitstatus - def admin_socket(self, daemon_type, daemon_id, command, check_status=True, timeout=None): + def admin_socket(self, daemon_type, daemon_id, command, check_status=True, + timeout=None, stdout=None): + if stdout is None: + stdout = StringIO() + return self.controller.run( - args=[os.path.join(BIN_PREFIX, "ceph"), "daemon", "{0}.{1}".format(daemon_type, daemon_id)] + command, - check_status=check_status, - timeout=timeout - ) + args=[os.path.join(BIN_PREFIX, "ceph"), "daemon", + "{0}.{1}".format(daemon_type, daemon_id)] + command, + check_status=check_status, timeout=timeout, stdout=stdout) class LocalCephCluster(CephCluster): @@ -934,10 +955,8 @@ def exec_test(): remote = LocalRemote() # Tolerate no MDSs or clients running at start - ps_txt = six.ensure_str(remote.run( - args=["ps", "-u"+str(os.getuid())], - stdout=StringIO() - ).stdout.getvalue().strip()) + ps_txt = remote.run(args=["ps", "-u"+str(os.getuid())], + stdout=StringIO()).stdout.getvalue().strip() lines = ps_txt.split("\n")[1:] for line in lines: if 'ceph-fuse' in line or 'ceph-mds' in line: @@ -1000,9 +1019,9 @@ def exec_test(): p = remote.run(args=[os.path.join(BIN_PREFIX, "ceph"), "auth", "get-or-create", client_name, "osd", "allow rw", "mds", "allow", - "mon", "allow r"]) + "mon", "allow r"], stdout=StringIO()) - open("./keyring", "ab").write(p.stdout.getvalue()) + open("./keyring", "at").write(p.stdout.getvalue()) mount = LocalFuseMount(ctx, test_dir, client_id) mounts.append(mount)