|
Packit Service |
a04d08 |
# This file is part of cloud-init. See LICENSE file for license information.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
"""Stage a run."""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
import sys
|
|
Packit Service |
a04d08 |
import time
|
|
Packit Service |
a04d08 |
import traceback
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
from tests.cloud_tests import LOG
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
class PlatformComponent(object):
|
|
Packit Service |
a04d08 |
"""Context manager to safely handle platform components."""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def __init__(self, get_func, preserve_instance=False):
|
|
Packit Service |
a04d08 |
"""Store get_<platform component> function as partial with no args.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@param get_func: Callable returning an instance from the platform.
|
|
Packit Service |
a04d08 |
@param preserve_instance: Boolean, when True, do not destroy instance
|
|
Packit Service |
a04d08 |
after test. Used for test development.
|
|
Packit Service |
a04d08 |
"""
|
|
Packit Service |
a04d08 |
self.get_func = get_func
|
|
Packit Service |
a04d08 |
self.preserve_instance = preserve_instance
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def __enter__(self):
|
|
Packit Service |
a04d08 |
"""Create instance of platform component."""
|
|
Packit Service |
a04d08 |
self.instance = self.get_func()
|
|
Packit Service |
a04d08 |
return self.instance
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def __exit__(self, etype, value, trace):
|
|
Packit Service |
a04d08 |
"""Destroy instance."""
|
|
Packit Service |
a04d08 |
if self.instance is not None:
|
|
Packit Service |
a04d08 |
if self.preserve_instance:
|
|
Packit Service |
a04d08 |
LOG.info('Preserving test instance %s', self.instance.name)
|
|
Packit Service |
a04d08 |
else:
|
|
Packit Service |
a04d08 |
self.instance.destroy()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def run_single(name, call):
|
|
Packit Service |
a04d08 |
"""Run a single function, keeping track of results and time.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@param name: name of part
|
|
Packit Service |
a04d08 |
@param call: call to make
|
|
Packit Service |
a04d08 |
@return_value: a tuple of result and fail count
|
|
Packit Service |
a04d08 |
"""
|
|
Packit Service |
a04d08 |
res = {
|
|
Packit Service |
a04d08 |
'name': name,
|
|
Packit Service |
a04d08 |
'time': 0,
|
|
Packit Service |
a04d08 |
'errors': [],
|
|
Packit Service |
a04d08 |
'success': False
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
failed = 0
|
|
Packit Service |
a04d08 |
start_time = time.time()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
try:
|
|
Packit Service |
a04d08 |
call()
|
|
Packit Service |
a04d08 |
except Exception as e:
|
|
Packit Service |
a04d08 |
failed += 1
|
|
Packit Service |
a04d08 |
res['errors'].append(str(e))
|
|
Packit Service |
a04d08 |
LOG.error('stage part: %s encountered error: %s', name, str(e))
|
|
Packit Service |
a04d08 |
trace = traceback.extract_tb(sys.exc_info()[-1])
|
|
Packit Service |
a04d08 |
LOG.error('traceback:\n%s', ''.join(traceback.format_list(trace)))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
res['time'] = time.time() - start_time
|
|
Packit Service |
a04d08 |
if failed == 0:
|
|
Packit Service |
a04d08 |
res['success'] = True
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
return res, failed
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
def run_stage(parent_name, calls, continue_after_error=True):
|
|
Packit Service |
a04d08 |
"""Run a stage of collection, keeping track of results and failures.
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
@param parent_name: name of stage calls are under
|
|
Packit Service |
a04d08 |
@param calls: list of function call taking no params. must return a tuple
|
|
Packit Service |
a04d08 |
of results and failures. may raise exceptions
|
|
Packit Service |
a04d08 |
@param continue_after_error: whether or not to proceed to the next call
|
|
Packit Service |
a04d08 |
after catching an exception or recording a
|
|
Packit Service |
a04d08 |
failure
|
|
Packit Service |
a04d08 |
@return_value: a tuple of results and failures, with result containing
|
|
Packit Service |
a04d08 |
results from the function call under 'stages', and a list
|
|
Packit Service |
a04d08 |
of errors (if any on this level), and elapsed time
|
|
Packit Service |
a04d08 |
running stage, and the name
|
|
Packit Service |
a04d08 |
"""
|
|
Packit Service |
a04d08 |
res = {
|
|
Packit Service |
a04d08 |
'name': parent_name,
|
|
Packit Service |
a04d08 |
'time': 0,
|
|
Packit Service |
a04d08 |
'errors': [],
|
|
Packit Service |
a04d08 |
'stages': [],
|
|
Packit Service |
a04d08 |
'success': False,
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
failed = 0
|
|
Packit Service |
a04d08 |
start_time = time.time()
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
for call in calls:
|
|
Packit Service |
a04d08 |
try:
|
|
Packit Service |
a04d08 |
(call_res, call_failed) = call()
|
|
Packit Service |
a04d08 |
res['stages'].append(call_res)
|
|
Packit Service |
a04d08 |
except Exception as e:
|
|
Packit Service |
a04d08 |
call_failed = 1
|
|
Packit Service |
a04d08 |
res['errors'].append(str(e))
|
|
Packit Service |
a04d08 |
LOG.error('stage: %s encountered error: %s', parent_name, str(e))
|
|
Packit Service |
a04d08 |
trace = traceback.extract_tb(sys.exc_info()[-1])
|
|
Packit Service |
a04d08 |
LOG.error('traceback:\n%s', ''.join(traceback.format_list(trace)))
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
failed += call_failed
|
|
Packit Service |
a04d08 |
if call_failed and not continue_after_error:
|
|
Packit Service |
a04d08 |
break
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
res['time'] = time.time() - start_time
|
|
Packit Service |
a04d08 |
if not failed:
|
|
Packit Service |
a04d08 |
res['success'] = True
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
return (res, failed)
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# vi: ts=4 expandtab
|