diff --git a/rally-jobs/cinder.yaml b/rally-jobs/cinder.yaml index cf7ca1b751..68552f5baf 100755 --- a/rally-jobs/cinder.yaml +++ b/rally-jobs/cinder.yaml @@ -753,3 +753,19 @@ sla: failure_rate: max: 0 + + CinderVolumes.list_transfers: + - + args: + detailed: true + runner: + type: "constant" + times: 3 + concurrency: 2 + context: + users: + tenants: 3 + users_per_tenant: 2 + sla: + failure_rate: + max: 0 diff --git a/rally/plugins/openstack/scenarios/cinder/utils.py b/rally/plugins/openstack/scenarios/cinder/utils.py index 7a1f299123..740cb93696 100644 --- a/rally/plugins/openstack/scenarios/cinder/utils.py +++ b/rally/plugins/openstack/scenarios/cinder/utils.py @@ -380,3 +380,14 @@ class CinderScenario(scenario.OpenStackScenario): def get_random_server(self): server_id = random.choice(self.context["tenant"]["servers"]) return self.clients("nova").servers.get(server_id) + + @atomic.action_timer("cinder.list_transfers") + def _list_transfers(self, detailed=True, search_opts=None): + """Get a list of all volume transfers. + + :param detailed: If True, detailed information about transfer + should be listed + :param search_opts: Search options to filter out volume transfers + :returns: list of :class:`VolumeTransfer` + """ + return self.clients("cinder").transfers.list(detailed, search_opts) diff --git a/rally/plugins/openstack/scenarios/cinder/volumes.py b/rally/plugins/openstack/scenarios/cinder/volumes.py index ed8ac3d506..57467eea6f 100755 --- a/rally/plugins/openstack/scenarios/cinder/volumes.py +++ b/rally/plugins/openstack/scenarios/cinder/volumes.py @@ -107,6 +107,25 @@ class ListTypes(cinder_utils.CinderScenario): self._list_types(search_opts, is_public) +@validation.required_services(consts.Service.CINDER) +@validation.required_openstack(users=True) +@scenario.configure(name="CinderVolumes.list_transfers") +class ListTransfers(cinder_utils.CinderScenario): + + def run(self, detailed=True, search_opts=None): + """List all transfers. + + This simple scenario tests the "cinder transfer-list" command by + listing all the volume transfers. + + :param detailed: If True, detailed information about volume transfer + should be listed + :param search_opts: Search options to filter out volume transfers. + """ + + self._list_transfers(detailed, search_opts) + + @types.convert(image={"type": "glance_image"}) @validation.image_exists("image", nullable=True) @validation.required_services(consts.Service.CINDER) diff --git a/samples/tasks/scenarios/cinder/list-transfers.json b/samples/tasks/scenarios/cinder/list-transfers.json new file mode 100644 index 0000000000..534fb2c552 --- /dev/null +++ b/samples/tasks/scenarios/cinder/list-transfers.json @@ -0,0 +1,25 @@ +{ + "CinderVolumes.list_transfers": [ + { + "args": { + "detailed": true + }, + "runner": { + "type": "constant", + "times": 3, + "concurrency": 2 + }, + "context": { + "users": { + "tenants": 3, + "users_per_tenant": 2 + } + }, + "sla": { + "failure_rate": { + "max": 0 + } + } + } + ] +} diff --git a/samples/tasks/scenarios/cinder/list-transfers.yaml b/samples/tasks/scenarios/cinder/list-transfers.yaml new file mode 100644 index 0000000000..566906ec9a --- /dev/null +++ b/samples/tasks/scenarios/cinder/list-transfers.yaml @@ -0,0 +1,16 @@ +--- + CinderVolumes.list_transfers: + - + args: + detailed: true + runner: + type: "constant" + times: 3 + concurrency: 2 + context: + users: + tenants: 3 + users_per_tenant: 2 + sla: + failure_rate: + max: 0 diff --git a/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py b/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py index 19fdc72360..76e90fef38 100644 --- a/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py +++ b/tests/unit/plugins/openstack/scenarios/cinder/test_utils.py @@ -60,6 +60,14 @@ class CinderScenarioTestCase(test.ScenarioTestCase): self._test_atomic_action_timer(self.scenario.atomic_actions(), "cinder.list_snapshots") + def test__list_transfers(self): + return_transfers_list = self.scenario._list_transfers() + self.assertEqual( + self.clients("cinder").transfers.list.return_value, + return_transfers_list) + self._test_atomic_action_timer(self.scenario.atomic_actions(), + "cinder.list_transfers") + def test__set_metadata(self): volume = fakes.FakeVolume() diff --git a/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py b/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py index 16e07b6d54..92accb3237 100755 --- a/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py +++ b/tests/unit/plugins/openstack/scenarios/cinder/test_volumes.py @@ -60,6 +60,12 @@ class CinderServersTestCase(test.ScenarioTestCase): scenario.run(None, None) scenario._list_types.assert_called_once_with(None, None) + def test_list_transfers(self): + scenario = volumes.ListTransfers(self.context) + scenario._list_transfers = mock.MagicMock() + scenario.run(True, None) + scenario._list_transfers.assert_called_once_with(True, None) + def test_create_and_update_volume(self): volume_update_args = {"dispaly_name": "_updated"} scenario = volumes.CreateAndUpdateVolume(self.context)