summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-06-14 07:26:58 +0000
committerGerrit Code Review <review@openstack.org>2016-06-14 07:26:58 +0000
commit5b36898b2b9777cb1d343834347429996d1bf984 (patch)
tree54d063580ec6bba9d571b86d905dde31b0e71f5d /openstackclient
parent2c92b60f457a16c315b6286592e9fee534bd4b3d (diff)
parent8c7e34d65ca6217eee54389fcd40554a8cb454e6 (diff)
downloadpython-openstackclient-5b36898b2b9777cb1d343834347429996d1bf984.tar.gz
Merge "Fix image delete multiple arguments error"
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/image/v2/image.py24
-rw-r--r--openstackclient/tests/image/v2/test_image.py31
2 files changed, 50 insertions, 5 deletions
diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py
index 62f7bee8..d20fdba6 100644
--- a/openstackclient/image/v2/image.py
+++ b/openstackclient/image/v2/image.py
@@ -372,13 +372,27 @@ class DeleteImage(command.Command):
return parser
def take_action(self, parsed_args):
+
+ del_result = 0
image_client = self.app.client_manager.image
for image in parsed_args.images:
- image_obj = utils.find_resource(
- image_client.images,
- image,
- )
- image_client.images.delete(image_obj.id)
+ try:
+ image_obj = utils.find_resource(
+ image_client.images,
+ image,
+ )
+ image_client.images.delete(image_obj.id)
+ except Exception as e:
+ del_result += 1
+ self.app.log.error(_("Failed to delete image with "
+ "name or ID '%(image)s': %(e)s")
+ % {'image': image, 'e': e})
+
+ total = len(parsed_args.images)
+ if (del_result > 0):
+ msg = (_("Failed to delete %(dresult)s of %(total)s images.")
+ % {'dresult': del_result, 'total': total})
+ raise exceptions.CommandError(msg)
class ListImage(command.Lister):
diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py
index 92e0660f..96e8734f 100644
--- a/openstackclient/tests/image/v2/test_image.py
+++ b/openstackclient/tests/image/v2/test_image.py
@@ -474,6 +474,37 @@ class TestImageDelete(TestImage):
self.images_mock.delete.assert_has_calls(calls)
self.assertIsNone(result)
+ def test_image_delete_multi_images_exception(self):
+
+ images = image_fakes.FakeImage.create_images(count=2)
+ arglist = [
+ images[0].id,
+ images[1].id,
+ 'x-y-x',
+ ]
+ verifylist = [
+ ('images', arglist)
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ # Fake exception in utils.find_resource()
+ # In image v2, we use utils.find_resource() to find a network.
+ # It calls get() several times, but find() only one time. So we
+ # choose to fake get() always raise exception, then pass through.
+ # And fake find() to find the real network or not.
+ ret_find = [
+ images[0],
+ images[1],
+ exceptions.NotFound('404'),
+ ]
+
+ self.images_mock.get = Exception()
+ self.images_mock.find.side_effect = ret_find
+ self.assertRaises(exceptions.CommandError, self.cmd.take_action,
+ parsed_args)
+ calls = [mock.call(i.id) for i in images]
+ self.images_mock.delete.assert_has_calls(calls)
+
class TestImageList(TestImage):