summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glance/api/v2/images.py38
-rw-r--r--glance/tests/unit/v2/test_images_resource.py32
2 files changed, 50 insertions, 20 deletions
diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py
index f4a57e0f7..22b4df8c9 100644
--- a/glance/api/v2/images.py
+++ b/glance/api/v2/images.py
@@ -335,27 +335,25 @@ class ImagesController(object):
image_repo = self.gateway.get_repo(req.context)
try:
image = image_repo.get(image_id)
-
- if image.status == 'uploading':
- file_path = str(
- CONF.node_staging_uri + '/' + image.image_id)[7:]
- if os.path.exists(file_path):
- try:
- LOG.debug(
- "After upload to the backend, deleting staged "
- "image data from %(fn)s", {'fn': file_path})
- os.unlink(file_path)
- except OSError as e:
- LOG.error(
- "After upload to backend, deletion of staged "
- "image data from %(fn)s has failed because "
- "[Errno %(en)d]", {'fn': file_path,
- 'en': e.errno})
- else:
- LOG.warning(_(
+ file_path = str(
+ CONF.node_staging_uri + '/' + image_id)[7:]
+ if os.path.exists(file_path):
+ try:
+ LOG.debug(
+ "After upload to the backend, deleting staged "
+ "image data from %(fn)s", {'fn': file_path})
+ os.unlink(file_path)
+ except OSError as e:
+ LOG.error(
"After upload to backend, deletion of staged "
- "image data has failed because "
- "it cannot be found at %(fn)s"), {'fn': file_path})
+ "image data from %(fn)s has failed because "
+ "[Errno %(en)d]", {'fn': file_path,
+ 'en': e.errno})
+ else:
+ LOG.warning(_(
+ "After upload to backend, deletion of staged "
+ "image data has failed because "
+ "it cannot be found at %(fn)s"), {'fn': file_path})
image.delete()
image_repo.remove(image)
diff --git a/glance/tests/unit/v2/test_images_resource.py b/glance/tests/unit/v2/test_images_resource.py
index a82e86143..c0df32bcc 100644
--- a/glance/tests/unit/v2/test_images_resource.py
+++ b/glance/tests/unit/v2/test_images_resource.py
@@ -2493,6 +2493,38 @@ class TestImagesController(base.IsolatedUnitTest):
self.assertEqual('deleted', deleted_img['status'])
self.assertNotIn('%s/%s' % (BASE_URI, UUID1), self.store.data)
+ def test_verify_staging_data_deleted_on_image_delete(self):
+ self.config(enabled_backends={'fake-store': 'file'})
+ self.config(node_staging_uri='file:///tmp/staging')
+ image_id = str(uuid.uuid4())
+ self.images = [
+ _db_fixture(image_id, owner=TENANT1,
+ name='1',
+ disk_format='raw',
+ container_format='bare',
+ status='importing',
+ checksum=None,
+ os_hash_algo=None,
+ os_hash_value=None),
+ ]
+ self.db.image_create(None, self.images[0])
+ request = unit_test_utils.get_fake_request()
+ try:
+ with mock.patch.object(os.path, 'exists') as mock_exists:
+ mock_exists.return_value = True
+ with mock.patch.object(os, "unlink") as mock_unlik:
+ self.controller.delete(request, image_id)
+
+ self.assertEqual(1, mock_exists.call_count)
+ self.assertEqual(1, mock_unlik.call_count)
+ except Exception as e:
+ self.fail("Delete raised exception: %s" % e)
+
+ deleted_img = self.db.image_get(request.context, image_id,
+ force_show_deleted=True)
+ self.assertTrue(deleted_img['deleted'])
+ self.assertEqual('deleted', deleted_img['status'])
+
def test_delete_with_tags(self):
request = unit_test_utils.get_fake_request()
changes = [