[Kimchi-devel] [PATCH] [Wok] Use callback instead of log file for run_command output
Aline Manera
alinefm at linux.vnet.ibm.com
Tue Jul 5 21:10:24 UTC 2016
On 07/05/2016 04:30 PM, Lucio Correia wrote:
> * Ignore empty messages
> * Simplify exception message
>
> Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
> ---
> src/wok/asynctask.py | 13 +++++--------
> src/wok/utils.py | 41 +++++++++++++----------------------------
> 2 files changed, 18 insertions(+), 36 deletions(-)
>
> diff --git a/src/wok/asynctask.py b/src/wok/asynctask.py
> index ec3fbc1..fb614a2 100644
> --- a/src/wok/asynctask.py
> +++ b/src/wok/asynctask.py
> @@ -46,15 +46,12 @@ class AsyncTask(object):
> self.thread.start()
>
> def _status_cb(self, message, success=None):
> - if success is None:
> - self.message = message
> - self._save_helper()
> - return
> -
> if success is not None:
> self.status = 'finished' if success else 'failed'
> - self.message = message
> - self._save_helper()
> +
> + if message.strip():
> + self.message = message
> + self._save_helper()
>
> def _save_helper(self):
> obj = {}
> @@ -73,4 +70,4 @@ class AsyncTask(object):
> except Exception, e:
> cherrypy.log.error_log.error("Error in async_task %s " % self.id)
> cherrypy.log.error_log.error(traceback.format_exc())
> - cb("Unexpected exception: %s" % e.message, False)
> + cb(e.message, False)
> diff --git a/src/wok/utils.py b/src/wok/utils.py
> index 4b3b0ac..d532f96 100644
> --- a/src/wok/utils.py
> +++ b/src/wok/utils.py
> @@ -175,16 +175,21 @@ def import_module(module_name, class_name=''):
> return __import__(module_name, globals(), locals(), [class_name])
>
>
> -def run_command(cmd, timeout=None, silent=False, tee=None,
> - env_vars=None):
> +def run_command(cmd, timeout=None, silent=False, out_cb=None, env_vars=None):
> """
> cmd is a sequence of command arguments.
> timeout is a float number in seconds.
> timeout default value is None, means command run without timeout.
> silent is bool, it will log errors using debug handler not error.
> silent default value is False.
> - tee is a file path to store the output of the command, like 'tee' command.
> - tee default value is None, means output will not be logged.
> + out_cb is a callback that receives the whole command output every time a
> + new line is thrown by command. Default value is None, meaning that whole
> + output will be returned at the end of execution.
> +
> + Returns a tuple (out, error, returncode) where:
> + out is the output thrown by command
> + error is an error message if applicable
> + returncode is an integer equal to the result of command execution
> """
> # subprocess.kill() can leave descendants running
> # and halting the execution. Using psutil to
> @@ -202,24 +207,6 @@ def run_command(cmd, timeout=None, silent=False, tee=None,
> else:
> timeout_flag[0] = True
>
> - # function to append the given msg into the log_file
> - def tee_log(msg=None, log_file=None):
> - if (msg is None) or (log_file is None):
> - return
> -
> - try:
> - f = open(log_file, 'a')
> - except IOError as e:
> - msg = "Failed to open file %s: " % log_file
> - wok_log.error("%s %s", msg, e)
> - return
> - msg += '\n'
> - try:
> - f.write(msg)
> - except TypeError:
> - f.write(msg.encode('utf_8'))
> - f.close()
> -
> proc = None
> timer = None
> timeout_flag = [False]
> @@ -239,9 +226,7 @@ def run_command(cmd, timeout=None, silent=False, tee=None,
> timer.start()
>
> wok_log.debug("Run command: '%s'", " ".join(cmd))
> - if tee is not None:
> - if os.path.exists(tee):
> - os.remove(tee)
> + if out_cb is not None:
> output = []
> while True:
> line = ""
> @@ -260,7 +245,7 @@ def run_command(cmd, timeout=None, silent=False, tee=None,
> if not line:
> break
> line = line.rstrip('\n\r')
> - tee_log(line, tee)
> + out_cb(''.join(output))
Question: can't we record the message (ie, line value) as is? do we
really need to append to a list (output) and the use .join()?
Also, the line
line = line.rstrip(...)
can be removed as it is not in use anymore.
> out = ''.join(output)
> error = proc.stderr.read()
> returncode = proc.poll()
> @@ -281,8 +266,8 @@ def run_command(cmd, timeout=None, silent=False, tee=None,
>
> else:
> wok_log.error(msg)
> - if tee is not None:
> - tee_log(msg, tee)
> + if out_cb is not None:
> + out_cb(msg)
> elif error:
> wok_log.debug("error: %s returned from cmd: %s",
> decode_value(error), decode_value(' '.join(cmd)))
More information about the Kimchi-devel
mailing list