From 9a3b61d9dad4ae9ba25ce580112921d83f39f0c3 Mon Sep 17 00:00:00 2001 From: astaroverov Date: Fri, 21 Apr 2017 14:22:55 +0300 Subject: [PATCH] Move 'required_services' validator to 'openstack/validators.py' Change-Id: I539838186d2e809143adb5b4c25dfedecbf2764b --- .../scenarios/authenticate/authenticate.py | 3 +- .../openstack/scenarios/ceilometer/alarms.py | 21 +++-- .../openstack/scenarios/ceilometer/events.py | 12 +-- .../openstack/scenarios/ceilometer/meters.py | 6 +- .../openstack/scenarios/ceilometer/queries.py | 9 ++- .../scenarios/ceilometer/resources.py | 9 ++- .../openstack/scenarios/ceilometer/samples.py | 6 +- .../openstack/scenarios/ceilometer/stats.py | 6 +- .../openstack/scenarios/ceilometer/traits.py | 8 +- .../openstack/scenarios/cinder/qos_specs.py | 4 +- .../scenarios/cinder/volume_backups.py | 2 +- .../scenarios/cinder/volume_types.py | 18 ++--- .../openstack/scenarios/cinder/volumes.py | 52 ++++++------ .../openstack/scenarios/designate/basic.py | 48 +++++++---- .../openstack/scenarios/ec2/servers.py | 4 +- .../openstack/scenarios/glance/images.py | 13 +-- .../openstack/scenarios/heat/stacks.py | 26 +++--- .../openstack/scenarios/ironic/nodes.py | 4 +- .../scenarios/magnum/cluster_templates.py | 2 +- .../openstack/scenarios/magnum/clusters.py | 4 +- .../openstack/scenarios/manila/shares.py | 18 ++--- .../openstack/scenarios/mistral/executions.py | 6 +- .../openstack/scenarios/mistral/workbooks.py | 6 +- .../openstack/scenarios/monasca/metrics.py | 3 +- .../scenarios/murano/environments.py | 6 +- .../openstack/scenarios/murano/packages.py | 8 +- .../openstack/scenarios/neutron/bgpvpn.py | 7 +- .../scenarios/neutron/loadbalancer_v1.py | 27 ++++--- .../scenarios/neutron/loadbalancer_v2.py | 3 +- .../openstack/scenarios/neutron/network.py | 59 +++++++++----- .../scenarios/neutron/security_groups.py | 12 ++- .../openstack/scenarios/nova/agents.py | 2 +- .../openstack/scenarios/nova/aggregates.py | 14 ++-- .../scenarios/nova/availability_zones.py | 2 +- .../openstack/scenarios/nova/flavors.py | 14 ++-- .../plugins/openstack/scenarios/nova/hosts.py | 4 +- .../openstack/scenarios/nova/hypervisors.py | 10 +-- .../openstack/scenarios/nova/images.py | 2 +- .../openstack/scenarios/nova/keypairs.py | 8 +- .../openstack/scenarios/nova/server_groups.py | 4 +- .../openstack/scenarios/nova/servers.py | 69 +++++++++------- .../openstack/scenarios/nova/services.py | 2 +- .../openstack/scenarios/quotas/quotas.py | 15 ++-- .../openstack/scenarios/sahara/clusters.py | 4 +- .../openstack/scenarios/sahara/jobs.py | 6 +- .../scenarios/sahara/node_group_templates.py | 4 +- .../openstack/scenarios/senlin/clusters.py | 2 +- .../openstack/scenarios/swift/objects.py | 10 +-- .../plugins/openstack/scenarios/vm/vmtasks.py | 6 +- .../openstack/scenarios/watcher/basic.py | 9 ++- rally/plugins/openstack/validators.py | 50 ++++++++++++ .../unit/plugins/openstack/test_validators.py | 79 ++++++++++++++++++- 52 files changed, 475 insertions(+), 253 deletions(-) diff --git a/rally/plugins/openstack/scenarios/authenticate/authenticate.py b/rally/plugins/openstack/scenarios/authenticate/authenticate.py index 27c6d5f5..d2c0b0c3 100644 --- a/rally/plugins/openstack/scenarios/authenticate/authenticate.py +++ b/rally/plugins/openstack/scenarios/authenticate/authenticate.py @@ -161,7 +161,8 @@ class ValidateHeat(scenario.OpenStackScenario): @validation.add("number", param_name="repetitions", minval=1) @validation.add("required_platform", platform="openstack", users=True) -@validation.required_services(consts.Service.MONASCA) +@validation.add("required_services", + services=[consts.Service.MONASCA]) @scenario.configure(name="Authenticate.validate_monasca") class ValidateMonasca(scenario.OpenStackScenario): diff --git a/rally/plugins/openstack/scenarios/ceilometer/alarms.py b/rally/plugins/openstack/scenarios/ceilometer/alarms.py index 4a35b77e..eaf170de 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/alarms.py +++ b/rally/plugins/openstack/scenarios/ceilometer/alarms.py @@ -20,7 +20,8 @@ from rally.task import validation """Benchmark scenarios for Ceilometer Alarms API.""" -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerAlarms.create_alarm") @@ -42,7 +43,8 @@ class CreateAlarm(ceiloutils.CeilometerScenario): self._create_alarm(meter_name, threshold, kwargs) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerAlarms.list_alarms") class ListAlarms(ceiloutils.CeilometerScenario): @@ -55,7 +57,8 @@ class ListAlarms(ceiloutils.CeilometerScenario): self._list_alarms() -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerAlarms.create_and_list_alarm") @@ -79,7 +82,8 @@ class CreateAndListAlarm(ceiloutils.CeilometerScenario): self._list_alarms(alarm.alarm_id) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerAlarms.create_and_get_alarm") @@ -103,7 +107,8 @@ class CreateAndGetAlarm(ceiloutils.CeilometerScenario): self._get_alarm(alarm.alarm_id) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerAlarms.create_and_update_alarm") @@ -127,7 +132,8 @@ class CreateAndUpdateAlarm(ceiloutils.CeilometerScenario): self._update_alarm(alarm.alarm_id, alarm_dict_diff) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerAlarms.create_and_delete_alarm") @@ -150,7 +156,8 @@ class CreateAndDeleteAlarm(ceiloutils.CeilometerScenario): self._delete_alarm(alarm.alarm_id) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerAlarms.create_alarm_and_get_history") diff --git a/rally/plugins/openstack/scenarios/ceilometer/events.py b/rally/plugins/openstack/scenarios/ceilometer/events.py index 11c12ee1..ca47076b 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/events.py +++ b/rally/plugins/openstack/scenarios/ceilometer/events.py @@ -27,8 +27,8 @@ from rally.task import validation # no other way except emit suitable notification from one of services, # for example create new user in keystone. -@validation.required_services(consts.Service.CEILOMETER, - consts.Service.KEYSTONE) +@validation.add("required_services", services=[consts.Service.CEILOMETER, + consts.Service.KEYSTONE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["keystone"], "cleanup": ["ceilometer"]}, @@ -49,8 +49,8 @@ class CeilometerEventsCreateUserAndListEvents(cutils.CeilometerScenario, self.assertTrue(events, msg) -@validation.required_services(consts.Service.CEILOMETER, - consts.Service.KEYSTONE) +@validation.add("required_services", services=[consts.Service.CEILOMETER, + consts.Service.KEYSTONE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["keystone"], "cleanup": ["ceilometer"]}, @@ -71,8 +71,8 @@ class CeilometerEventsCreateUserAndListEventTypes(cutils.CeilometerScenario, self.assertTrue(event_types, msg) -@validation.required_services(consts.Service.CEILOMETER, - consts.Service.KEYSTONE) +@validation.add("required_services", services=[consts.Service.CEILOMETER, + consts.Service.KEYSTONE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["keystone"], "cleanup": ["ceilometer"]}, diff --git a/rally/plugins/openstack/scenarios/ceilometer/meters.py b/rally/plugins/openstack/scenarios/ceilometer/meters.py index f38c68a1..73e8d479 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/meters.py +++ b/rally/plugins/openstack/scenarios/ceilometer/meters.py @@ -21,7 +21,8 @@ from rally.task import validation """Scenarios for Ceilometer Meters API.""" -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerMeters.list_meters") @@ -44,7 +45,8 @@ class ListMeters(ceiloutils.CeilometerScenario): scenario.run(limit=limit) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerMeters.list_matched_meters") diff --git a/rally/plugins/openstack/scenarios/ceilometer/queries.py b/rally/plugins/openstack/scenarios/ceilometer/queries.py index c2b0afd0..b281bd89 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/queries.py +++ b/rally/plugins/openstack/scenarios/ceilometer/queries.py @@ -23,7 +23,8 @@ from rally.task import validation """Scenarios for Ceilometer Queries API.""" -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerQueries.create_and_query_alarms") @@ -50,7 +51,8 @@ class CeilometerQueriesCreateAndQueryAlarms(ceiloutils.CeilometerScenario): self._query_alarms(filter, orderby, limit) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerQueries.create_and_query_alarm_history") @@ -75,7 +77,8 @@ class CeilometerQueriesCreateAndQueryAlarmHistory(ceiloutils self._query_alarm_history(alarm_filter, orderby, limit) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ceilometer"]}, name="CeilometerQueries.create_and_query_samples") diff --git a/rally/plugins/openstack/scenarios/ceilometer/resources.py b/rally/plugins/openstack/scenarios/ceilometer/resources.py index 8fb15913..3628922c 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/resources.py +++ b/rally/plugins/openstack/scenarios/ceilometer/resources.py @@ -21,7 +21,8 @@ from rally.task import validation """Scenarios for Ceilometer Resource API.""" -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerResource.list_resources") @@ -54,7 +55,8 @@ class ListResources(ceiloutils.CeilometerScenario): scenario.run(limit=limit) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerResource.get_tenant_resources") class GetTenantResources(ceiloutils.CeilometerScenario): @@ -73,7 +75,8 @@ class GetTenantResources(ceiloutils.CeilometerScenario): self._get_resource(res_id) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerResource.list_matched_resources") diff --git a/rally/plugins/openstack/scenarios/ceilometer/samples.py b/rally/plugins/openstack/scenarios/ceilometer/samples.py index f2d84184..5760fcef 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/samples.py +++ b/rally/plugins/openstack/scenarios/ceilometer/samples.py @@ -21,7 +21,8 @@ from rally.task import validation """Scenarios for Ceilometer Samples API.""" -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerSamples.list_matched_samples") @@ -44,7 +45,8 @@ class ListMatchedSamples(ceiloutils.CeilometerScenario): self._list_samples(query, limit) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerSamples.list_samples") diff --git a/rally/plugins/openstack/scenarios/ceilometer/stats.py b/rally/plugins/openstack/scenarios/ceilometer/stats.py index 403243a4..8d4a7fe2 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/stats.py +++ b/rally/plugins/openstack/scenarios/ceilometer/stats.py @@ -22,7 +22,8 @@ from rally.task import validation """Scenarios for Ceilometer Stats API.""" -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerStats.create_meter_and_get_stats") class CreateMeterAndGetStats(utils.CeilometerScenario): @@ -41,7 +42,8 @@ class CreateMeterAndGetStats(utils.CeilometerScenario): self._get_stats(meter.counter_name) -@validation.required_services(consts.Service.CEILOMETER) +@validation.add("required_services", + services=[consts.Service.CEILOMETER]) @validation.required_contexts("ceilometer") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CeilometerStats.get_stats") diff --git a/rally/plugins/openstack/scenarios/ceilometer/traits.py b/rally/plugins/openstack/scenarios/ceilometer/traits.py index a1a96939..cd08f9af 100644 --- a/rally/plugins/openstack/scenarios/ceilometer/traits.py +++ b/rally/plugins/openstack/scenarios/ceilometer/traits.py @@ -26,8 +26,8 @@ from rally.task import validation # there are no other way except emit suitable notification from one of # services, for example create new user in keystone. -@validation.required_services(consts.Service.CEILOMETER, - consts.Service.KEYSTONE) +@validation.add("required_services", services=[consts.Service.CEILOMETER, + consts.Service.KEYSTONE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["keystone"], "cleanup": ["ceilometer"]}, @@ -49,8 +49,8 @@ class CreateUserAndListTraits(cutils.CeilometerScenario, trait_name=trait_name) -@validation.required_services(consts.Service.CEILOMETER, - consts.Service.KEYSTONE) +@validation.add("required_services", services=[consts.Service.CEILOMETER, + consts.Service.KEYSTONE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["keystone"], "cleanup": ["ceilometer"]}, diff --git a/rally/plugins/openstack/scenarios/cinder/qos_specs.py b/rally/plugins/openstack/scenarios/cinder/qos_specs.py index 362f56b5..4a3bb14a 100644 --- a/rally/plugins/openstack/scenarios/cinder/qos_specs.py +++ b/rally/plugins/openstack/scenarios/cinder/qos_specs.py @@ -22,7 +22,7 @@ from rally.task import validation @validation.restricted_parameters("name") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderQos.create_and_list_qos") @@ -42,7 +42,7 @@ class CreateAndListQos(cinder_utils.CinderBasic): @validation.restricted_parameters("name") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderQos.create_and_get_qos") diff --git a/rally/plugins/openstack/scenarios/cinder/volume_backups.py b/rally/plugins/openstack/scenarios/cinder/volume_backups.py index 9af2803a..9bb11c91 100644 --- a/rally/plugins/openstack/scenarios/cinder/volume_backups.py +++ b/rally/plugins/openstack/scenarios/cinder/volume_backups.py @@ -27,7 +27,7 @@ from rally.task import validation @validation.restricted_parameters("name", subdict="create_backup_kwargs") @validation.required_cinder_services("cinder-backup") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumeBackups." diff --git a/rally/plugins/openstack/scenarios/cinder/volume_types.py b/rally/plugins/openstack/scenarios/cinder/volume_types.py index d8f3d49e..61cabbd7 100644 --- a/rally/plugins/openstack/scenarios/cinder/volume_types.py +++ b/rally/plugins/openstack/scenarios/cinder/volume_types.py @@ -26,7 +26,7 @@ LOG = logging.getLogger(__name__) @validation.restricted_parameters("name") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderVolumeTypes.create_and_delete_volume_type") @@ -43,7 +43,7 @@ class CreateAndDeleteVolumeType(cinder_utils.CinderBasic): @validation.restricted_parameters("name") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderVolumeTypes.create_and_get_volume_type") @@ -59,7 +59,7 @@ class CreateAndGetVolumeType(cinder_utils.CinderBasic): self.admin_cinder.get_volume_type(volume_type) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderVolumeTypes.create_and_list_volume_types") @@ -85,8 +85,8 @@ class CreateAndListVolumeTypes(cinder_utils.CinderBasic): @validation.restricted_parameters("name") -@validation.required_services(consts.Service.CINDER) @validation.add("required_params", params=[("create_specs", "provider")]) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderVolumeTypes.create_volume_type" @@ -129,9 +129,9 @@ class CreateVolumeTypeAndEncryptionType(cinder_utils.CinderBasic): specs=specs) -@validation.required_services(consts.Service.CINDER) -@validation.required_contexts("volume_types") @validation.add("required_params", params=[("create_specs", "provider")]) +@validation.restricted_parameters("name") +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderVolumeTypes.create_and_list_" @@ -177,7 +177,7 @@ class CreateAndListEncryptionType(cinder_utils.CinderBasic): @validation.restricted_parameters("name") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, name="CinderVolumeTypes.create_and_set_volume_type_keys") @@ -195,7 +195,7 @@ class CreateAndSetVolumeTypeKeys(cinder_utils.CinderBasic): metadata=volume_type_key) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.required_contexts("volume_types") @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["cinder"]}, @@ -234,7 +234,7 @@ class CreateGetAndDeleteEncryptionType(cinder_utils.CinderBasic): self.admin_cinder.delete_encryption_type(volume_type["id"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.required_contexts("volume_types") @validation.add("required_params", params=[("create_specs", "provider")]) @validation.add("required_platform", platform="openstack", admin=True) diff --git a/rally/plugins/openstack/scenarios/cinder/volumes.py b/rally/plugins/openstack/scenarios/cinder/volumes.py index 94a5e7d2..a897a1ef 100644 --- a/rally/plugins/openstack/scenarios/cinder/volumes.py +++ b/rally/plugins/openstack/scenarios/cinder/volumes.py @@ -34,7 +34,7 @@ LOG = logging.getLogger(__name__) @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_list_volume") @@ -70,7 +70,7 @@ class CreateAndListVolume(cinder_utils.CinderBasic): @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_get_volume") @@ -95,7 +95,7 @@ class CreateAndGetVolume(cinder_utils.CinderBasic): self.cinder.get_volume(volume.id) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.list_volumes") @@ -114,7 +114,7 @@ class ListVolumes(cinder_utils.CinderBasic): self.cinder.list_volumes(detailed) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CinderVolumes.list_types") class ListTypes(cinder_utils.CinderBasic): @@ -132,7 +132,7 @@ class ListTypes(cinder_utils.CinderBasic): self.cinder.list_types(search_opts, is_public=is_public) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="CinderVolumes.list_transfers") class ListTransfers(cinder_utils.CinderBasic): @@ -157,7 +157,7 @@ class ListTransfers(cinder_utils.CinderBasic): @validation.restricted_parameters(["name", "display_name"], subdict="update_volume_kwargs") @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_update_volume") @@ -191,7 +191,7 @@ class CreateAndUpdateVolume(cinder_utils.CinderBasic): @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_delete_volume") @@ -227,7 +227,7 @@ class CreateAndDeleteVolume(cinder_utils.CinderBasic): @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_volume") @@ -252,7 +252,7 @@ class CreateVolume(cinder_utils.CinderBasic): self.cinder.create_volume(size, **kwargs) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("volumes") @scenario.configure(context={"cleanup": ["cinder"]}, @@ -289,7 +289,7 @@ class ModifyVolumeMetadata(cinder_utils.CinderBasic): @validation.restricted_parameters(["name", "display_name"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_extend_volume") @@ -322,7 +322,7 @@ class CreateAndExtendVolume(cinder_utils.CinderBasic): @validation.restricted_parameters(["name", "display_name"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.required_contexts("volumes") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, @@ -356,7 +356,7 @@ class CreateFromVolumeAndDeleteVolume(cinder_utils.CinderBasic): @validation.restricted_parameters(["name", "display_name"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.required_contexts("volumes") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, @@ -391,7 +391,8 @@ class CreateAndDeleteSnapshot(cinder_utils.CinderBasic): subdict="create_volume_params") @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder", "nova"]}, name="CinderVolumes.create_and_attach_volume") @@ -440,7 +441,8 @@ class CreateAndAttachVolume(cinder_utils.CinderBasic, @validation.restricted_parameters(["name", "display_name"]) @validation.volume_type_exists("volume_type") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder", "nova"]}, name="CinderVolumes.create_snapshot_and_attach_volume") @@ -478,7 +480,8 @@ class CreateSnapshotAndAttachVolume(cinder_utils.CinderBasic, subdict="create_volume_kwargs") @validation.restricted_parameters(["name", "display_name"], subdict="create_snapshot_kwargs") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder", "nova"]}, name="CinderVolumes.create_nested_snapshots" @@ -544,7 +547,7 @@ class CreateNestedSnapshotsAndAttachVolume(cinder_utils.CinderBasic, @validation.restricted_parameters(["name", "display_name"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.required_contexts("volumes") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, @@ -568,7 +571,8 @@ class CreateAndListSnapshots(cinder_utils.CinderBasic, @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) -@validation.required_services(consts.Service.CINDER, consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.CINDER, + consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder", "glance"]}, name="CinderVolumes.create_and_upload_volume_to_image") @@ -607,7 +611,7 @@ class CreateAndUploadVolumeToImage(cinder_utils.CinderBasic, subdict="create_volume_kwargs") @validation.restricted_parameters("name", subdict="create_backup_kwargs") @validation.required_cinder_services("cinder-backup") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_volume_backup") @@ -638,7 +642,7 @@ class CreateVolumeBackup(cinder_utils.CinderBasic): subdict="create_volume_kwargs") @validation.restricted_parameters("name", subdict="create_backup_kwargs") @validation.required_cinder_services("cinder-backup") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_restore_volume_backup") @@ -670,7 +674,7 @@ class CreateAndRestoreVolumeBackup(cinder_utils.CinderBasic): subdict="create_volume_kwargs") @validation.restricted_parameters("name", subdict="create_backup_kwargs") @validation.required_cinder_services("cinder-backup") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_list_volume_backups") @@ -702,7 +706,7 @@ class CreateAndListVolumeBackups(cinder_utils.CinderBasic): @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_volume_and_clone") @@ -743,7 +747,7 @@ class CreateVolumeAndClone(cinder_utils.CinderBasic): @validation.restricted_parameters(["name", "display_name"]) @validation.restricted_parameters(["name", "display_name"], subdict="create_snapshot_kwargs") -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.required_contexts("volumes") @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, @@ -775,7 +779,7 @@ class CreateVolumeFromSnapshot(cinder_utils.CinderBasic): @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_volume_" @@ -800,7 +804,7 @@ class CreateVolumeAndUpdateReadonlyFlag(cinder_utils.CinderBasic): @types.convert(image={"type": "glance_image"}) @validation.restricted_parameters(["name", "display_name"]) @validation.add("image_exists", param_name="image", nullable=True) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder"]}, name="CinderVolumes.create_and_accept_transfer") diff --git a/rally/plugins/openstack/scenarios/designate/basic.py b/rally/plugins/openstack/scenarios/designate/basic.py index 2cc1a66f..f472868d 100644 --- a/rally/plugins/openstack/scenarios/designate/basic.py +++ b/rally/plugins/openstack/scenarios/designate/basic.py @@ -25,7 +25,8 @@ from rally.task import validation """Basic scenarios for Designate.""" -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_list_domains") @@ -49,7 +50,8 @@ class CreateAndListDomains(utils.DesignateScenario): self.assertIn(domain, list_domains) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.list_domains") @@ -68,7 +70,8 @@ class ListDomains(utils.DesignateScenario): self._list_domains() -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_delete_domain") @@ -84,7 +87,8 @@ class CreateAndDeleteDomain(utils.DesignateScenario): self._delete_domain(domain["id"]) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_update_domain") @@ -100,7 +104,8 @@ class CreateAndUpdateDomain(utils.DesignateScenario): self._update_domain(domain) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_delete_records") @@ -131,7 +136,8 @@ class CreateAndDeleteRecords(utils.DesignateScenario): domain["id"], record["id"], atomic_action=False) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.list_records") @@ -153,7 +159,8 @@ class ListRecords(utils.DesignateScenario): self._list_records(domain_id) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_list_records") @@ -183,7 +190,8 @@ class CreateAndListRecords(utils.DesignateScenario): self.assertEqual(records, list_records) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["designate"]}, name="DesignateBasic.create_and_list_servers") @@ -204,7 +212,8 @@ class CreateAndListServers(utils.DesignateScenario): self.assertIn(server, list_servers) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["designate"]}, name="DesignateBasic.create_and_delete_server") @@ -220,7 +229,8 @@ class CreateAndDeleteServer(utils.DesignateScenario): self._delete_server(server["id"]) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="DesignateBasic.list_servers") class ListServers(utils.DesignateScenario): @@ -235,7 +245,8 @@ class ListServers(utils.DesignateScenario): # NOTE: API V2 -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_list_zones") @@ -258,7 +269,8 @@ class CreateAndListZones(utils.DesignateScenario): self.assertIn(zone, list_zones) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.list_zones") @@ -274,7 +286,8 @@ class ListZones(utils.DesignateScenario): self._list_zones() -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.create_and_delete_zone") @@ -290,7 +303,8 @@ class CreateAndDeleteZone(utils.DesignateScenario): self._delete_zone(zone["id"]) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["designate"]}, name="DesignateBasic.list_recordsets") @@ -308,7 +322,8 @@ class ListRecordsets(utils.DesignateScenario): self._list_recordsets(zone_id) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("zones") @scenario.configure(context={"cleanup": ["designate"]}, @@ -340,7 +355,8 @@ class CreateAndDeleteRecordsets(utils.DesignateScenario): zone["id"], recordset["id"], atomic_action=False) -@validation.required_services(consts.Service.DESIGNATE) +@validation.add("required_services", + services=[consts.Service.DESIGNATE]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("zones") @scenario.configure(context={"cleanup": ["designate"]}, diff --git a/rally/plugins/openstack/scenarios/ec2/servers.py b/rally/plugins/openstack/scenarios/ec2/servers.py index e1248bab..99dc7bd1 100644 --- a/rally/plugins/openstack/scenarios/ec2/servers.py +++ b/rally/plugins/openstack/scenarios/ec2/servers.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for servers using EC2.""" -@validation.required_services(consts.Service.EC2) +@validation.add("required_services", services=[consts.Service.EC2]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ec2"]}, name="EC2Servers.list_servers") @@ -41,7 +41,7 @@ class ListServers(utils.EC2Scenario): flavor={"type": "ec2_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.EC2) +@validation.add("required_services", services=[consts.Service.EC2]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["ec2"]}, name="EC2Servers.boot_server") diff --git a/rally/plugins/openstack/scenarios/glance/images.py b/rally/plugins/openstack/scenarios/glance/images.py index 8717e912..bd2366c5 100644 --- a/rally/plugins/openstack/scenarios/glance/images.py +++ b/rally/plugins/openstack/scenarios/glance/images.py @@ -42,7 +42,7 @@ class GlanceBasic(scenario.OpenStackScenario): @validation.restricted_parameters(["image_name", "name"]) @types.convert(image_location={"type": "path_or_url"}, kwargs={"type": "glance_image_args"}) -@validation.required_services(consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["glance"]}, name="GlanceImages.create_and_list_image") @@ -78,7 +78,7 @@ class CreateAndListImage(GlanceBasic): @types.convert(image_location={"type": "path_or_url"}, kwargs={"type": "glance_image_args"}) -@validation.required_services(consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["glance"]}, name="GlanceImages.create_and_get_image") @@ -109,7 +109,7 @@ class CreateAndGetImage(GlanceBasic): self.assertEqual(image.id, image_info.id) -@validation.required_services(consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["glance"]}, name="GlanceImages.list_images") @@ -131,7 +131,7 @@ class ListImages(GlanceBasic): @validation.restricted_parameters(["image_name", "name"]) @types.convert(image_location={"type": "path_or_url"}, kwargs={"type": "glance_image_args"}) -@validation.required_services(consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["glance"]}, name="GlanceImages.create_and_delete_image") @@ -160,7 +160,8 @@ class CreateAndDeleteImage(GlanceBasic): image_location={"type": "path_or_url"}, kwargs={"type": "glance_image_args"}) @validation.flavor_exists("flavor") -@validation.required_services(consts.Service.GLANCE, consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.GLANCE, + consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["glance", "nova"]}, name="GlanceImages.create_image_and_boot_instances") @@ -202,7 +203,7 @@ class CreateImageAndBootInstances(GlanceBasic, nova_utils.NovaScenario): @types.convert(image_location={"type": "path_or_url"}, kwargs={"type": "glance_image_args"}) -@validation.required_services(consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["glance"]}, name="GlanceImages.create_and_update_image") diff --git a/rally/plugins/openstack/scenarios/heat/stacks.py b/rally/plugins/openstack/scenarios/heat/stacks.py index f7ecef05..2db7b3b0 100644 --- a/rally/plugins/openstack/scenarios/heat/stacks.py +++ b/rally/plugins/openstack/scenarios/heat/stacks.py @@ -26,7 +26,7 @@ from rally.task import validation @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_and_list_stack") @@ -51,7 +51,7 @@ class CreateAndListStack(utils.HeatScenario): self.assertIn(stack.id, [i.id for i in list_stacks]) -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="HeatStacks.list_stacks_and_resources") class ListStacksAndResources(utils.HeatScenario): @@ -67,7 +67,7 @@ class ListStacksAndResources(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_and_delete_stack") @@ -93,7 +93,7 @@ class CreateAndDeleteStack(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_check_delete_stack") @@ -125,7 +125,7 @@ class CreateCheckDeleteStack(utils.HeatScenario): files={"type": "file_dict"}, updated_files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_update_delete_stack") @@ -164,7 +164,7 @@ class CreateUpdateDeleteStack(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_stack_and_scale") @@ -206,7 +206,7 @@ class CreateStackAndScale(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_suspend_resume_delete_stack") @@ -234,7 +234,7 @@ class CreateSuspendResumeDeleteStack(utils.HeatScenario): self._delete_stack(s) -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="HeatStacks.list_stacks_and_events") class ListStacksAndEvents(utils.HeatScenario): @@ -250,7 +250,7 @@ class ListStacksAndEvents(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) @validation.validate_heat_template("template_path") -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_snapshot_restore_delete_stack") @@ -280,7 +280,7 @@ class CreateSnapshotRestoreDeleteStack(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_stack_and_show_output_via_API") @@ -307,7 +307,7 @@ class CreateStackAndShowOutputViaAPI(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_stack_and_show_output") @@ -334,7 +334,7 @@ class CreateStackAndShowOutput(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_stack_and_list_output_via_API") @@ -359,7 +359,7 @@ class CreateStackAndListOutputViaAPI(utils.HeatScenario): @types.convert(template_path={"type": "file"}, files={"type": "file_dict"}) -@validation.required_services(consts.Service.HEAT) +@validation.add("required_services", services=[consts.Service.HEAT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["heat"]}, name="HeatStacks.create_stack_and_list_output") diff --git a/rally/plugins/openstack/scenarios/ironic/nodes.py b/rally/plugins/openstack/scenarios/ironic/nodes.py index fbe8ff80..65181968 100644 --- a/rally/plugins/openstack/scenarios/ironic/nodes.py +++ b/rally/plugins/openstack/scenarios/ironic/nodes.py @@ -26,7 +26,7 @@ from rally.task import validation @logging.log_deprecated_args("Useless arguments detected", "0.10.0", ("marker", "limit", "sort_key"), once=True) @validation.restricted_parameters(["name"]) -@validation.required_services(consts.Service.IRONIC) +@validation.add("required_services", services=[consts.Service.IRONIC]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["ironic"]}, name="IronicNodes.create_and_list_node") @@ -66,7 +66,7 @@ class CreateAndListNode(utils.IronicScenario): @validation.restricted_parameters(["name"]) -@validation.required_services(consts.Service.IRONIC) +@validation.add("required_services", services=[consts.Service.IRONIC]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["ironic"]}, name="IronicNodes.create_and_delete_node") diff --git a/rally/plugins/openstack/scenarios/magnum/cluster_templates.py b/rally/plugins/openstack/scenarios/magnum/cluster_templates.py index c9d8fd27..91bfee68 100644 --- a/rally/plugins/openstack/scenarios/magnum/cluster_templates.py +++ b/rally/plugins/openstack/scenarios/magnum/cluster_templates.py @@ -21,7 +21,7 @@ from rally.task import validation """Scenarios for Magnum cluster_templates.""" -@validation.required_services(consts.Service.MAGNUM) +@validation.add("required_services", services=[consts.Service.MAGNUM]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["magnum"]}, name="MagnumClusterTemplates.list_cluster_templates") diff --git a/rally/plugins/openstack/scenarios/magnum/clusters.py b/rally/plugins/openstack/scenarios/magnum/clusters.py index 571f84e3..9fc8a4a1 100644 --- a/rally/plugins/openstack/scenarios/magnum/clusters.py +++ b/rally/plugins/openstack/scenarios/magnum/clusters.py @@ -21,7 +21,7 @@ from rally.task import validation """Scenarios for Magnum clusters.""" -@validation.required_services(consts.Service.MAGNUM) +@validation.add("required_services", services=[consts.Service.MAGNUM]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["magnum.clusters"]}, name="MagnumClusters.list_clusters") @@ -44,7 +44,7 @@ class ListClusters(utils.MagnumScenario): self._list_clusters(**kwargs) -@validation.required_services(consts.Service.MAGNUM) +@validation.add("required_services", services=[consts.Service.MAGNUM]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["magnum.clusters", "nova.keypairs"]}, name="MagnumClusters.create_and_list_clusters") diff --git a/rally/plugins/openstack/scenarios/manila/shares.py b/rally/plugins/openstack/scenarios/manila/shares.py index 95141a08..3a065fcb 100644 --- a/rally/plugins/openstack/scenarios/manila/shares.py +++ b/rally/plugins/openstack/scenarios/manila/shares.py @@ -25,7 +25,7 @@ from rally.task import validation @validation.validate_share_proto() -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["manila"]}, name="ManilaShares.create_and_delete_share") @@ -53,7 +53,7 @@ class CreateAndDeleteShare(utils.ManilaScenario): self._delete_share(share) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="ManilaShares.list_shares") class ListShares(utils.ManilaScenario): @@ -69,7 +69,7 @@ class ListShares(utils.ManilaScenario): self._list_shares(detailed=detailed, search_opts=search_opts) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["manila"]}, name="ManilaShares.create_share_network_and_delete") @@ -96,7 +96,7 @@ class CreateShareNetworkAndDelete(utils.ManilaScenario): self._delete_share_network(share_network) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["manila"]}, name="ManilaShares.create_share_network_and_list") @@ -131,7 +131,7 @@ class CreateShareNetworkAndList(utils.ManilaScenario): ) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="ManilaShares.list_share_servers") class ListShareServers(utils.ManilaScenario): @@ -147,7 +147,7 @@ class ListShareServers(utils.ManilaScenario): self._list_share_servers(search_opts=search_opts) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["manila"]}, name="ManilaShares.create_security_service_and_delete") @@ -182,7 +182,7 @@ class CreateSecurityServiceAndDelete(utils.ManilaScenario): self._delete_security_service(security_service) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["manila"]}, name=("ManilaShares." @@ -203,7 +203,7 @@ class AttachSecurityServiceToShareNetwork(utils.ManilaScenario): @validation.validate_share_proto() -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["manila"]}, name=("ManilaShares.create_and_list_share")) @@ -240,7 +240,7 @@ class CreateAndListShare(utils.ManilaScenario): integer_only=True) @validation.add("number", param_name="value_max_length", minval=1, maxval=1024, integer_only=True) -@validation.required_services(consts.Service.MANILA) +@validation.add("required_services", services=[consts.Service.MANILA]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts(manila_consts.SHARES_CONTEXT_NAME) @scenario.configure( diff --git a/rally/plugins/openstack/scenarios/mistral/executions.py b/rally/plugins/openstack/scenarios/mistral/executions.py index 554714e6..50802a1f 100644 --- a/rally/plugins/openstack/scenarios/mistral/executions.py +++ b/rally/plugins/openstack/scenarios/mistral/executions.py @@ -28,7 +28,8 @@ from rally.task import validation @validation.add("required_platform", platform="openstack", users=True) -@validation.required_services(consts.Service.MISTRAL) +@validation.add("required_services", + services=[consts.Service.MISTRAL]) @scenario.configure(name="MistralExecutions.list_executions", context={"cleanup": ["mistral"]}) class ListExecutions(utils.MistralScenario): @@ -55,7 +56,8 @@ class ListExecutions(utils.MistralScenario): @types.convert(params={"type": "file"}) @types.convert(wf_input={"type": "file"}) @validation.add("required_platform", platform="openstack", users=True) -@validation.required_services(consts.Service.MISTRAL) +@validation.add("required_services", + services=[consts.Service.MISTRAL]) @validation.workbook_contains_workflow("definition", "workflow_name") @scenario.configure( name="MistralExecutions.create_execution_from_workbook", diff --git a/rally/plugins/openstack/scenarios/mistral/workbooks.py b/rally/plugins/openstack/scenarios/mistral/workbooks.py index f6ebbb8e..6e38da0c 100644 --- a/rally/plugins/openstack/scenarios/mistral/workbooks.py +++ b/rally/plugins/openstack/scenarios/mistral/workbooks.py @@ -24,7 +24,8 @@ from rally.task import validation @validation.add("required_platform", platform="openstack", users=True) -@validation.required_services(consts.Service.MISTRAL) +@validation.add("required_services", + services=[consts.Service.MISTRAL]) @scenario.configure(name="MistralWorkbooks.list_workbooks") class ListWorkbooks(utils.MistralScenario): @@ -40,7 +41,8 @@ class ListWorkbooks(utils.MistralScenario): @validation.file_exists("definition") @types.convert(definition={"type": "file"}) @validation.add("required_platform", platform="openstack", users=True) -@validation.required_services(consts.Service.MISTRAL) +@validation.add("required_services", + services=[consts.Service.MISTRAL]) @scenario.configure(context={"cleanup": ["mistral"]}, name="MistralWorkbooks.create_workbook") class CreateWorkbook(utils.MistralScenario): diff --git a/rally/plugins/openstack/scenarios/monasca/metrics.py b/rally/plugins/openstack/scenarios/monasca/metrics.py index 2cf940ed..f7262e47 100644 --- a/rally/plugins/openstack/scenarios/monasca/metrics.py +++ b/rally/plugins/openstack/scenarios/monasca/metrics.py @@ -21,7 +21,8 @@ from rally.task import validation """Scenarios for monasca Metrics API.""" -@validation.required_services(consts.Service.MONASCA) +@validation.add("required_services", + services=[consts.Service.MONASCA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="MonascaMetrics.list_metrics") class ListMetrics(monascautils.MonascaScenario): diff --git a/rally/plugins/openstack/scenarios/murano/environments.py b/rally/plugins/openstack/scenarios/murano/environments.py index fc4eb867..92e82c61 100755 --- a/rally/plugins/openstack/scenarios/murano/environments.py +++ b/rally/plugins/openstack/scenarios/murano/environments.py @@ -23,7 +23,7 @@ from rally.task import validation """Scenarios for Murano environments.""" -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @scenario.configure(context={"cleanup": ["murano.environments"]}, name="MuranoEnvironments.list_environments") class ListEnvironments(utils.MuranoScenario): @@ -36,7 +36,7 @@ class ListEnvironments(utils.MuranoScenario): self._list_environments() -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @scenario.configure(context={"cleanup": ["murano.environments"]}, name="MuranoEnvironments.create_and_delete_environment") class CreateAndDeleteEnvironment(utils.MuranoScenario): @@ -49,7 +49,7 @@ class CreateAndDeleteEnvironment(utils.MuranoScenario): self._delete_environment(environment) -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @validation.required_contexts("murano_packages") @scenario.configure(context={"cleanup": ["murano"], "roles": ["admin"]}, name="MuranoEnvironments.create_and_deploy_environment") diff --git a/rally/plugins/openstack/scenarios/murano/packages.py b/rally/plugins/openstack/scenarios/murano/packages.py index b3cb3d97..20bf9f8d 100644 --- a/rally/plugins/openstack/scenarios/murano/packages.py +++ b/rally/plugins/openstack/scenarios/murano/packages.py @@ -26,7 +26,7 @@ from rally.task import validation @validation.file_exists(param_name="package", mode=os.F_OK) -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["murano.packages"]}, name="MuranoPackages.import_and_list_packages") @@ -56,7 +56,7 @@ class ImportAndListPackages(utils.MuranoScenario): @validation.file_exists(param_name="package", mode=os.F_OK) -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["murano.packages"]}, name="MuranoPackages.import_and_delete_package") @@ -83,7 +83,7 @@ class ImportAndDeletePackage(utils.MuranoScenario): @validation.file_exists(param_name="package", mode=os.F_OK) -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["murano.packages"]}, name="MuranoPackages.package_lifecycle") @@ -119,7 +119,7 @@ class PackageLifecycle(utils.MuranoScenario): @validation.file_exists(param_name="package", mode=os.F_OK) -@validation.required_services(consts.Service.MURANO) +@validation.add("required_services", services=[consts.Service.MURANO]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["murano.packages"]}, name="MuranoPackages.import_and_filter_applications") diff --git a/rally/plugins/openstack/scenarios/neutron/bgpvpn.py b/rally/plugins/openstack/scenarios/neutron/bgpvpn.py index 96f5d33e..bcaf3be7 100644 --- a/rally/plugins/openstack/scenarios/neutron/bgpvpn.py +++ b/rally/plugins/openstack/scenarios/neutron/bgpvpn.py @@ -19,8 +19,9 @@ from rally.task import validation @validation.add("required_neutron_extensions", extensions=["bgpvpn"]) -@validation.required_services(consts.Service.NEUTRON) @validation.add("required_platform", platform="openstack", admin=True) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @scenario.configure(context={"admin_cleanup": ["neutron"]}, name="NeutronBGPVPN.create_and_delete_bgpvpns") class CreateAndDeleteBgpvpns(utils.NeutronScenario): @@ -50,7 +51,7 @@ class CreateAndDeleteBgpvpns(utils.NeutronScenario): @validation.add("required_neutron_extensions", extensions=["bgpvpn"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["neutron"]}, name="NeutronBGPVPN.create_and_list_bgpvpns") @@ -81,7 +82,7 @@ class CreateAndListBgpvpns(utils.NeutronScenario): @validation.add("required_neutron_extensions", extensions=["bgpvpn"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["neutron"]}, name="NeutronBGPVPN.create_and_update_bgpvpns") diff --git a/rally/plugins/openstack/scenarios/neutron/loadbalancer_v1.py b/rally/plugins/openstack/scenarios/neutron/loadbalancer_v1.py index d2037de1..e9c92c61 100644 --- a/rally/plugins/openstack/scenarios/neutron/loadbalancer_v1.py +++ b/rally/plugins/openstack/scenarios/neutron/loadbalancer_v1.py @@ -25,7 +25,8 @@ from rally.task import validation @validation.restricted_parameters("subnet_id", subdict="pool_create_args") @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -49,7 +50,8 @@ class CreateAndListPools(utils.NeutronScenario): @validation.restricted_parameters("subnet_id", subdict="pool_create_args") @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -75,7 +77,8 @@ class CreateAndDeletePools(utils.NeutronScenario): @validation.restricted_parameters("subnet_id", subdict="pool_create_args") @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -103,7 +106,8 @@ class CreateAndUpdatePools(utils.NeutronScenario): @validation.restricted_parameters(["pool_id", "subnet_id"], subdict="vip_create_args") @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -133,7 +137,8 @@ class CreateAndListVips(utils.NeutronScenario): @validation.restricted_parameters(["pool_id", "subnet_id"], subdict="vip_create_args") @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -165,7 +170,8 @@ class CreateAndDeleteVips(utils.NeutronScenario): @validation.restricted_parameters(["pool_id", "subnet_id"], subdict="vip_create_args") @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -198,7 +204,8 @@ class CreateAndUpdateVips(utils.NeutronScenario): @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronLoadbalancerV1" @@ -220,7 +227,8 @@ class CreateAndListHealthmonitors(utils.NeutronScenario): @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronLoadbalancerV1" @@ -244,7 +252,8 @@ class CreateAndDeleteHealthmonitors(utils.NeutronScenario): @validation.add("required_neutron_extensions", extensions=["lbaas"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronLoadbalancerV1" diff --git a/rally/plugins/openstack/scenarios/neutron/loadbalancer_v2.py b/rally/plugins/openstack/scenarios/neutron/loadbalancer_v2.py index a29c352f..15c88788 100755 --- a/rally/plugins/openstack/scenarios/neutron/loadbalancer_v2.py +++ b/rally/plugins/openstack/scenarios/neutron/loadbalancer_v2.py @@ -20,7 +20,8 @@ from rally.task import validation @validation.add("required_neutron_extensions", extensions=["lbaasv2"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["neutron"]}, diff --git a/rally/plugins/openstack/scenarios/neutron/network.py b/rally/plugins/openstack/scenarios/neutron/network.py index 6f9a374f..2b3d7aef 100644 --- a/rally/plugins/openstack/scenarios/neutron/network.py +++ b/rally/plugins/openstack/scenarios/neutron/network.py @@ -23,7 +23,8 @@ from rally.task import validation """Scenarios for Neutron.""" -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_list_networks") @@ -46,7 +47,8 @@ class CreateAndListNetworks(utils.NeutronScenario): self._list_networks() -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_show_network") @@ -63,7 +65,8 @@ class CreateAndShowNetwork(utils.NeutronScenario): self._show_network(network) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_update_networks") @@ -81,7 +84,8 @@ class CreateAndUpdateNetworks(utils.NeutronScenario): self._update_network(network, network_update_args) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_delete_networks") class CreateAndDeleteNetworks(utils.NeutronScenario): @@ -99,7 +103,8 @@ class CreateAndDeleteNetworks(utils.NeutronScenario): @validation.add("number", param_name="subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_list_subnets") @@ -126,7 +131,8 @@ class CreateAndListSubnets(utils.NeutronScenario): @validation.add("number", param_name="subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_update_subnets") @@ -158,7 +164,8 @@ class CreateAndUpdateSubnets(utils.NeutronScenario): @validation.add("number", param_name="subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_show_subnets") @@ -190,7 +197,8 @@ class CreateAndShowSubnets(utils.NeutronScenario): @validation.number("subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_delete_subnets") class CreateAndDeleteSubnets(utils.NeutronScenario): @@ -218,7 +226,8 @@ class CreateAndDeleteSubnets(utils.NeutronScenario): @validation.add("number", param_name="subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_list_routers") @@ -247,7 +256,7 @@ class CreateAndListRouters(utils.NeutronScenario): @validation.add("number", param_name="subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_show_routers") @@ -277,7 +286,8 @@ class CreateAndShowRouters(utils.NeutronScenario): @validation.number("subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_update_routers") class CreateAndUpdateRouters(utils.NeutronScenario): @@ -307,7 +317,8 @@ class CreateAndUpdateRouters(utils.NeutronScenario): @validation.number("subnets_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_delete_routers") class CreateAndDeleteRouters(utils.NeutronScenario): @@ -338,7 +349,8 @@ class CreateAndDeleteRouters(utils.NeutronScenario): self._delete_router(router) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.set_and_clear_router_gateway") @@ -367,7 +379,8 @@ class SetAndClearRouterGateway(utils.NeutronScenario): @validation.add("number", param_name="ports_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_list_ports") @@ -391,7 +404,8 @@ class CreateAndListPorts(utils.NeutronScenario): @validation.add("number", param_name="ports_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_update_ports") @@ -418,7 +432,8 @@ class CreateAndUpdatePorts(utils.NeutronScenario): @validation.add("number", param_name="ports_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_show_ports") @@ -454,7 +469,8 @@ class CreateAndShowPorts(utils.NeutronScenario): @validation.number("ports_per_network", minval=1, integer_only=True) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @scenario.configure(context={"cleanup": ["neutron"]}, name="NeutronNetworks.create_and_delete_ports") class CreateAndDeletePorts(utils.NeutronScenario): @@ -477,7 +493,8 @@ class CreateAndDeletePorts(utils.NeutronScenario): self._delete_port(port) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.add("external_network_exists", param_name="floating_network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -498,7 +515,8 @@ class CreateAndListFloatingIps(utils.NeutronScenario): self._list_floating_ips() -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @validation.add("external_network_exists", param_name="floating_network") @scenario.configure(context={"cleanup": ["neutron"]}, @@ -520,7 +538,8 @@ class CreateAndDeleteFloatingIps(utils.NeutronScenario): self._delete_floating_ip(floating_ip["floatingip"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="NeutronNetworks.list_agents") class ListAgents(utils.NeutronScenario): diff --git a/rally/plugins/openstack/scenarios/neutron/security_groups.py b/rally/plugins/openstack/scenarios/neutron/security_groups.py index 3b7a837d..29dbd2cb 100644 --- a/rally/plugins/openstack/scenarios/neutron/security_groups.py +++ b/rally/plugins/openstack/scenarios/neutron/security_groups.py @@ -19,7 +19,8 @@ from rally.task import validation """Scenarios for Neutron Security Groups.""" -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronSecurityGroup" @@ -40,7 +41,8 @@ class CreateAndListSecurityGroups(utils.NeutronScenario): self._list_security_groups() -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronSecurityGroup" @@ -65,7 +67,8 @@ class CreateAndShowSecurityGroup(utils.NeutronScenario): self._show_security_group(security_group) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronSecurityGroup" @@ -87,7 +90,8 @@ class CreateAndDeleteSecurityGroups(utils.NeutronScenario): self._delete_security_group(security_group) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["neutron"]}, name=("NeutronSecurityGroup" diff --git a/rally/plugins/openstack/scenarios/nova/agents.py b/rally/plugins/openstack/scenarios/nova/agents.py index 22ba1bf9..5cad96e7 100644 --- a/rally/plugins/openstack/scenarios/nova/agents.py +++ b/rally/plugins/openstack/scenarios/nova/agents.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for Nova agents.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaAgents.list_agents") class ListAgents(utils.NovaScenario): diff --git a/rally/plugins/openstack/scenarios/nova/aggregates.py b/rally/plugins/openstack/scenarios/nova/aggregates.py index 71846115..af3995ac 100644 --- a/rally/plugins/openstack/scenarios/nova/aggregates.py +++ b/rally/plugins/openstack/scenarios/nova/aggregates.py @@ -24,7 +24,7 @@ from rally.task import validation """Scenarios for Nova aggregates.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaAggregates.list_aggregates") class ListAggregates(utils.NovaScenario): @@ -37,7 +37,7 @@ class ListAggregates(utils.NovaScenario): self._list_aggregates() -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaAggregates.create_and_list_aggregates") @@ -59,7 +59,7 @@ class CreateAndListAggregates(utils.NovaScenario): self.assertIn(aggregate, all_aggregates, err_msg=msg) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaAggregates.create_and_delete_aggregate") @@ -76,7 +76,7 @@ class CreateAndDeleteAggregate(utils.NovaScenario): self._delete_aggregate(aggregate) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaAggregates.create_and_update_aggregate") @@ -94,7 +94,7 @@ class CreateAndUpdateAggregate(utils.NovaScenario): self._update_aggregate(aggregate) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaAggregates.create_aggregate_add_and_remove_host") @@ -115,7 +115,7 @@ class CreateAggregateAddAndRemoveHost(utils.NovaScenario): self._aggregate_remove_host(aggregate, host_name) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaAggregates.create_and_get_aggregate_details") @@ -133,7 +133,7 @@ class CreateAndGetAggregateDetails(utils.NovaScenario): @types.convert(image={"type": "glance_image"}) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["nova"], "cleanup": ["nova"]}, diff --git a/rally/plugins/openstack/scenarios/nova/availability_zones.py b/rally/plugins/openstack/scenarios/nova/availability_zones.py index 27bdda5e..d8afbb75 100644 --- a/rally/plugins/openstack/scenarios/nova/availability_zones.py +++ b/rally/plugins/openstack/scenarios/nova/availability_zones.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for Nova availability-zones.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaAvailabilityZones.list_availability_zones") class ListAvailabilityZones(utils.NovaScenario): diff --git a/rally/plugins/openstack/scenarios/nova/flavors.py b/rally/plugins/openstack/scenarios/nova/flavors.py index 883d63aa..51e6e595 100644 --- a/rally/plugins/openstack/scenarios/nova/flavors.py +++ b/rally/plugins/openstack/scenarios/nova/flavors.py @@ -27,7 +27,7 @@ from rally.task import validation LOG = logging.getLogger(__name__) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(name="NovaFlavors.list_flavors") class ListFlavors(utils.NovaScenario): @@ -45,7 +45,7 @@ class ListFlavors(utils.NovaScenario): self._list_flavors(detailed, **kwargs) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=(consts.Service.NOVA)) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaFlavors.create_and_list_flavor_access") @@ -71,7 +71,7 @@ class CreateAndListFlavorAccess(utils.NovaScenario): self._list_flavor_access(flavor.id) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaFlavors.create_flavor_and_add_tenant_access") @@ -90,7 +90,7 @@ class CreateFlavorAndAddTenantAccess(utils.NovaScenario): self._add_tenant_access(flavor.id, self.context["tenant"]["id"]) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaFlavors.create_flavor") @@ -107,7 +107,7 @@ class CreateFlavor(utils.NovaScenario): self._create_flavor(ram, vcpus, disk, **kwargs) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=(consts.Service.NOVA)) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaFlavors.create_and_get_flavor") @@ -127,7 +127,7 @@ class CreateAndGetFlavor(utils.NovaScenario): self._get_flavor(flavor.id) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaFlavors.create_and_delete_flavor") @@ -145,7 +145,7 @@ class CreateAndDeleteFlavor(utils.NovaScenario): self._delete_flavor(flavor.id) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["nova"]}, name="NovaFlavors.create_flavor_and_set_keys") diff --git a/rally/plugins/openstack/scenarios/nova/hosts.py b/rally/plugins/openstack/scenarios/nova/hosts.py index 4ee2b9fc..15a91fd1 100644 --- a/rally/plugins/openstack/scenarios/nova/hosts.py +++ b/rally/plugins/openstack/scenarios/nova/hosts.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for Nova hosts.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHosts.list_hosts") class ListHosts(utils.NovaScenario): @@ -39,7 +39,7 @@ class ListHosts(utils.NovaScenario): self._list_hosts(zone) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHosts.list_and_get_hosts") class ListAndGetHosts(utils.NovaScenario): diff --git a/rally/plugins/openstack/scenarios/nova/hypervisors.py b/rally/plugins/openstack/scenarios/nova/hypervisors.py index 91f942e7..5b507d34 100644 --- a/rally/plugins/openstack/scenarios/nova/hypervisors.py +++ b/rally/plugins/openstack/scenarios/nova/hypervisors.py @@ -23,7 +23,7 @@ from rally.task import validation """Scenarios for Nova hypervisors.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHypervisors.list_hypervisors") class ListHypervisors(utils.NovaScenario): @@ -39,7 +39,7 @@ class ListHypervisors(utils.NovaScenario): self._list_hypervisors(detailed) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHypervisors.list_and_get_hypervisors") class ListAndGetHypervisors(utils.NovaScenario): @@ -62,7 +62,7 @@ class ListAndGetHypervisors(utils.NovaScenario): self._get_hypervisor(hypervisor, atomic_action=False) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHypervisors.statistics_hypervisors") class StatisticsHypervisors(utils.NovaScenario): @@ -75,7 +75,7 @@ class StatisticsHypervisors(utils.NovaScenario): self._statistics_hypervisors() -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHypervisors.list_and_get_uptime_hypervisors") class ListAndGetUptimeHypervisors(utils.NovaScenario): @@ -97,7 +97,7 @@ class ListAndGetUptimeHypervisors(utils.NovaScenario): self._uptime_hypervisor(hypervisor, atomic_action=False) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaHypervisors.list_and_search_hypervisors") class ListAndSearchHypervisors(utils.NovaScenario): diff --git a/rally/plugins/openstack/scenarios/nova/images.py b/rally/plugins/openstack/scenarios/nova/images.py index 5b365a0c..17d70795 100644 --- a/rally/plugins/openstack/scenarios/nova/images.py +++ b/rally/plugins/openstack/scenarios/nova/images.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for Nova images.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaImages.list_images") diff --git a/rally/plugins/openstack/scenarios/nova/keypairs.py b/rally/plugins/openstack/scenarios/nova/keypairs.py index 13eb1953..5cfe09e2 100644 --- a/rally/plugins/openstack/scenarios/nova/keypairs.py +++ b/rally/plugins/openstack/scenarios/nova/keypairs.py @@ -24,7 +24,7 @@ from rally.task import validation """Scenarios for Nova keypairs.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaKeypair.create_and_list_keypairs") @@ -45,7 +45,7 @@ class CreateAndListKeypairs(utils.NovaScenario): self.assertIn(keypair_name, [i.id for i in list_keypairs]) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaKeypair.create_and_delete_keypair") @@ -67,7 +67,7 @@ class CreateAndDeleteKeypair(utils.NovaScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaKeypair.boot_and_delete_server_with_keypair") @@ -104,7 +104,7 @@ class BootAndDeleteServerWithKeypair(utils.NovaScenario): self._delete_keypair(keypair) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaKeypair.create_and_get_keypair") diff --git a/rally/plugins/openstack/scenarios/nova/server_groups.py b/rally/plugins/openstack/scenarios/nova/server_groups.py index 7efa9102..c008a5cf 100755 --- a/rally/plugins/openstack/scenarios/nova/server_groups.py +++ b/rally/plugins/openstack/scenarios/nova/server_groups.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for Nova Group servers.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServerGroups.create_and_list_server_groups") @@ -51,7 +51,7 @@ class CreateAndListServerGroups(utils.NovaScenario): self.assertIn(server_group, server_groups_list, err_msg=msg) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServerGroups.create_and_get_server_group") diff --git a/rally/plugins/openstack/scenarios/nova/servers.py b/rally/plugins/openstack/scenarios/nova/servers.py index f09c7ad1..dcd2dfe8 100755 --- a/rally/plugins/openstack/scenarios/nova/servers.py +++ b/rally/plugins/openstack/scenarios/nova/servers.py @@ -37,7 +37,7 @@ LOG = logging.getLogger(__name__) flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=(consts.Service.NOVA)) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_and_list_server") @@ -71,7 +71,7 @@ class BootAndListServer(utils.NovaScenario, cinder_utils.CinderScenario): self.assertIn(server, pool_list, err_msg=msg) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.list_servers") @@ -93,7 +93,7 @@ class ListServers(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_and_delete_server") @@ -123,7 +123,7 @@ class BootAndDeleteServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"cleanup": ["nova"]}, @@ -156,7 +156,8 @@ class BootAndDeleteMultipleServers(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image", validate_disk=False) -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"]}, name="NovaServers.boot_server_from_volume_and_delete") @@ -196,7 +197,7 @@ class BootServerFromVolumeAndDelete(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_and_bounce_server") @@ -237,7 +238,7 @@ class BootAndBounceServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_lock_unlock_and_delete") @@ -271,7 +272,8 @@ class BootLockUnlockAndDelete(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA, consts.Service.GLANCE) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.GLANCE]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "glance"]}, name="NovaServers.snapshot_server") @@ -299,7 +301,7 @@ class SnapshotServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_server") @@ -323,7 +325,8 @@ class BootServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image", validate_disk=False) -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"]}, name="NovaServers.boot_server_from_volume") @@ -357,7 +360,7 @@ class BootServerFromVolume(utils.NovaScenario, cinder_utils.CinderScenario): to_flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=(consts.Service.NOVA)) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.resize_server") @@ -391,7 +394,7 @@ class ResizeServer(utils.NovaScenario, cinder_utils.CinderScenario): to_flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.resize_shutoff_server") @@ -427,7 +430,8 @@ class ResizeShutoffServer(utils.NovaScenario): to_flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["cinder", "nova"]}, name=("NovaServers.boot_server" @@ -484,7 +488,8 @@ class BootServerAttachCreatedVolumeAndResize(utils.NovaScenario, to_flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image", validate_disk=False) -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"]}, name="NovaServers.boot_server_from_volume_and_resize") @@ -545,7 +550,7 @@ class BootServerFromVolumeAndResize(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.suspend_and_resume_server") @@ -569,7 +574,7 @@ class SuspendAndResumeServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.pause_and_unpause_server") @@ -594,7 +599,7 @@ class PauseAndUnpauseServer(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.shelve_and_unshelve_server") @@ -619,7 +624,7 @@ class ShelveAndUnshelveServer(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"cleanup": ["nova"]}, @@ -662,7 +667,8 @@ class BootAndLiveMigrateServer(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image", validate_disk=False) -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"]}, @@ -717,7 +723,8 @@ class BootServerFromVolumeAndLiveMigrate(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"cleanup": ["cinder", "nova"]}, @@ -776,7 +783,7 @@ class BootServerAttachCreatedVolumeAndLiveMigrate(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"cleanup": ["nova"]}, @@ -813,7 +820,7 @@ class BootAndMigrateServer(utils.NovaScenario, cinder_utils.CinderScenario): image_param="from_image") @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="to_image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"cleanup": ["nova"]}, @@ -840,7 +847,7 @@ class BootAndRebuildServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["nova", "neutron.floatingip"]}, @@ -865,7 +872,8 @@ class BootAndAssociateFloatingIp(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA, consts.Service.NEUTRON) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "neutron"]}, name="NovaServers.boot_server_and_attach_interface") @@ -898,7 +906,7 @@ class BootServerAndAttachInterface(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_and_show_server") @@ -923,7 +931,7 @@ class BootAndShowServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_and_get_console_output") @@ -950,7 +958,7 @@ class BootAndGetConsoleOutput(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova"]}, name="NovaServers.boot_and_update_server") @@ -975,7 +983,8 @@ class BootAndUpdateServer(utils.NovaScenario, cinder_utils.CinderScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"]}, name="NovaServers.boot_server_from_volume_snapshot") @@ -1012,7 +1021,7 @@ class BootServerFromVolumeSnapshot(utils.NovaScenario, flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["nova", "neutron.floatingip"]}, @@ -1042,7 +1051,7 @@ class BootServerAssociateAndDissociateFloatingIP(utils.NovaScenario): flavor={"type": "nova_flavor"}) @validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image") -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", users=True) @validation.required_contexts("network") @scenario.configure(context={"cleanup": ["nova"]}, diff --git a/rally/plugins/openstack/scenarios/nova/services.py b/rally/plugins/openstack/scenarios/nova/services.py index 038145b9..38d9a3a0 100644 --- a/rally/plugins/openstack/scenarios/nova/services.py +++ b/rally/plugins/openstack/scenarios/nova/services.py @@ -22,7 +22,7 @@ from rally.task import validation """Scenarios for Nova agents.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(name="NovaServices.list_services") class ListServices(utils.NovaScenario): diff --git a/rally/plugins/openstack/scenarios/quotas/quotas.py b/rally/plugins/openstack/scenarios/quotas/quotas.py index 9197daa4..d1a43049 100644 --- a/rally/plugins/openstack/scenarios/quotas/quotas.py +++ b/rally/plugins/openstack/scenarios/quotas/quotas.py @@ -21,7 +21,7 @@ from rally.task import validation """Scenarios for quotas.""" -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["nova.quotas"]}, @@ -38,7 +38,7 @@ class NovaUpdate(utils.QuotasScenario): max_quota) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["nova.quotas"]}, @@ -56,7 +56,7 @@ class NovaUpdateAndDelete(utils.QuotasScenario): self._delete_quotas("nova", self.context["tenant"]["id"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["cinder.quotas"]}, @@ -73,7 +73,7 @@ class CinderUpdate(utils.QuotasScenario): max_quota) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["cinder.quotas"]}, @@ -89,7 +89,7 @@ class CinderGet(utils.QuotasScenario): self._get_quotas("cinder", self.context["tenant"]["id"]) -@validation.required_services(consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["cinder.quotas"]}, @@ -107,7 +107,8 @@ class CinderUpdateAndDelete(utils.QuotasScenario): self._delete_quotas("cinder", self.context["tenant"]["id"]) -@validation.required_services(consts.Service.NEUTRON) +@validation.add("required_services", + services=[consts.Service.NEUTRON]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["neutron.quota"]}, @@ -125,7 +126,7 @@ class NeutronUpdate(utils.QuotasScenario): max_quota, quota_update_fn) -@validation.required_services(consts.Service.NOVA) +@validation.add("required_services", services=[consts.Service.NOVA]) @validation.add("required_platform", platform="openstack", admin=True, users=True) @scenario.configure(context={"admin_cleanup": ["nova.quotas"]}, diff --git a/rally/plugins/openstack/scenarios/sahara/clusters.py b/rally/plugins/openstack/scenarios/sahara/clusters.py index df33cc77..ec067054 100644 --- a/rally/plugins/openstack/scenarios/sahara/clusters.py +++ b/rally/plugins/openstack/scenarios/sahara/clusters.py @@ -35,7 +35,7 @@ LOG = logging.getLogger(__name__) @validation.required_contexts("users", "sahara_image") @validation.add("number", param_name="workers_count", minval=1, integer_only=True) -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["sahara"]}, name="SaharaClusters.create_and_delete_cluster") @@ -123,7 +123,7 @@ class CreateAndDeleteCluster(utils.SaharaScenario): worker_flavor={"type": "nova_flavor"}) @validation.flavor_exists("master_flavor") @validation.flavor_exists("worker_flavor") -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.required_contexts("users", "sahara_image") @validation.add("number", param_name="workers_count", minval=1, integer_only=True) diff --git a/rally/plugins/openstack/scenarios/sahara/jobs.py b/rally/plugins/openstack/scenarios/sahara/jobs.py index 48c12556..8203a479 100644 --- a/rally/plugins/openstack/scenarios/sahara/jobs.py +++ b/rally/plugins/openstack/scenarios/sahara/jobs.py @@ -25,7 +25,7 @@ LOG = logging.getLogger(__name__) """Benchmark scenarios for Sahara jobs.""" -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.required_contexts("users", "sahara_image", "sahara_job_binaries", "sahara_cluster") @scenario.configure(context={"cleanup": ["sahara"]}, @@ -72,7 +72,7 @@ class CreateLaunchJob(utils.SaharaScenario): job_idx=job_idx) -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.required_contexts("users", "sahara_image", "sahara_job_binaries", "sahara_cluster") @scenario.configure(context={"cleanup": ["sahara"]}, @@ -95,7 +95,7 @@ class CreateLaunchJobSequence(utils.SaharaScenario): launch_job.run(job["job_type"], job["configs"], idx) -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.required_contexts("users", "sahara_image", "sahara_job_binaries", "sahara_cluster") @scenario.configure(context={"cleanup": ["sahara"]}, diff --git a/rally/plugins/openstack/scenarios/sahara/node_group_templates.py b/rally/plugins/openstack/scenarios/sahara/node_group_templates.py index 5c6ea573..f4e6da85 100644 --- a/rally/plugins/openstack/scenarios/sahara/node_group_templates.py +++ b/rally/plugins/openstack/scenarios/sahara/node_group_templates.py @@ -24,7 +24,7 @@ from rally.task import validation @types.convert(flavor={"type": "nova_flavor"}) @validation.flavor_exists("flavor") -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["sahara"]}, name="SaharaNodeGroupTemplates" @@ -69,7 +69,7 @@ class CreateAndListNodeGroupTemplates(utils.SaharaScenario): @types.convert(flavor={"type": "nova_flavor"}) @validation.flavor_exists("flavor") -@validation.required_services(consts.Service.SAHARA) +@validation.add("required_services", services=[consts.Service.SAHARA]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["sahara"]}, name="SaharaNodeGroupTemplates" diff --git a/rally/plugins/openstack/scenarios/senlin/clusters.py b/rally/plugins/openstack/scenarios/senlin/clusters.py index f5bb1c6f..c62706e8 100644 --- a/rally/plugins/openstack/scenarios/senlin/clusters.py +++ b/rally/plugins/openstack/scenarios/senlin/clusters.py @@ -20,7 +20,7 @@ from rally.task import validation @validation.add("required_platform", platform="openstack", admin=True) -@validation.required_services(consts.Service.SENLIN) +@validation.add("required_services", services=[consts.Service.SENLIN]) @validation.required_contexts("profiles") @scenario.configure(context={"admin_cleanup": ["senlin"]}, name="SenlinClusters.create_and_delete_cluster") diff --git a/rally/plugins/openstack/scenarios/swift/objects.py b/rally/plugins/openstack/scenarios/swift/objects.py index c8f83607..fdc85d2b 100644 --- a/rally/plugins/openstack/scenarios/swift/objects.py +++ b/rally/plugins/openstack/scenarios/swift/objects.py @@ -25,7 +25,7 @@ from rally.task import validation """Scenarios for Swift Objects.""" -@validation.required_services(consts.Service.SWIFT) +@validation.add("required_services", services=[consts.Service.SWIFT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["swift"]}, name="SwiftObjects.create_container" @@ -56,7 +56,7 @@ class CreateContainerAndObjectThenListObjects(utils.SwiftScenario): self._list_objects(container_name) -@validation.required_services(consts.Service.SWIFT) +@validation.add("required_services", services=[consts.Service.SWIFT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["swift"]}, name="SwiftObjects.create_container" @@ -95,7 +95,7 @@ class CreateContainerAndObjectThenDeleteAll(utils.SwiftScenario): self._delete_container(container_name) -@validation.required_services(consts.Service.SWIFT) +@validation.add("required_services", services=[consts.Service.SWIFT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["swift"]}, name="SwiftObjects.create_container" @@ -133,7 +133,7 @@ class CreateContainerAndObjectThenDownloadObject(utils.SwiftScenario): atomic_action=False) -@validation.required_services(consts.Service.SWIFT) +@validation.add("required_services", services=[consts.Service.SWIFT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"swift_objects": {}}, name="SwiftObjects.list_objects_in_containers") @@ -153,7 +153,7 @@ class ListObjectsInContainers(utils.SwiftScenario): self._list_objects(container["name"], atomic_action=False) -@validation.required_services(consts.Service.SWIFT) +@validation.add("required_services", services=[consts.Service.SWIFT]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"swift_objects": {}}, name="SwiftObjects.list_and_" diff --git a/rally/plugins/openstack/scenarios/vm/vmtasks.py b/rally/plugins/openstack/scenarios/vm/vmtasks.py index 073fef21..4394a1ab 100644 --- a/rally/plugins/openstack/scenarios/vm/vmtasks.py +++ b/rally/plugins/openstack/scenarios/vm/vmtasks.py @@ -44,7 +44,8 @@ LOG = logging.getLogger(__name__) @validation.add("external_network_exists", param_name="floating_network") @validation.required_param_or_context(arg_name="image", ctx_name="image_command_customizer") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"], "keypair": {}, "allow_ssh": None}, @@ -398,7 +399,8 @@ EOF @validation.add("number", param_name="port", minval=1, maxval=65535, nullable=True, integer_only=True) @validation.add("external_network_exists", param_name="floating_network") -@validation.required_services(consts.Service.NOVA, consts.Service.CINDER) +@validation.add("required_services", services=[consts.Service.NOVA, + consts.Service.CINDER]) @validation.add("required_platform", platform="openstack", users=True) @scenario.configure(context={"cleanup": ["nova", "cinder"], "keypair": {}, "allow_ssh": None}, diff --git a/rally/plugins/openstack/scenarios/watcher/basic.py b/rally/plugins/openstack/scenarios/watcher/basic.py index fbea085f..b7932805 100644 --- a/rally/plugins/openstack/scenarios/watcher/basic.py +++ b/rally/plugins/openstack/scenarios/watcher/basic.py @@ -23,7 +23,8 @@ from rally.task import validation @types.convert(strategy={"type": "watcher_strategy"}, goal={"type": "watcher_goal"}) -@validation.required_services(consts.Service.WATCHER) +@validation.add("required_services", + services=[consts.Service.WATCHER]) @validation.add("required_platform", platform="openstack", admin=True) @scenario.configure(context={"admin_cleanup": ["watcher"]}, name="Watcher.create_audit_template_and_delete") @@ -44,7 +45,8 @@ class CreateAuditTemplateAndDelete(utils.WatcherScenario): self._delete_audit_template(audit_template.uuid) -@validation.required_services(consts.Service.WATCHER) +@validation.add("required_services", + services=[consts.Service.WATCHER]) @scenario.configure(name="Watcher.list_audit_templates") class ListAuditTemplates(utils.WatcherScenario): @@ -78,7 +80,8 @@ class ListAuditTemplates(utils.WatcherScenario): sort_dir=sort_dir, detail=detail) -@validation.required_services(consts.Service.WATCHER) +@validation.add("required_services", + services=[consts.Service.WATCHER]) @validation.required_contexts("audit_templates") @scenario.configure(context={"admin_cleanup": ["watcher"]}, name="Watcher.create_audit_and_delete") diff --git a/rally/plugins/openstack/validators.py b/rally/plugins/openstack/validators.py index fb6fcb64..94b3ed0e 100644 --- a/rally/plugins/openstack/validators.py +++ b/rally/plugins/openstack/validators.py @@ -21,6 +21,7 @@ from rally.task import types from rally.common import logging from rally.common import validation +from rally import consts from rally import exceptions from rally.plugins.openstack.context.nova import flavors as flavors_ctx from rally.plugins.openstack import types as openstack_types @@ -341,3 +342,52 @@ class RequiredClientsValidator(validation.Validator): result = self._check_component(clients) if result: return self.fail(result.msg) + + +@validation.add("required_platform", platform="openstack", admin=True) +@validation.configure(name="required_services", namespace="openstack") +class RequiredServicesValidator(validation.Validator): + + def __init__(self, services, *args): + """Validator checks if specified OpenStack services are available. + + :param services: list with names of required services + """ + + super(RequiredServicesValidator, self).__init__() + if isinstance(services, (list, tuple)): + # services argument is a list, so it is a new way of validators + # usage, args in this case should not be provided + self.services = services + if args: + LOG.warning("Positional argument is not what " + "'required_services' decorator expects. " + "Use `services` argument instead") + else: + # it is old way validator + self.services = [services] + self.services.extend(args) + + def validate(self, config, credentials, plugin_cls, plugin_cfg): + + clients = credentials["openstack"]["admin"].clients() + available_services = list(clients.services().values()) + if consts.Service.NOVA_NET in self.services: + LOG.warning("We are sorry, but Nova-network was deprecated for " + "a long time and latest novaclient doesn't support " + "it, so we too.") + + for service in self.services: + # NOTE(andreykurilin): validator should ignore services configured + # via context(a proper validation should be in context) + service_config = config.get("context", {}).get( + "api_versions", {}).get(service, {}) + + if (service not in available_services and + not ("service_type" in service_config or + "service_name" in service_config)): + return self.fail( + ("'{0}' service is not available. Hint: If '{0}' " + "service has non-default service_type, try to" + " setup it via 'api_versions'" + " context.").format(service)) diff --git a/tests/unit/plugins/openstack/test_validators.py b/tests/unit/plugins/openstack/test_validators.py index 3ef65bca..5e4ad560 100644 --- a/tests/unit/plugins/openstack/test_validators.py +++ b/tests/unit/plugins/openstack/test_validators.py @@ -19,6 +19,8 @@ import mock from glanceclient import exc as glance_exc from novaclient import exceptions as nova_exc + +from rally import consts from rally import exceptions from rally.plugins.openstack import validators from tests.unit import test @@ -40,7 +42,8 @@ config = dict(args={"image": {"id": "fake_id", "name": "test"}, "foo_image": {"id": "fake_image_id"} }, - context={"images": {"image_name": "foo_image"}} + context={"images": {"image_name": "foo_image"}, + "api_versions": mock.MagicMock()} ) @@ -507,3 +510,77 @@ class RequiredClientsValidatorTestCase(test.TestCase): self.assertTrue(result) self.assertEqual("Client for keystone is not installed. To install it " "run `pip install python-keystoneclient`", result.msg) + + +class RequiredServicesValidatorTestCase(test.TestCase): + + def setUp(self): + super(RequiredServicesValidatorTestCase, self).setUp() + self.validator = validators.RequiredServicesValidator([ + consts.Service.KEYSTONE, + consts.Service.NOVA, + consts.Service.NOVA_NET]) + self.config = config + self.credentials = credentials + + def test_validator(self): + + self.config["context"]["api_versions"].get = mock.Mock( + return_value={consts.Service.KEYSTONE: "service_type"}) + + clients = self.credentials["openstack"]["admin"].clients() + + clients.services().values.return_value = [ + consts.Service.KEYSTONE, consts.Service.NOVA, + consts.Service.NOVA_NET] + fake_service = mock.Mock(binary="nova-network", status="enabled") + clients.nova.services.list.return_value = [fake_service] + result = self.validator.validate(self.config, self.credentials, + None, None) + self.assertIsNone(result) + + fake_service = mock.Mock(binary="keystone", status="enabled") + clients.nova.services.list.return_value = [fake_service] + result = self.validator.validate(self.config, self.credentials, + None, None) + self.assertIsNone(result) + + fake_service = mock.Mock(binary="nova-network", status="disabled") + clients.nova.services.list.return_value = [fake_service] + result = self.validator.validate(self.config, self.credentials, + None, None) + self.assertIsNone(result) + + validator = validators.RequiredServicesValidator([ + consts.Service.NOVA]) + clients.services().values.return_value = [ + consts.Service.KEYSTONE] + + result = validator.validate(self.config, self.credentials, None, None) + self.assertTrue(result) + expected_msg = ("'{0}' service is not available. Hint: If '{0}'" + " service has non-default service_type, try to setup" + " it via 'api_versions' context.").format( + consts.Service.NOVA) + self.assertEqual(expected_msg, result.msg) + + def test_validator_wrong_service(self): + + self.config["context"]["api_versions"].get = mock.Mock( + return_value={consts.Service.KEYSTONE: "service_type", + consts.Service.NOVA: "service_name"}) + + clients = self.credentials["openstack"]["admin"].clients() + clients.services().values.return_value = [ + consts.Service.KEYSTONE, consts.Service.NOVA] + + validator = validators.RequiredServicesValidator([ + consts.Service.KEYSTONE, + consts.Service.NOVA, "lol"]) + + result = validator.validate({}, self.credentials, None, None) + self.assertTrue(result) + expected_msg = ("'{0}' service is not available. Hint: If '{0}'" + " service has non-default service_type, try to setup" + " it via 'api_versions' context.").format("lol") + self.assertEqual(expected_msg, result.msg)