Always log stdout and stderr of CLI commands
Currently it was logged only when cli subprocess call itself
failed, so there was not enough debug output when asserts/test cases
failed.
Also stderr was logged only when it was merged to the stdout (almost
never).
Now we also don't have any use for check_output method anymore,
as cli.cmd() always captures the stderr,
whatever if for logging or merged into stdout for tests.
Also fixes invalid log.warning on newline at the end of ascii table.
Change-Id: I5251a06018e8bf79c30ad84f8f0ed8aac797f832
diff --git a/tempest/cli/__init__.py b/tempest/cli/__init__.py
index 08f585a..cbb8d08 100644
--- a/tempest/cli/__init__.py
+++ b/tempest/cli/__init__.py
@@ -101,31 +101,30 @@
flags = creds + ' ' + flags
return self.cmd(cmd, action, flags, params, fail_ok)
- def check_output(self, cmd, **kwargs):
- # substitutes subprocess.check_output which is not in python2.6
- kwargs['stdout'] = subprocess.PIPE
- proc = subprocess.Popen(cmd, **kwargs)
- output = proc.communicate()[0]
- if proc.returncode != 0:
- raise CommandFailed(proc.returncode, cmd, output)
- return output
-
def cmd(self, cmd, action, flags='', params='', fail_ok=False,
merge_stderr=False):
"""Executes specified command for the given action."""
cmd = ' '.join([os.path.join(CONF.cli.cli_dir, cmd),
flags, action, params])
LOG.info("running: '%s'" % cmd)
+ cmd_str = cmd
cmd = shlex.split(cmd)
+ result = ''
+ result_err = ''
try:
- if merge_stderr:
- result = self.check_output(cmd, stderr=subprocess.STDOUT)
- else:
- with open('/dev/null', 'w') as devnull:
- result = self.check_output(cmd, stderr=devnull)
- except subprocess.CalledProcessError as e:
- LOG.error("command output:\n%s" % e.output)
- raise
+ stdout = subprocess.PIPE
+ stderr = subprocess.STDOUT if merge_stderr else subprocess.PIPE
+ proc = subprocess.Popen(
+ cmd, stdout=stdout, stderr=stderr)
+ result, result_err = proc.communicate()
+ if not fail_ok and proc.returncode != 0:
+ raise CommandFailed(proc.returncode,
+ cmd,
+ result)
+ finally:
+ LOG.debug('output of %s:\n%s' % (cmd_str, result))
+ if not merge_stderr and result_err:
+ LOG.debug('error output of %s:\n%s' % (cmd_str, result_err))
return result
def assertTableStruct(self, items, field_names):
diff --git a/tempest/cli/output_parser.py b/tempest/cli/output_parser.py
index bfd7f9e..f22ec4e 100644
--- a/tempest/cli/output_parser.py
+++ b/tempest/cli/output_parser.py
@@ -133,6 +133,10 @@
if not isinstance(output_lines, list):
output_lines = output_lines.split('\n')
+ if not output_lines[-1]:
+ # skip last line if empty (just newline at the end)
+ output_lines = output_lines[:-1]
+
for line in output_lines:
if delimiter_line.match(line):
columns = _table_columns(line)