04fd8ea1ba
Instead of accessing the logs list member of the remote host directly, use a function to add logs to the remote host to be collected after the test. This enables us to later have different implementation of remote hosts or logs collection without requiring to have this list as the implementation. Signed-off-by: Jonathan Afek <jonathanx.afek@intel.com>
104 lines
3.2 KiB
Python
104 lines
3.2 KiB
Python
# Host class
|
|
# Copyright (c) 2016, Qualcomm Atheros, Inc.
|
|
#
|
|
# This software may be distributed under the terms of the BSD license.
|
|
# See README for more details.
|
|
|
|
import logging
|
|
import subprocess
|
|
import threading
|
|
|
|
logger = logging.getLogger()
|
|
|
|
def execute_thread(command, reply):
|
|
cmd = ' '.join(command)
|
|
logger.debug("thread run: " + cmd)
|
|
try:
|
|
status = 0;
|
|
buf = subprocess.check_output(command, stderr=subprocess.STDOUT)
|
|
except subprocess.CalledProcessError as e:
|
|
status = e.returncode
|
|
buf = e.output
|
|
|
|
logger.debug("thread cmd: " + cmd)
|
|
logger.debug("thread exit status: " + str(status))
|
|
logger.debug("thread exit buf: " + str(buf))
|
|
reply.append(status)
|
|
reply.append(buf)
|
|
|
|
class Host():
|
|
def __init__(self, host=None, ifname=None, port=None, name="", user="root"):
|
|
self.host = host
|
|
self.name = name
|
|
self.user = user
|
|
self.monitors = []
|
|
self.monitor_thread = None
|
|
self.logs = []
|
|
self.ifname = ifname
|
|
self.port = port
|
|
self.dev = None
|
|
if self.name == "" and host != None:
|
|
self.name = host
|
|
|
|
def local_execute(self, command):
|
|
logger.debug("execute: " + str(command))
|
|
try:
|
|
status = 0;
|
|
buf = subprocess.check_output(command, stderr=subprocess.STDOUT)
|
|
except subprocess.CalledProcessError as e:
|
|
status = e.returncode
|
|
buf = e.output
|
|
|
|
logger.debug("status: " + str(status))
|
|
logger.debug("buf: " + str(buf))
|
|
return status, buf
|
|
|
|
def execute(self, command):
|
|
if self.host is None:
|
|
return self.local_execute(command)
|
|
|
|
cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)]
|
|
_cmd = self.name + " execute: " + ' '.join(cmd)
|
|
logger.debug(_cmd)
|
|
try:
|
|
status = 0
|
|
buf = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
|
|
except subprocess.CalledProcessError as e:
|
|
status = e.returncode
|
|
buf = e.output
|
|
|
|
logger.debug(self.name + " status: " + str(status))
|
|
logger.debug(self.name + " buf: " + str(buf))
|
|
return status, buf
|
|
|
|
# async execute
|
|
def execute_run(self, command, res):
|
|
if self.host is None:
|
|
cmd = command
|
|
else:
|
|
cmd = ["ssh", self.user + "@" + self.host, ' '.join(command)]
|
|
_cmd = self.name + " execute_run: " + ' '.join(cmd)
|
|
logger.debug(_cmd)
|
|
t = threading.Thread(target = execute_thread, args=(cmd, res))
|
|
t.start()
|
|
return t
|
|
|
|
def wait_execute_complete(self, t, wait=None):
|
|
if wait == None:
|
|
wait_str = "infinite"
|
|
else:
|
|
wait_str = str(wait) + "s"
|
|
|
|
logger.debug(self.name + " wait_execute_complete(" + wait_str + "): ")
|
|
if t.isAlive():
|
|
t.join(wait)
|
|
|
|
def add_log(self, log_file):
|
|
self.logs.append(log_file)
|
|
|
|
def get_logs(self, local_log_dir=None):
|
|
for log in self.logs:
|
|
if local_log_dir:
|
|
self.local_execute(["scp", self.user + "@[" + self.host + "]:" + log, local_log_dir])
|
|
self.execute(["rm", log])
|
|
del self.logs[:]
|