提交 ddd53768 编写于 作者: L Lukáš Doktor

avocado: Documentation, code style and PEP8 fixes

No actual change, only:
1) imports are ordered global->local and alphabetically
2) 80 lines length (sorry guys, my debug screen is small)
3) added couple of docstrings.
Signed-off-by: NLukáš Doktor <ldoktor@redhat.com>
上级 396a3a45
......@@ -14,21 +14,23 @@
"""Run tests on a remote machine."""
import os
import getpass
import json
import os
from avocado.core import status
from avocado.core import data_dir
from avocado.runner import TestRunner
from avocado.result import TestResult
from avocado.core import status
from avocado.plugins import plugin
from avocado.utils import remote
from avocado.utils import archive
from avocado.result import TestResult
from avocado.runner import TestRunner
from avocado.test import RemoteTest
from avocado.utils import archive
from avocado.utils import remote
class RemoteTestRunner(TestRunner):
""" Tooled TestRunner to run on remote machine using ssh """
remote_test_dir = '~/avocado/tests'
def run_test(self, urls):
......@@ -38,8 +40,10 @@ class RemoteTestRunner(TestRunner):
:param urls: a string with test URLs.
:return: a dictionary with test results.
"""
avocado_cmd = ('cd %s; avocado run --force-job-id %s --json - --archive %s' %
(self.remote_test_dir, self.result.stream.job_unique_id, " ".join(urls)))
avocado_cmd = ('cd %s; avocado run --force-job-id %s --json - '
'--archive %s' % (self.remote_test_dir,
self.result.stream.job_unique_id,
" ".join(urls)))
result = self.result.remote.run(avocado_cmd, ignore_status=True)
for json_output in result.stdout.splitlines():
# We expect dictionary:
......@@ -59,6 +63,7 @@ class RemoteTestRunner(TestRunner):
:return: a list of test failures.
"""
del test_suite # using self.result.urls instead
failures = []
self.result.setup()
results = self.run_test(self.result.urls)
......@@ -77,7 +82,8 @@ class RemoteTestRunner(TestRunner):
failures.append(state['tagged_name'])
local_log_dir = os.path.dirname(self.result.stream.debuglog)
zip_filename = remote_log_dir + '.zip'
zip_path_filename = os.path.join(local_log_dir, os.path.basename(zip_filename))
zip_path_filename = os.path.join(local_log_dir,
os.path.basename(zip_filename))
self.result.remote.receive_files(local_log_dir, zip_filename)
archive.uncompress(zip_path_filename, local_log_dir)
os.remove(zip_path_filename)
......@@ -108,6 +114,11 @@ class RemoteTestResult(TestResult):
self.command_line_arg_name = '--remote-hostname'
def _copy_tests(self):
"""
Gather test's directories and copy them recursively to
$remote_test_dir + $test_absolute_path.
:note: Default tests execution is translated into absolute paths too
"""
# TODO: Use `avocado.loader.TestLoader` instead
self.remote.makedir(self.remote_test_dir)
paths = set()
......@@ -129,9 +140,12 @@ class RemoteTestResult(TestResult):
previous = path
def setup(self):
self.stream.notify(event='message', msg="REMOTE LOGIN : %s@%s:%d" % (self.args.remote_username,
self.args.remote_hostname,
self.args.remote_port))
""" Setup remote environment and copy test's directories """
self.stream.notify(event='message',
msg=("REMOTE LOGIN : %s@%s:%d"
% (self.args.remote_username,
self.args.remote_hostname,
self.args.remote_port)))
self.remote = remote.Remote(self.args.remote_hostname,
self.args.remote_username,
self.args.remote_password,
......@@ -140,6 +154,7 @@ class RemoteTestResult(TestResult):
self._copy_tests()
def tear_down(self):
""" Cleanup after test execution """
pass
def start_tests(self):
......@@ -147,26 +162,36 @@ class RemoteTestResult(TestResult):
Called once before any tests are executed.
"""
TestResult.start_tests(self)
self.stream.notify(event='message', msg="JOB ID : %s" % self.stream.job_unique_id)
self.stream.notify(event='message', msg="JOB LOG : %s" % self.stream.logfile)
self.stream.notify(event='message',
msg="JOB ID : %s" % self.stream.job_unique_id)
self.stream.notify(event='message',
msg="JOB LOG : %s" % self.stream.logfile)
if self.args is not None:
if 'html_output' in self.args:
logdir = os.path.dirname(self.stream.logfile)
html_file = os.path.join(logdir, 'html', 'results.html')
self.stream.notify(event="message", msg="JOB HTML : %s" % html_file)
self.stream.notify(event='message', msg="TESTS : %s" % self.tests_total)
self.stream.notify(event="message",
msg="JOB HTML : %s" % html_file)
self.stream.notify(event='message',
msg="TESTS : %s" % self.tests_total)
self.stream.set_tests_info({'tests_total': self.tests_total})
def end_tests(self):
"""
Called once after all tests are executed.
"""
self.stream.notify(event='message', msg="PASS : %d" % len(self.passed))
self.stream.notify(event='message', msg="ERROR : %d" % len(self.errors))
self.stream.notify(event='message', msg="FAIL : %d" % len(self.failed))
self.stream.notify(event='message', msg="SKIP : %d" % len(self.skipped))
self.stream.notify(event='message', msg="WARN : %d" % len(self.warned))
self.stream.notify(event='message', msg="TIME : %.2f s" % self.total_time)
self.stream.notify(event='message',
msg="PASS : %d" % len(self.passed))
self.stream.notify(event='message',
msg="ERROR : %d" % len(self.errors))
self.stream.notify(event='message',
msg="FAIL : %d" % len(self.failed))
self.stream.notify(event='message',
msg="SKIP : %d" % len(self.skipped))
self.stream.notify(event='message',
msg="WARN : %d" % len(self.warned))
self.stream.notify(event='message',
msg="TIME : %.2f s" % self.total_time)
def start_test(self, test):
"""
......@@ -245,22 +270,26 @@ class RunRemote(plugin.Plugin):
self.enabled = False
return
username = getpass.getuser()
self.remote_parser = parser.runner.add_argument_group('run on a remote machine '
'arguments')
self.remote_parser.add_argument('--remote-hostname', dest='remote_hostname',
default=None,
help='Specify the hostname to login on remote machine')
msg = 'run on a remote machine arguments'
self.remote_parser = parser.runner.add_argument_group(msg)
self.remote_parser.add_argument('--remote-hostname',
dest='remote_hostname', default=None,
help='Specify the hostname to login on'
' remote machine')
self.remote_parser.add_argument('--remote-port', dest='remote_port',
default=22, type=int,
help='Specify the port number to login on remote machine. '
'Current: 22')
self.remote_parser.add_argument('--remote-username', dest='remote_username',
default=22, type=int, help='Specify '
'the port number to login on remote '
'machine. Current: 22')
self.remote_parser.add_argument('--remote-username',
dest='remote_username',
default=username,
help=('Specify the username to login on remote machine. '
'Current: %(default)s'))
self.remote_parser.add_argument('--remote-password', dest='remote_password',
default=None,
help='Specify the password to login on remote machine')
help='Specify the username to login on'
' remote machine. Current: '
'%(default)s')
self.remote_parser.add_argument('--remote-password',
dest='remote_password', default=None,
help='Specify the password to login on'
' remote machine')
self.configured = True
@staticmethod
......
......@@ -17,9 +17,9 @@
import getpass
from avocado.core import exceptions
from avocado.plugins.remote import RemoteTestRunner
from avocado.plugins.remote import RemoteTestResult
from avocado.plugins import plugin
from avocado.plugins.remote import RemoteTestResult
from avocado.plugins.remote import RemoteTestRunner
from avocado.utils import virt
......@@ -46,20 +46,25 @@ class VMTestResult(RemoteTestResult):
'--vm-hostname.')
self.stream.notify(event='error', msg=e_msg)
raise exceptions.TestSetupFail(e_msg)
self.stream.notify(event='message', msg="VM DOMAIN : %s" % self.args.vm_domain)
self.stream.notify(event='message', msg="VM DOMAIN : %s"
% self.args.vm_domain)
self.vm = virt.vm_connect(self.args.vm_domain,
self.args.vm_hypervisor_uri)
if self.vm is None:
self.stream.notify(event='error', msg="Could not connect to VM '%s'" % self.args.vm_domain)
self.stream.notify(event='error',
msg="Could not connect to VM '%s'"
% self.args.vm_domain)
raise exceptions.TestSetupFail()
if self.vm.start() is False:
self.stream.notify(event='error', msg="Could not start VM '%s'" % self.args.vm_domain)
self.stream.notify(event='error', msg="Could not start VM '%s'"
% self.args.vm_domain)
raise exceptions.TestSetupFail()
assert self.vm.domain.isActive() is not False
if self.args.vm_cleanup is True:
self.vm.create_snapshot()
if self.vm.snapshot is None:
self.stream.notify(event='error', msg="Could not create snapshot on VM '%s'" % self.args.vm_domain)
self.stream.notify(event='error', msg="Could not create "
"snapshot on VM '%s'" % self.args.vm_domain)
raise exceptions.TestSetupFail()
try:
# Finish remote setup and copy the tests
......@@ -93,8 +98,8 @@ class RunVM(plugin.Plugin):
return
username = getpass.getuser()
default_hypervisor_uri = 'qemu:///system'
self.vm_parser = parser.runner.add_argument_group('run on a libvirt domain '
'arguments')
self.vm_parser = parser.runner.add_argument_group('run on a libvirt '
'domain arguments')
self.vm_parser.add_argument('--vm-domain', dest='vm_domain',
help=('Specify Libvirt Domain Name'))
......@@ -115,8 +120,8 @@ class RunVM(plugin.Plugin):
self.vm_parser.add_argument('--vm-cleanup', dest='vm_cleanup',
action='store_true',
default=False,
help=('Restore VM to a previous state, before '
'running tests'))
help='Restore VM to a previous state, '
'before running tests')
self.configured = True
@staticmethod
......
......@@ -20,6 +20,10 @@ import getpass
import logging
import time
from avocado.core import exceptions
from avocado.core import output
from avocado.utils import process
LOG = logging.getLogger('avocado.test')
try:
......@@ -31,10 +35,6 @@ except ImportError:
else:
REMOTE_CAPABLE = True
from avocado.core import output
from avocado.core import exceptions
from avocado.utils import process
class Remote(object):
......@@ -72,6 +72,7 @@ class Remote(object):
@staticmethod
def _setup_environment(**kwargs):
""" Setup fabric environemnt """
fabric.api.env.update(kwargs)
def run(self, command, ignore_status=False, timeout=60):
......
......@@ -17,7 +17,9 @@ Module to provide classes for Virtual Machines.
"""
import logging
from xml.dom import minidom
from avocado.utils import remote
LOG = logging.getLogger('avocado.test')
try:
......@@ -28,8 +30,6 @@ except ImportError:
else:
VIRT_CAPABLE = True
from xml.dom import minidom
from avocado.utils import remote
if remote.REMOTE_CAPABLE is False:
VIRT_CAPABLE = False
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册