diff --git a/openstackclient/tests/volume/v2/test_volume.py b/openstackclient/tests/volume/v2/test_volume.py index c2740cab77..1bb5c19237 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 aee18e4f26..bd201e0041 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):