From b1732e0b5e729145d4777ca66669f6b379b025d9 Mon Sep 17 00:00:00 2001 From: yuriy_n Date: Sun, 26 Jul 2015 18:02:39 +0300 Subject: [PATCH] Add Cinder create_and_list_volume_backups scenario Implement create and list volume backups scenario for Cinder. This scenario covers cinder "backup-create" and "backup-list". Change-Id: Ia8a8ee0a6e5b85ec3151301054d4528bd7daa0f4 --- rally-jobs/cinder.yaml | 38 +++++++++++++++++++ rally-jobs/rally-mos_neutron.yaml | 20 +++++++++- .../openstack/scenarios/cinder/utils.py | 9 +++++ .../openstack/scenarios/cinder/volumes.py | 29 ++++++++++++++ .../create-and-list-volume-backups.json | 23 +++++++++++ .../create-and-list-volume-backups.yaml | 17 +++++++++ .../openstack/scenarios/cinder/test_utils.py | 8 ++++ .../scenarios/cinder/test_volumes.py | 34 ++++++++++++++++- 8 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 samples/tasks/scenarios/cinder/create-and-list-volume-backups.json create mode 100644 samples/tasks/scenarios/cinder/create-and-list-volume-backups.yaml diff --git a/rally-jobs/cinder.yaml b/rally-jobs/cinder.yaml index a789c95e45..9bc5d739f8 100644 --- a/rally-jobs/cinder.yaml +++ b/rally-jobs/cinder.yaml @@ -410,3 +410,41 @@ sla: failure_rate: max: 0 + + CinderVolumes.create_and_list_volume_backups: + - + args: + size: 1 + detailed: True + do_delete: True + runner: + type: "constant" + times: 2 + concurrency: 2 + context: + users: + tenants: 1 + users_per_tenant: 1 + roles: + - "Member" + sla: + failure_rate: + max: 0 + - + args: + size: 1 + detailed: True + do_delete: False + runner: + type: "constant" + times: 2 + concurrency: 2 + context: + users: + tenants: 1 + users_per_tenant: 1 + roles: + - "Member" + sla: + failure_rate: + max: 0 diff --git a/rally-jobs/rally-mos_neutron.yaml b/rally-jobs/rally-mos_neutron.yaml index 375bf21b90..8d9a9dfa07 100644 --- a/rally-jobs/rally-mos_neutron.yaml +++ b/rally-jobs/rally-mos_neutron.yaml @@ -307,4 +307,22 @@ users_per_tenant: 1 sla: failure_rate: - max: 0 \ No newline at end of file + max: 0 + + CinderVolumes.create_and_list_volume_backups: + - + args: + size: 1 + detailed: True + do_delete: True + runner: + type: "constant" + times: 2 + concurrency: 1 + context: + users: + tenants: 1 + users_per_tenant: 1 + sla: + failure_rate: + max: 0 diff --git a/rally/plugins/openstack/scenarios/cinder/utils.py b/rally/plugins/openstack/scenarios/cinder/utils.py index c7a548b215..4f33fddb29 100644 --- a/rally/plugins/openstack/scenarios/cinder/utils.py +++ b/rally/plugins/openstack/scenarios/cinder/utils.py @@ -323,6 +323,15 @@ class CinderScenario(scenario.OpenStackScenario): check_interval=CONF.benchmark.cinder_volume_create_poll_interval ) + @base.atomic_action_timer("cinder.list_backups") + def _list_backups(self, detailed=True): + """Return user volume backups list. + + :param detailed: True if detailed information about backup + should be listed + """ + return self.clients("cinder").backups.list(detailed) + def get_random_server(self): server_id = random.choice(self.context["tenant"]["servers"]) return self.clients("nova").servers.get(server_id) diff --git a/rally/plugins/openstack/scenarios/cinder/volumes.py b/rally/plugins/openstack/scenarios/cinder/volumes.py index 45bd17da2d..1894744f38 100644 --- a/rally/plugins/openstack/scenarios/cinder/volumes.py +++ b/rally/plugins/openstack/scenarios/cinder/volumes.py @@ -479,3 +479,32 @@ class CinderVolumes(utils.CinderScenario, if do_delete: self._delete_volume(volume) self._delete_backup(backup) + + @validation.required_cinder_services("cinder-backup") + @validation.required_services(consts.Service.CINDER) + @validation.required_openstack(users=True) + @base.scenario(context={"cleanup": ["cinder"]}) + def create_and_list_volume_backups(self, size, detailed=True, + do_delete=True, + create_volume_kwargs=None, + create_backup_kwargs=None): + """Create and then list a volume backup. + + + :param size: volume size in GB + :param detailed: True if detailed information about backup + should be listed + :param do_delete: if True, a volume backup will be deleted + :param create_volume_kwargs: optional args to create a volume + :param create_backup_kwargs: optional args to create a volume backup + """ + create_volume_kwargs = create_volume_kwargs or {} + create_backup_kwargs = create_backup_kwargs or {} + + volume = self._create_volume(size, **create_volume_kwargs) + backup = self._create_backup(volume.id, **create_backup_kwargs) + self._list_backups(detailed) + + if do_delete: + self._delete_volume(volume) + self._delete_backup(backup) diff --git a/samples/tasks/scenarios/cinder/create-and-list-volume-backups.json b/samples/tasks/scenarios/cinder/create-and-list-volume-backups.json new file mode 100644 index 0000000000..1ca04bcae2 --- /dev/null +++ b/samples/tasks/scenarios/cinder/create-and-list-volume-backups.json @@ -0,0 +1,23 @@ +{ + "CinderVolumes.create_and_list_volume_backups": [ + { + "args": { + "size": 1, + "detailed": true, + "do_delete": true + }, + "runner": { + "type": "constant", + "times": 2, + "concurrency": 2 + }, + "context": { + "users": { + "tenants": 1, + "users_per_tenant": 1 + }, + "roles": ["Member"] + } + } + ] +} diff --git a/samples/tasks/scenarios/cinder/create-and-list-volume-backups.yaml b/samples/tasks/scenarios/cinder/create-and-list-volume-backups.yaml new file mode 100644 index 0000000000..293af8af3a --- /dev/null +++ b/samples/tasks/scenarios/cinder/create-and-list-volume-backups.yaml @@ -0,0 +1,17 @@ +--- + CinderVolumes.create_and_list_volume_backups: + - + args: + size: 1 + detailed: True + do_delete: True + runner: + type: "constant" + times: 2 + concurrency: 2 + context: + users: + tenants: 1 + users_per_tenant: 1 + roles: + - "Member" diff --git a/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py b/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py index 26f55b7d3e..1b3b3fb765 100644 --- a/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py +++ b/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py @@ -294,6 +294,14 @@ class CinderScenarioTestCase(test.ScenarioTestCase): self._test_atomic_action_timer(self.scenario.atomic_actions(), "cinder.restore_backup") + def test__list_backups(self): + return_backups_list = self.scenario._list_backups() + self.assertEqual( + self.clients("cinder").backups.list.return_value, + return_backups_list) + self._test_atomic_action_timer(self.scenario.atomic_actions(), + "cinder.list_backups") + def test__get_random_server(self): servers = [1, 2, 3] context = {"user": {"tenant_id": "fake"}, diff --git a/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py b/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py index d9e033477c..a106698476 100644 --- a/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py +++ b/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py @@ -408,15 +408,15 @@ class CinderServersTestCase(test.ScenarioTestCase): self.assertFalse(scenario._delete_volume.called) self.assertFalse(scenario._delete_backup.called) - def _get_scenario(self, fake_volume, fake_backup, fake_restore): + def _get_scenario(self, fake_volume, fake_backup, fake_restore=None): scenario = volumes.CinderVolumes() scenario._create_volume = mock.MagicMock(return_value=fake_volume) scenario._create_backup = mock.MagicMock(return_value=fake_backup) scenario._restore_backup = mock.MagicMock(return_value=fake_restore) + scenario._list_backups = mock.MagicMock() scenario._delete_volume = mock.MagicMock() scenario._delete_backup = mock.MagicMock() - return scenario def test_create_and_restore_volume_backup(self): @@ -448,3 +448,33 @@ class CinderServersTestCase(test.ScenarioTestCase): scenario._restore_backup.assert_called_once_with(fake_backup.id) self.assertFalse(scenario._delete_volume.called) self.assertFalse(scenario._delete_backup.called) + + def test_create_and_list_volume_backups(self): + fake_volume = mock.MagicMock() + fake_backup = mock.MagicMock() + scenario = self._get_scenario(fake_volume, fake_backup) + + volume_kwargs = {"some_var": "zaq"} + scenario.create_and_list_volume_backups( + 1, detailed=True, do_delete=True, + create_volume_kwargs=volume_kwargs) + scenario._create_volume.assert_called_once_with(1, **volume_kwargs) + scenario._create_backup.assert_called_once_with(fake_volume.id) + scenario._list_backups.assert_called_once_with(True) + scenario._delete_volume.assert_called_once_with(fake_volume) + scenario._delete_backup.assert_called_once_with(fake_backup) + + def test_create_and_list_volume_backups_no_delete(self): + fake_volume = mock.MagicMock() + fake_backup = mock.MagicMock() + scenario = self._get_scenario(fake_volume, fake_backup) + + volume_kwargs = {"some_var": "zaq"} + scenario.create_and_list_volume_backups( + 1, detailed=True, do_delete=False, + create_volume_kwargs=volume_kwargs) + scenario._create_volume.assert_called_once_with(1, **volume_kwargs) + scenario._create_backup.assert_called_once_with(fake_volume.id) + scenario._list_backups.assert_called_once_with(True) + self.assertFalse(scenario._delete_volume.called) + self.assertFalse(scenario._delete_backup.called)