Error handling of multi REST API calls for "snapshot set" command

Support multi REST API calls error handling for
"snapshot set" command follow the rule in
doc/source/command-errors.rst. Also add a unit
test for testing the error handling

Change-Id: I0c6214271bc54a25b051c0a62438c3344c8b51d7
This commit is contained in:
Huanxuan Ao 2016-08-15 19:03:50 +08:00
parent 676a0e9696
commit 10e665a148
3 changed files with 99 additions and 10 deletions

View File

@ -376,6 +376,55 @@ class TestSnapshotSet(TestSnapshot):
self.snapshot.id, "error")
self.assertIsNone(result)
def test_volume_set_state_failed(self):
self.snapshots_mock.reset_state.side_effect = exceptions.CommandError()
arglist = [
'--state', 'error',
self.snapshot.id
]
verifylist = [
('state', 'error'),
('snapshot', self.snapshot.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.snapshots_mock.reset_state.assert_called_once_with(
self.snapshot.id, 'error')
def test_volume_set_name_and_state_failed(self):
self.snapshots_mock.reset_state.side_effect = exceptions.CommandError()
arglist = [
'--state', 'error',
"--name", "new_snapshot",
self.snapshot.id
]
verifylist = [
('state', 'error'),
("name", "new_snapshot"),
('snapshot', self.snapshot.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))
kwargs = {
"name": "new_snapshot",
}
self.snapshots_mock.update.assert_called_once_with(
self.snapshot.id, **kwargs)
self.snapshots_mock.reset_state.assert_called_once_with(
self.snapshot.id, 'error')
class TestSnapshotShow(TestSnapshot):

View File

@ -16,15 +16,20 @@
"""Volume v1 Snapshot action implementations"""
import copy
import logging
from osc_lib.cli import parseractions
from osc_lib.command import command
from osc_lib import exceptions
from osc_lib import utils
import six
from openstackclient.i18n import _
LOG = logging.getLogger(__name__)
class CreateSnapshot(command.ShowOne):
"""Create new snapshot"""
@ -199,17 +204,31 @@ class SetSnapshot(command.Command):
snapshot = utils.find_resource(volume_client.volume_snapshots,
parsed_args.snapshot)
result = 0
if parsed_args.property:
volume_client.volume_snapshots.set_metadata(snapshot.id,
parsed_args.property)
try:
volume_client.volume_snapshots.set_metadata(
snapshot.id, parsed_args.property)
except Exception as e:
LOG.error(_("Failed to set snapshot property: %s"), e)
result += 1
kwargs = {}
if parsed_args.name:
kwargs['display_name'] = parsed_args.name
if parsed_args.description:
kwargs['display_description'] = parsed_args.description
if kwargs:
try:
snapshot.update(**kwargs)
except Exception as e:
LOG.error(_("Failed to update snapshot display name "
"or display description: %s"), e)
result += 1
snapshot.update(**kwargs)
if result > 0:
raise exceptions.CommandError(_("One or more of the "
"set operations failed"))
class ShowSnapshot(command.ShowOne):

View File

@ -240,19 +240,40 @@ class SetSnapshot(command.Command):
snapshot = utils.find_resource(volume_client.volume_snapshots,
parsed_args.snapshot)
result = 0
if parsed_args.property:
try:
volume_client.volume_snapshots.set_metadata(
snapshot.id, parsed_args.property)
except Exception as e:
LOG.error(_("Failed to set snapshot property: %s"), e)
result += 1
if parsed_args.state:
try:
volume_client.volume_snapshots.reset_state(
snapshot.id, parsed_args.state)
except Exception as e:
LOG.error(_("Failed to set snapshot state: %s"), e)
result += 1
kwargs = {}
if parsed_args.name:
kwargs['name'] = parsed_args.name
if parsed_args.description:
kwargs['description'] = parsed_args.description
if kwargs:
try:
volume_client.volume_snapshots.update(
snapshot.id, **kwargs)
except Exception as e:
LOG.error(_("Failed to update snapshot name "
"or description: %s"), e)
result += 1
if parsed_args.property:
volume_client.volume_snapshots.set_metadata(snapshot.id,
parsed_args.property)
if parsed_args.state:
volume_client.volume_snapshots.reset_state(snapshot.id,
parsed_args.state)
volume_client.volume_snapshots.update(snapshot.id, **kwargs)
if result > 0:
raise exceptions.CommandError(_("One or more of the "
"set operations failed"))
class ShowSnapshot(command.ShowOne):