Blame tests/cloud_tests/stage.py

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