Files
rally/rally/exceptions.py
Mikhail Dubov 8f75894bad Benchmark test framework for Rally
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
2013-09-18 01:35:44 +04:00

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.")