Merge "Extend required_paramaters validator"

This commit is contained in:
Jenkins 2017-04-19 14:06:34 +00:00 committed by Gerrit Code Review
commit 71900a28c5
12 changed files with 69 additions and 53 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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"})

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

View File

@ -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)

View File

@ -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"

View File

@ -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"]},

View File

@ -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"]},

View File

@ -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)

View File

@ -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.

View File

@ -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)

View File

@ -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,