From def8cfdeef4e3d086ad045a063421a61468e3cb6 Mon Sep 17 00:00:00 2001 From: Niall Bunting Date: Wed, 9 Mar 2016 18:13:44 +0000 Subject: [PATCH] Copy the size of the tag set As the tags are being removed it can cause the removal of the current tag when running tests. Causing a RuntimeError to be thrown. This change makes a temporary list whilst the tags are being deleted. Co-Authored-By: Tom Cocozzello Change-Id: I3cac9060b87449503fba3995d10f8d4e074bffb8 Closes-Bug: 1555275 --- glance/db/simple/api.py | 2 +- glance/tests/unit/v2/test_images_resource.py | 26 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/glance/db/simple/api.py b/glance/db/simple/api.py index 51a2c302b6..4f4b203b52 100644 --- a/glance/db/simple/api.py +++ b/glance/db/simple/api.py @@ -784,7 +784,7 @@ def image_tag_get(context, image_id, value): @log_call def image_tag_set_all(context, image_id, values): global DATA - DATA['tags'][image_id] = values + DATA['tags'][image_id] = list(values) @log_call diff --git a/glance/tests/unit/v2/test_images_resource.py b/glance/tests/unit/v2/test_images_resource.py index 3aa9429022..419adc27a0 100644 --- a/glance/tests/unit/v2/test_images_resource.py +++ b/glance/tests/unit/v2/test_images_resource.py @@ -1909,6 +1909,32 @@ class TestImagesController(base.IsolatedUnitTest): self.assertEqual('deleted', deleted_img['status']) self.assertNotIn('%s/%s' % (BASE_URI, UUID1), self.store.data) + def test_delete_with_tags(self): + request = unit_test_utils.get_fake_request() + changes = [ + {'op': 'replace', 'path': ['tags'], + 'value': ['many', 'cool', 'new', 'tags']}, + ] + self.controller.update(request, UUID1, changes) + self.assertIn('%s/%s' % (BASE_URI, UUID1), self.store.data) + self.controller.delete(request, UUID1) + output_logs = self.notifier.get_logs() + + # Get `delete` event from logs + output_delete_logs = [output_log for output_log in output_logs + if output_log['event_type'] == 'image.delete'] + + self.assertEqual(1, len(output_delete_logs)) + output_log = output_delete_logs[0] + + self.assertEqual('INFO', output_log['notification_type']) + + deleted_img = self.db.image_get(request.context, UUID1, + force_show_deleted=True) + self.assertTrue(deleted_img['deleted']) + self.assertEqual('deleted', deleted_img['status']) + self.assertNotIn('%s/%s' % (BASE_URI, UUID1), self.store.data) + def test_delete_disabled_notification(self): self.config(disabled_notifications=["image.delete"]) request = unit_test_utils.get_fake_request()