diff --git a/rally-jobs/cinder.yaml b/rally-jobs/cinder.yaml index dd21048f..95abb0f3 100644 --- a/rally-jobs/cinder.yaml +++ b/rally-jobs/cinder.yaml @@ -494,6 +494,23 @@ sla: failure_rate: max: 0 + - + args: + size: 1 + volume_type: test + runner: + type: "constant" + times: 1 + concurrency: 1 + context: + users: + tenants: 1 + users_per_tenant: 1 + volume_types: + - test + sla: + failure_rate: + max: 0 CinderVolumes.create_volume_backup: - diff --git a/rally/plugins/openstack/context/cinder/volume_types.py b/rally/plugins/openstack/context/cinder/volume_types.py new file mode 100644 index 00000000..72894e32 --- /dev/null +++ b/rally/plugins/openstack/context/cinder/volume_types.py @@ -0,0 +1,56 @@ +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from rally.common.i18n import _ +from rally.common import logging +from rally import consts +from rally import osclients +from rally.task import context + + +LOG = logging.getLogger(__name__) + + +@context.configure(name="volume_types", order=410) +class VolumeTypeGenerator(context.Context): + """Context class for adding volumes types for benchmarks.""" + + CONFIG_SCHEMA = { + "type": "array", + "$schema": consts.JSON_SCHEMA, + "additionalProperties": False + } + + @logging.log_task_wrapper(LOG.info, _("Enter context: `volume_types`")) + def setup(self): + admin_clients = osclients.Clients( + self.context.get("admin", {}).get("credential"), + api_info=self.context["config"].get("api_versions")) + cinder = admin_clients.cinder() + self.context["volume_types"] = [] + for vtype_name in self.config: + LOG.debug("Creating Cinder volume type %s" % vtype_name) + vtype = cinder.volume_types.create(vtype_name) + self.context["volume_types"].append({"id": vtype.id, + "name": vtype_name}) + + @logging.log_task_wrapper(LOG.info, _("Exit context: `volume_types`")) + def cleanup(self): + admin_clients = osclients.Clients( + self.context.get("admin", {}).get("credential"), + api_info=self.context["config"].get("api_versions")) + cinder = admin_clients.cinder() + for vtype in self.context["volume_types"]: + LOG.debug("Deleting Cinder volume type %s" % vtype["name"]) + cinder.volume_types.delete(vtype["id"]) diff --git a/tests/unit/plugins/openstack/context/cinder/test_volume_types.py b/tests/unit/plugins/openstack/context/cinder/test_volume_types.py new file mode 100644 index 00000000..f1baa1a2 --- /dev/null +++ b/tests/unit/plugins/openstack/context/cinder/test_volume_types.py @@ -0,0 +1,59 @@ +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock + +from rally.plugins.openstack.context.cinder import volume_types +from tests.unit import test + +CTX = "rally.plugins.openstack.context" + + +class VolumeTypeGeneratorTestCase(test.ContextTestCase): + def setUp(self): + super(VolumeTypeGeneratorTestCase, self).setUp() + self.context.update({"admin": {"credential": "admin_creds"}}) + + def test_setup(self): + self.context.update({"config": {"volume_types": ["foo", "bar"]}}) + create = self.clients("cinder", + admin=True).volume_types.create + create.side_effect = (mock.Mock(id="foo-id"), + mock.Mock(id="bar-id")) + + vtype_ctx = volume_types.VolumeTypeGenerator(self.context) + vtype_ctx.setup() + + create.assert_has_calls( + [mock.call("foo"), mock.call("bar")]) + self.assertEqual(self.context["volume_types"], + [{"id": "foo-id", "name": "foo"}, + {"id": "bar-id", "name": "bar"}]) + + def test_cleanup(self): + self.context.update({ + "config": {"volume_types": ["foo", "bar"]}, + "volume_types": [ + {"id": "foo_id", "name": "foo"}, + {"id": "bar_id", "name": "bar"}], + "api_versions": { + "cinder": {"version": 2, "service_type": "volumev2"}}}) + + vtype_ctx = volume_types.VolumeTypeGenerator(self.context) + vtype_ctx.cleanup() + + delete = self.clients("cinder", + admin=True).volume_types.delete + delete.assert_has_calls( + [mock.call("foo_id"), mock.call("bar_id")])