summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHuanxuan Ao <huanxuan.ao@easystack.cn>2016-08-15 19:03:50 +0800
committerHuanxuan Ao <huanxuan.ao@easystack.cn>2016-09-11 11:41:05 +0800
commit10e665a148efec0cf75bd5dd07decf23a36a52e0 (patch)
tree595d092e5e03ce2ebaeb5973c0bdffba38a76920
parent676a0e9696ba7550132e4501bdbf3160608faed6 (diff)
downloadpython-openstackclient-10e665a148efec0cf75bd5dd07decf23a36a52e0.tar.gz
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
-rw-r--r--openstackclient/tests/unit/volume/v2/test_snapshot.py49
-rw-r--r--openstackclient/volume/v1/snapshot.py27
-rw-r--r--openstackclient/volume/v2/snapshot.py35
3 files changed, 100 insertions, 11 deletions
diff --git a/openstackclient/tests/unit/volume/v2/test_snapshot.py b/openstackclient/tests/unit/volume/v2/test_snapshot.py
index 333d8d72..d355662d 100644
--- a/openstackclient/tests/unit/volume/v2/test_snapshot.py
+++ b/openstackclient/tests/unit/volume/v2/test_snapshot.py
@@ -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):
diff --git a/openstackclient/volume/v1/snapshot.py b/openstackclient/volume/v1/snapshot.py
index bb3a1fc3..f8fa7c95 100644
--- a/openstackclient/volume/v1/snapshot.py
+++ b/openstackclient/volume/v1/snapshot.py
@@ -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
-
- snapshot.update(**kwargs)
+ 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
+
+ if result > 0:
+ raise exceptions.CommandError(_("One or more of the "
+ "set operations failed"))
class ShowSnapshot(command.ShowOne):
diff --git a/openstackclient/volume/v2/snapshot.py b/openstackclient/volume/v2/snapshot.py
index 8304a5eb..0d826551 100644
--- a/openstackclient/volume/v2/snapshot.py
+++ b/openstackclient/volume/v2/snapshot.py
@@ -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):