diff options
| author | Huanxuan Ao <huanxuan.ao@easystack.cn> | 2016-08-05 18:54:29 +0800 |
|---|---|---|
| committer | Huanxuan Ao <huanxuan.ao@easystack.cn> | 2016-08-06 09:15:21 +0800 |
| commit | 3202fefc654bc32fd7e02b12b76a4ea55f7f53c0 (patch) | |
| tree | 1b67496e0355b3b844f913f306195092f3e20f13 /openstackclient | |
| parent | 0472b9ec6d461d8731f106ce62a6b44d50a5c310 (diff) | |
| download | python-openstackclient-3202fefc654bc32fd7e02b12b76a4ea55f7f53c0.tar.gz | |
Support multi REST API calls error handling for "volume set" command
Support the error handling follow the rule in
doc/source/command-errors.rst
Also add a unit test for testing the error handling
Change-Id: I98064f4b8c1dc17eb3874f7b25c827a568463c0f
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/tests/volume/v2/test_volume.py | 21 | ||||
| -rw-r--r-- | openstackclient/volume/v2/volume.py | 55 |
2 files changed, 62 insertions, 14 deletions
diff --git a/openstackclient/tests/volume/v2/test_volume.py b/openstackclient/tests/volume/v2/test_volume.py index c2740cab..1bb5c192 100644 --- a/openstackclient/tests/volume/v2/test_volume.py +++ b/openstackclient/tests/volume/v2/test_volume.py @@ -860,6 +860,27 @@ class TestVolumeSet(TestVolume): self.new_volume.id, 'error') self.assertIsNone(result) + def test_volume_set_state_failed(self): + self.volumes_mock.reset_state.side_effect = exceptions.CommandError() + arglist = [ + '--state', 'error', + self.new_volume.id + ] + verifylist = [ + ('state', 'error'), + ('volume', self.new_volume.id) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + try: + self.cmd.take_action(parsed_args) + self.fail('CommandError should be raised.') + except exceptions.CommandError as e: + self.assertEqual('One or more of the set operations failed', + str(e)) + self.volumes_mock.reset_state.assert_called_with( + self.new_volume.id, 'error') + class TestVolumeShow(TestVolume): diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index aee18e4f..bd201e00 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -394,24 +394,42 @@ class SetVolume(command.Command): volume_client = self.app.client_manager.volume volume = utils.find_resource(volume_client.volumes, parsed_args.volume) + result = 0 if parsed_args.size: - if volume.status != 'available': - LOG.error(_("Volume is in %s state, it must be available " - "before size can be extended"), volume.status) - return - if parsed_args.size <= volume.size: - LOG.error(_("New size must be greater than %s GB"), - volume.size) - return - volume_client.volumes.extend(volume.id, parsed_args.size) + try: + if volume.status != 'available': + msg = (_("Volume is in %s state, it must be available " + "before size can be extended"), volume.status) + raise exceptions.CommandError(msg) + if parsed_args.size <= volume.size: + msg = _("New size must be greater than %s GB"), volume.size + raise exceptions.CommandError(msg) + volume_client.volumes.extend(volume.id, parsed_args.size) + except Exception as e: + LOG.error(_("Failed to set volume size: %s"), e) + result += 1 if parsed_args.property: - volume_client.volumes.set_metadata(volume.id, parsed_args.property) + try: + volume_client.volumes.set_metadata( + volume.id, parsed_args.property) + except Exception as e: + LOG.error(_("Failed to set volume property: %s"), e) + result += 1 if parsed_args.image_property: - volume_client.volumes.set_image_metadata( - volume.id, parsed_args.image_property) + try: + volume_client.volumes.set_image_metadata( + volume.id, parsed_args.image_property) + except Exception as e: + LOG.error(_("Failed to set image property: %s"), e) + result += 1 if parsed_args.state: - volume_client.volumes.reset_state(volume.id, parsed_args.state) + try: + volume_client.volumes.reset_state( + volume.id, parsed_args.state) + except Exception as e: + LOG.error(_("Failed to set volume state: %s"), e) + result += 1 kwargs = {} if parsed_args.name: @@ -419,7 +437,16 @@ class SetVolume(command.Command): if parsed_args.description: kwargs['display_description'] = parsed_args.description if kwargs: - volume_client.volumes.update(volume.id, **kwargs) + try: + volume_client.volumes.update(volume.id, **kwargs) + except Exception as e: + LOG.error(_("Failed to update volume display name " + "or display description: %s"), e) + result += 1 + + if result > 0: + raise exceptions.CommandError(_("One or more of the " + "set operations failed")) class ShowVolume(command.ShowOne): |
