Skip to content

Commit 5b36898

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Fix image delete multiple arguments error"
2 parents 2c92b60 + 8c7e34d commit 5b36898

3 files changed

Lines changed: 52 additions & 10 deletions

File tree

doc/source/command-errors.rst

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,6 @@ multiple ``delete_network()`` calls.
197197
198198
if ret > 0:
199199
total = len(parsed_args.network)
200-
msg = _("Failed to delete %(ret)s of %(total)s networks.") %
201-
{
202-
"ret": ret,
203-
"total": total,
204-
}
200+
msg = (_("Failed to delete %(ret)s of %(total)s networks.")
201+
% {"ret": ret, "total": total})
205202
raise exceptions.CommandError(msg)

openstackclient/image/v2/image.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -372,13 +372,27 @@ def get_parser(self, prog_name):
372372
return parser
373373

374374
def take_action(self, parsed_args):
375+
376+
del_result = 0
375377
image_client = self.app.client_manager.image
376378
for image in parsed_args.images:
377-
image_obj = utils.find_resource(
378-
image_client.images,
379-
image,
380-
)
381-
image_client.images.delete(image_obj.id)
379+
try:
380+
image_obj = utils.find_resource(
381+
image_client.images,
382+
image,
383+
)
384+
image_client.images.delete(image_obj.id)
385+
except Exception as e:
386+
del_result += 1
387+
self.app.log.error(_("Failed to delete image with "
388+
"name or ID '%(image)s': %(e)s")
389+
% {'image': image, 'e': e})
390+
391+
total = len(parsed_args.images)
392+
if (del_result > 0):
393+
msg = (_("Failed to delete %(dresult)s of %(total)s images.")
394+
% {'dresult': del_result, 'total': total})
395+
raise exceptions.CommandError(msg)
382396

383397

384398
class ListImage(command.Lister):

openstackclient/tests/image/v2/test_image.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,37 @@ def test_image_delete_multi_images(self):
474474
self.images_mock.delete.assert_has_calls(calls)
475475
self.assertIsNone(result)
476476

477+
def test_image_delete_multi_images_exception(self):
478+
479+
images = image_fakes.FakeImage.create_images(count=2)
480+
arglist = [
481+
images[0].id,
482+
images[1].id,
483+
'x-y-x',
484+
]
485+
verifylist = [
486+
('images', arglist)
487+
]
488+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
489+
490+
# Fake exception in utils.find_resource()
491+
# In image v2, we use utils.find_resource() to find a network.
492+
# It calls get() several times, but find() only one time. So we
493+
# choose to fake get() always raise exception, then pass through.
494+
# And fake find() to find the real network or not.
495+
ret_find = [
496+
images[0],
497+
images[1],
498+
exceptions.NotFound('404'),
499+
]
500+
501+
self.images_mock.get = Exception()
502+
self.images_mock.find.side_effect = ret_find
503+
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
504+
parsed_args)
505+
calls = [mock.call(i.id) for i in images]
506+
self.images_mock.delete.assert_has_calls(calls)
507+
477508

478509
class TestImageList(TestImage):
479510

0 commit comments

Comments
 (0)