Merge "Extend required_paramaters validator"
This commit is contained in:
commit
71900a28c5
|
@ -67,3 +67,39 @@ class ArgsValidator(validation.Validator):
|
|||
{"args": "', '".join(redundant_args),
|
||||
"hint": hint_msg})
|
||||
return self.fail(msg)
|
||||
|
||||
|
||||
@validation.configure(name="required_params")
|
||||
class RequiredParameterValidator(validation.Validator):
|
||||
"""Scenario required parameter validator.
|
||||
|
||||
This allows us to search required parameters in subdict of config.
|
||||
|
||||
:param subdict: sub-dict of "config" to search. if
|
||||
not defined - will search in "config"
|
||||
:param params: list of required parameters
|
||||
"""
|
||||
|
||||
def __init__(self, params=None, subdict=None):
|
||||
super(RequiredParameterValidator, self).__init__()
|
||||
self.subdict = subdict
|
||||
self.params = params
|
||||
|
||||
def validate(self, credentials, config, plugin_cls, plugin_cfg):
|
||||
missing = []
|
||||
args = config.get("args", {})
|
||||
if self.subdict:
|
||||
args = args.get(self.subdict, {})
|
||||
for arg in self.params:
|
||||
if isinstance(arg, (tuple, list)):
|
||||
for case in arg:
|
||||
if case not in args:
|
||||
missing.append(case)
|
||||
else:
|
||||
if arg not in args:
|
||||
missing.append(arg)
|
||||
|
||||
if missing:
|
||||
msg = ("%s parameters are not defined in "
|
||||
"the benchmark config file") % ", ".join(missing)
|
||||
return self.fail(msg)
|
||||
|
|
|
@ -569,7 +569,6 @@ class CreateAndListSnapshots(cinder_utils.CinderBasic,
|
|||
@validation.restricted_parameters(["name", "display_name"])
|
||||
@validation.required_services(consts.Service.CINDER, consts.Service.GLANCE)
|
||||
@validation.add("required_platform", platform="openstack", users=True)
|
||||
@validation.required_parameters("size")
|
||||
@scenario.configure(context={"cleanup": ["cinder", "glance"]},
|
||||
name="CinderVolumes.create_and_upload_volume_to_image")
|
||||
class CreateAndUploadVolumeToImage(cinder_utils.CinderBasic,
|
||||
|
|
|
@ -51,7 +51,6 @@ class ListExecutions(utils.MistralScenario):
|
|||
sort_keys=sort_keys, sort_dirs=sort_dirs)
|
||||
|
||||
|
||||
@validation.required_parameters("definition")
|
||||
@validation.file_exists("definition")
|
||||
@types.convert(definition={"type": "file"})
|
||||
@types.convert(params={"type": "file"})
|
||||
|
|
|
@ -38,7 +38,6 @@ class ListWorkbooks(utils.MistralScenario):
|
|||
self._list_workbooks()
|
||||
|
||||
|
||||
@validation.required_parameters("definition")
|
||||
@validation.file_exists("definition")
|
||||
@types.convert(definition={"type": "file"})
|
||||
@validation.required_clients("mistral")
|
||||
|
|
|
@ -25,7 +25,6 @@ from rally.task import validation
|
|||
"""Scenarios for Murano packages."""
|
||||
|
||||
|
||||
@validation.required_parameters("package")
|
||||
@validation.file_exists(param_name="package", mode=os.F_OK)
|
||||
@validation.required_clients("murano")
|
||||
@validation.required_services(consts.Service.MURANO)
|
||||
|
@ -57,7 +56,6 @@ class ImportAndListPackages(utils.MuranoScenario):
|
|||
os.remove(package_path)
|
||||
|
||||
|
||||
@validation.required_parameters("package")
|
||||
@validation.file_exists(param_name="package", mode=os.F_OK)
|
||||
@validation.required_clients("murano")
|
||||
@validation.required_services(consts.Service.MURANO)
|
||||
|
@ -86,7 +84,6 @@ class ImportAndDeletePackage(utils.MuranoScenario):
|
|||
os.remove(package_path)
|
||||
|
||||
|
||||
@validation.required_parameters("package", "body")
|
||||
@validation.file_exists(param_name="package", mode=os.F_OK)
|
||||
@validation.required_clients("murano")
|
||||
@validation.required_services(consts.Service.MURANO)
|
||||
|
@ -124,7 +121,6 @@ class PackageLifecycle(utils.MuranoScenario):
|
|||
os.remove(package_path)
|
||||
|
||||
|
||||
@validation.required_parameters("package", "filter_query")
|
||||
@validation.file_exists(param_name="package", mode=os.F_OK)
|
||||
@validation.required_clients("murano")
|
||||
@validation.required_services(consts.Service.MURANO)
|
||||
|
|
|
@ -105,7 +105,7 @@ class CreateAndDeleteNetworks(utils.NeutronScenario):
|
|||
class CreateAndListSubnets(utils.NeutronScenario):
|
||||
|
||||
def run(self, network_create_args=None, subnet_create_args=None,
|
||||
subnet_cidr_start=None, subnets_per_network=None):
|
||||
subnet_cidr_start=None, subnets_per_network=1):
|
||||
"""Create and a given number of subnets and list all subnets.
|
||||
|
||||
The scenario creates a network, a given number of subnets and then
|
||||
|
@ -132,7 +132,7 @@ class CreateAndUpdateSubnets(utils.NeutronScenario):
|
|||
|
||||
def run(self, subnet_update_args, network_create_args=None,
|
||||
subnet_create_args=None, subnet_cidr_start=None,
|
||||
subnets_per_network=None):
|
||||
subnets_per_network=1):
|
||||
"""Create and update a subnet.
|
||||
|
||||
The scenario creates a network, a given number of subnets
|
||||
|
@ -186,14 +186,14 @@ class CreateAndShowSubnets(utils.NeutronScenario):
|
|||
self._show_subnet(subnet, atomic_action=False)
|
||||
|
||||
|
||||
@validation.required_parameters("subnets_per_network")
|
||||
@validation.number("subnets_per_network", minval=1, integer_only=True)
|
||||
@validation.required_services(consts.Service.NEUTRON)
|
||||
@scenario.configure(context={"cleanup": ["neutron"]},
|
||||
name="NeutronNetworks.create_and_delete_subnets")
|
||||
class CreateAndDeleteSubnets(utils.NeutronScenario):
|
||||
|
||||
def run(self, network_create_args=None, subnet_create_args=None,
|
||||
subnet_cidr_start=None, subnets_per_network=None):
|
||||
subnet_cidr_start=None, subnets_per_network=1):
|
||||
"""Create and delete a given number of subnets.
|
||||
|
||||
The scenario creates a network, a given number of subnets and then
|
||||
|
@ -221,7 +221,7 @@ class CreateAndDeleteSubnets(utils.NeutronScenario):
|
|||
class CreateAndListRouters(utils.NeutronScenario):
|
||||
|
||||
def run(self, network_create_args=None, subnet_create_args=None,
|
||||
subnet_cidr_start=None, subnets_per_network=None,
|
||||
subnet_cidr_start=None, subnets_per_network=1,
|
||||
router_create_args=None):
|
||||
"""Create and a given number of routers and list all routers.
|
||||
|
||||
|
@ -242,7 +242,6 @@ class CreateAndListRouters(utils.NeutronScenario):
|
|||
|
||||
|
||||
@validation.number("subnets_per_network", minval=1, integer_only=True)
|
||||
@validation.required_parameters("subnets_per_network")
|
||||
@validation.required_services(consts.Service.NEUTRON)
|
||||
@scenario.configure(context={"cleanup": ["neutron"]},
|
||||
name="NeutronNetworks.create_and_update_routers")
|
||||
|
@ -250,7 +249,7 @@ class CreateAndUpdateRouters(utils.NeutronScenario):
|
|||
|
||||
def run(self, router_update_args, network_create_args=None,
|
||||
subnet_create_args=None, subnet_cidr_start=None,
|
||||
subnets_per_network=None, router_create_args=None):
|
||||
subnets_per_network=1, router_create_args=None):
|
||||
"""Create and update a given number of routers.
|
||||
|
||||
Create a network, a given number of subnets and routers
|
||||
|
@ -272,14 +271,14 @@ class CreateAndUpdateRouters(utils.NeutronScenario):
|
|||
self._update_router(router, router_update_args)
|
||||
|
||||
|
||||
@validation.required_parameters("subnets_per_network")
|
||||
@validation.number("subnets_per_network", minval=1, integer_only=True)
|
||||
@validation.required_services(consts.Service.NEUTRON)
|
||||
@scenario.configure(context={"cleanup": ["neutron"]},
|
||||
name="NeutronNetworks.create_and_delete_routers")
|
||||
class CreateAndDeleteRouters(utils.NeutronScenario):
|
||||
|
||||
def run(self, network_create_args=None, subnet_create_args=None,
|
||||
subnet_cidr_start=None, subnets_per_network=None,
|
||||
subnet_cidr_start=None, subnets_per_network=1,
|
||||
router_create_args=None):
|
||||
"""Create and delete a given number of routers.
|
||||
|
||||
|
@ -339,7 +338,7 @@ class SetAndClearRouterGateway(utils.NeutronScenario):
|
|||
class CreateAndListPorts(utils.NeutronScenario):
|
||||
|
||||
def run(self, network_create_args=None,
|
||||
port_create_args=None, ports_per_network=None):
|
||||
port_create_args=None, ports_per_network=1):
|
||||
"""Create and a given number of ports and list all ports.
|
||||
|
||||
:param network_create_args: dict, POST /v2.0/networks request
|
||||
|
@ -362,7 +361,7 @@ class CreateAndListPorts(utils.NeutronScenario):
|
|||
class CreateAndUpdatePorts(utils.NeutronScenario):
|
||||
|
||||
def run(self, port_update_args, network_create_args=None,
|
||||
port_create_args=None, ports_per_network=None):
|
||||
port_create_args=None, ports_per_network=1):
|
||||
"""Create and update a given number of ports.
|
||||
|
||||
Measure the "neutron port-create" and "neutron port-update" commands
|
||||
|
@ -416,14 +415,14 @@ class CreateAndShowPorts(utils.NeutronScenario):
|
|||
err_msg=msg)
|
||||
|
||||
|
||||
@validation.required_parameters("ports_per_network")
|
||||
@validation.number("ports_per_network", minval=1, integer_only=True)
|
||||
@validation.required_services(consts.Service.NEUTRON)
|
||||
@scenario.configure(context={"cleanup": ["neutron"]},
|
||||
name="NeutronNetworks.create_and_delete_ports")
|
||||
class CreateAndDeletePorts(utils.NeutronScenario):
|
||||
|
||||
def run(self, network_create_args=None,
|
||||
port_create_args=None, ports_per_network=None):
|
||||
port_create_args=None, ports_per_network=1):
|
||||
"""Create and delete a port.
|
||||
|
||||
Measure the "neutron port-create" and "neutron port-delete"
|
||||
|
|
|
@ -23,7 +23,6 @@ from rally.task import validation
|
|||
|
||||
|
||||
@validation.restricted_parameters("pool")
|
||||
@validation.required_parameters("start_cidr")
|
||||
@validation.required_services(consts.Service.NOVA, consts.Service.NOVA_NET)
|
||||
@validation.add("required_platform", platform="openstack", admin=True)
|
||||
@scenario.configure(context={"admin_cleanup": ["nova"]},
|
||||
|
@ -50,7 +49,6 @@ class CreateAndListFloatingIpsBulk(utils.NovaScenario):
|
|||
|
||||
|
||||
@validation.restricted_parameters("pool")
|
||||
@validation.required_parameters("start_cidr")
|
||||
@validation.required_services(consts.Service.NOVA, consts.Service.NOVA_NET)
|
||||
@validation.add("required_platform", platform="openstack", admin=True)
|
||||
@scenario.configure(context={"admin_cleanup": ["nova"]},
|
||||
|
|
|
@ -23,7 +23,6 @@ from rally.task import validation
|
|||
|
||||
|
||||
@validation.restricted_parameters("label")
|
||||
@validation.required_parameters("start_cidr")
|
||||
@validation.required_services(consts.Service.NOVA, consts.Service.NOVA_NET)
|
||||
@validation.add("required_platform", platform="openstack", admin=True)
|
||||
@scenario.configure(context={"admin_cleanup": ["nova.networks"]},
|
||||
|
@ -49,7 +48,6 @@ class CreateAndListNetworks(utils.NovaScenario):
|
|||
|
||||
|
||||
@validation.restricted_parameters("label")
|
||||
@validation.required_parameters("start_cidr")
|
||||
@validation.required_services(consts.Service.NOVA, consts.Service.NOVA_NET)
|
||||
@validation.add("required_platform", platform="openstack", admin=True)
|
||||
@scenario.configure(context={"admin_cleanup": ["nova.networks"]},
|
||||
|
|
|
@ -32,8 +32,6 @@ class NovaSecurityGroupException(exceptions.RallyException):
|
|||
msg_fmt = _("%(message)s")
|
||||
|
||||
|
||||
@validation.required_parameters("security_group_count",
|
||||
"rules_per_security_group")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.add("required_platform", platform="openstack", users=True)
|
||||
@scenario.configure(context={"cleanup": ["nova"]},
|
||||
|
@ -59,8 +57,6 @@ class CreateAndDeleteSecgroups(utils.NovaScenario):
|
|||
self._delete_security_groups(security_groups)
|
||||
|
||||
|
||||
@validation.required_parameters("security_group_count",
|
||||
"rules_per_security_group")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.add("required_platform", platform="openstack", users=True)
|
||||
@scenario.configure(context={"cleanup": ["nova"]},
|
||||
|
@ -91,7 +87,6 @@ class CreateAndListSecgroups(utils.NovaScenario):
|
|||
[i.id for i in pool_groups])
|
||||
|
||||
|
||||
@validation.required_parameters("security_group_count")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.add("required_platform", platform="openstack", users=True)
|
||||
@scenario.configure(context={"cleanup": ["nova"]},
|
||||
|
@ -114,8 +109,6 @@ class CreateAndUpdateSecgroups(utils.NovaScenario):
|
|||
@types.convert(image={"type": "glance_image"},
|
||||
flavor={"type": "nova_flavor"})
|
||||
@validation.image_valid_on_flavor("flavor", "image")
|
||||
@validation.required_parameters("security_group_count",
|
||||
"rules_per_security_group")
|
||||
@validation.required_contexts("network")
|
||||
@validation.required_services(consts.Service.NOVA)
|
||||
@validation.add("required_platform", platform="openstack", users=True)
|
||||
|
|
|
@ -459,19 +459,6 @@ def external_network_exists(config, clients, deployment, network_name):
|
|||
return ValidationResult(False, message)
|
||||
|
||||
|
||||
@validator
|
||||
def required_parameters(config, clients, deployment, *required_params):
|
||||
"""Validator for checking required parameters are specified.
|
||||
|
||||
:param *required_params: list of required parameters
|
||||
"""
|
||||
missing = set(required_params) - set(config.get("args", {}))
|
||||
if missing:
|
||||
message = _("%s parameters are not defined in "
|
||||
"the benchmark config file") % ", ".join(missing)
|
||||
return ValidationResult(False, message)
|
||||
|
||||
|
||||
@validator
|
||||
def required_services(config, clients, deployment, *required_services):
|
||||
"""Validator checks if specified OpenStack services are available.
|
||||
|
|
|
@ -17,6 +17,7 @@ import ddt
|
|||
|
||||
from rally.common.plugin import plugin
|
||||
from rally.common import validation
|
||||
from rally.plugins.common import validators
|
||||
from rally.task import scenario
|
||||
from tests.unit import test
|
||||
|
||||
|
@ -96,3 +97,23 @@ class ArgsValidatorTestCase(test.TestCase):
|
|||
self.assertIn(err_msg, result[0].msg)
|
||||
|
||||
DummyPlugin2.func_based.unregister()
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class RequiredParameterValidatorTestCase(test.TestCase):
|
||||
|
||||
@ddt.data(({"args": {"a": 10, "b": 20}}, "a", None, None),
|
||||
({"args": {"a": 10, "b": 20}}, ("a", "b", "c"), None,
|
||||
"c parameters are not defined in the benchmark config file"),
|
||||
({"args": {"a": 10, "b": {"c": 20, "d": 30}}}, ("c", "d"),
|
||||
"b", None),
|
||||
({"args": {"a": 10, "b": {"c": 20, "d": 30}}}, ("c", "e"), "b",
|
||||
"e parameters are not defined in the benchmark config file"))
|
||||
@ddt.unpack
|
||||
def test_validate(self, config, params, subdict, err_msg):
|
||||
validator = validators.RequiredParameterValidator(params, subdict)
|
||||
result = validator.validate(None, config, None, None)
|
||||
if err_msg:
|
||||
self.assertEqual(err_msg, result.msg)
|
||||
else:
|
||||
self.assertIsNone(result)
|
||||
|
|
|
@ -657,15 +657,6 @@ class ValidatorsTestCase(test.TestCase):
|
|||
result = validator({"args": {"name": "custom"}}, clients, None)
|
||||
self.assertTrue(result.is_valid, result.msg)
|
||||
|
||||
def test_required_parameters(self):
|
||||
validator = self._unwrap_validator(validation.required_parameters,
|
||||
"a", "b")
|
||||
result = validator({"args": {"a": 1, "b": 2, "c": 3}}, None, None)
|
||||
self.assertTrue(result.is_valid, result.msg)
|
||||
|
||||
result = validator({"args": {"a": 1, "c": 3}}, None, None)
|
||||
self.assertFalse(result.is_valid, result.msg)
|
||||
|
||||
def test_required_service(self):
|
||||
validator = self._unwrap_validator(validation.required_services,
|
||||
consts.Service.KEYSTONE,
|
||||
|
|
Loading…
Reference in New Issue