
This patch introduces the benchmark test framework for rally. The presented framework relies heavily on the usage of test configuration files which allow to set up which tests should be run in which order and how many times, as well as parameterize them (e.g., to configure, say, the number of compute nodes used in load testing). The test configuration also allows to set whether the benchmark tests should be launched concurrently in several threads. Test configuration processing is provided by the further development of TestEngine, which now also can validate the test configuration passed to its constructor. The patch also contains some refactoring of the Tester class which makes it configurable through the test configuration. This functionality is supported by the TestConfigManager class, another child class of the base ConfigManager defined in one of the previous patches. Blueprint test-engine Change-Id: Idd1296537d5a65c0b353ee9812d2e360d3c8ea39
117 lines
3.4 KiB
Python
117 lines
3.4 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2013: Mirantis Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
|
|
from oslo.config import cfg
|
|
import sys
|
|
|
|
from rally.openstack.common.gettextutils import _ # noqa
|
|
from rally.openstack.common import log as logging
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
exc_log_opts = [
|
|
cfg.BoolOpt('fatal_exception_format_errors',
|
|
default=False,
|
|
help='make exception message format errors fatal'),
|
|
]
|
|
|
|
CONF = cfg.CONF
|
|
CONF.register_opts(exc_log_opts)
|
|
|
|
|
|
class RallyException(Exception):
|
|
"""Base Rally Exception
|
|
|
|
To correctly use this class, inherit from it and define
|
|
a 'msg_fmt' property. That msg_fmt will get printf'd
|
|
with the keyword arguments provided to the constructor.
|
|
|
|
"""
|
|
msg_fmt = _("An unknown exception occurred.")
|
|
|
|
def __init__(self, message=None, **kwargs):
|
|
self.kwargs = kwargs
|
|
|
|
if 'code' not in self.kwargs:
|
|
try:
|
|
self.kwargs['code'] = self.code
|
|
except AttributeError:
|
|
pass
|
|
|
|
if not message:
|
|
try:
|
|
message = self.msg_fmt % kwargs
|
|
|
|
except Exception:
|
|
exc_info = sys.exc_info()
|
|
# kwargs doesn't match a variable in the message
|
|
# log the issue and the kwargs
|
|
LOG.exception(_('Exception in string format operation'))
|
|
for name, value in kwargs.iteritems():
|
|
LOG.error("%s: %s" % (name, value))
|
|
|
|
if CONF.fatal_exception_format_errors:
|
|
raise exc_info[0], exc_info[1], exc_info[2]
|
|
else:
|
|
# at least get the core message out if something happened
|
|
message = self.msg_fmt
|
|
|
|
super(RallyException, self).__init__(message)
|
|
|
|
def format_message(self):
|
|
if self.__class__.__name__.endswith('_Remote'):
|
|
return self.args[0]
|
|
else:
|
|
return unicode(self)
|
|
|
|
|
|
class ImmutableException(RallyException):
|
|
msg_fmt = _("This object is immutable.")
|
|
|
|
|
|
class InvalidConfigException(RallyException):
|
|
msg_fmt = _("This config is invalid: `%(message)s`")
|
|
|
|
|
|
class NoSuchTestException(InvalidConfigException):
|
|
msg_fmt = _("No such test: `%(test_name)s`.")
|
|
|
|
|
|
class TestException(RallyException):
|
|
msg_fmt = _("Test failed: %(test_message)s")
|
|
|
|
|
|
class DeploymentVerificationException(TestException):
|
|
msg_fmt = _("Verification test failed: %(test_message)s")
|
|
|
|
|
|
class NotFoundException(RallyException):
|
|
msg_fmt = _("Not found.")
|
|
|
|
|
|
class NoSuchEngine(NotFoundException):
|
|
msg_fmt = _("There is no engine with name `%(engine_name)s`.")
|
|
|
|
|
|
class NoSuchVMProvider(NotFoundException):
|
|
msg_fmt = _("There is no vm provider with name `%(vm_provider_name)s`.")
|
|
|
|
|
|
class TaskNotFound(NotFoundException):
|
|
msg_fmt = _("Task with uuid=%(uuid)s not found.")
|