Skip to content

Commit

Permalink
Image data remains in backend for deleted image
Browse files Browse the repository at this point in the history
Trying to delete image created using task api (import-from) image gets
deleted from the database, but image data remains in the backend. Import
task does not update the location of the image and it remains None even
image becomes active. Location entry is not added in the database in
image_locations table.

Added location information to the image before saving the image in
the database.

SecurityImpact

Change-Id: Ie389de6538a9b98dc51c7d781b81b3ab10b83842
Closes-Bug: #1420696
  • Loading branch information
abhishekkekane authored and flaper87 committed Feb 17, 2015
1 parent cd60a24 commit 78b5b0a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 22 deletions.
42 changes: 21 additions & 21 deletions glance/common/scripts/image_import/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,37 +86,37 @@ def import_image(image_repo, image_factory, task_input, task_id, uri):
# NOTE: set image status to saving just before setting data
original_image.status = 'saving'
image_repo.save(original_image)
set_image_data(original_image, uri, None)

# NOTE: Check if the Image is not deleted after setting the data
# before setting it's status to active. We need to set the status
# explicitly here using the Image object returned from image_repo .The
# Image object returned from create_image method does not have appropriate
# factories wrapped around it.
image_id = original_image.image_id

# NOTE: Retrieving image from the database because the Image object
# returned from create_image method does not have appropriate factories
# wrapped around it.
new_image = image_repo.get(image_id)
set_image_data(new_image, uri, None)

try:
new_image = image_repo.get(image_id)
if new_image.status == 'saving':
new_image.status = 'active'
new_image.size = original_image.size
new_image.virtual_size = original_image.virtual_size
new_image.checksum = original_image.checksum
# NOTE: Check if the Image is not deleted after setting the data
# before saving the active image. Here if image status is
# saving, then new_image is saved as it contains updated location,
# size, virtual_size and checksum information and the status of
# new_image is already set to active in set_image_data() call.
image = image_repo.get(image_id)
if image.status == 'saving':
image_repo.save(new_image)
return image_id
else:
msg = _("The Image %(image_id)s object being created by this task "
"%(task_id)s, is no longer in valid status for further "
"processing.") % {"image_id": new_image.image_id,
"processing.") % {"image_id": image_id,
"task_id": task_id}
raise exception.Conflict(msg)
image_repo.save(new_image)

return image_id
except (exception.Conflict, exception.NotFound):
with excutils.save_and_reraise_exception():
if original_image.locations:
for location in original_image.locations:
if new_image.locations:
for location in new_image.locations:
store_utils.delete_image_location_from_backend(
original_image.context,
original_image.image_id,
new_image.context,
image_id,
location)


Expand Down
3 changes: 2 additions & 1 deletion glance/tests/unit/common/scripts/image_import/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ def test_import_image(self):
image_id,
image_import_script.import_image(image_repo, image_factory,
task_input, None, uri))
self.assertEqual('active', image.status)
# Check image is in saving state before image_repo.save called
self.assertEqual('saving', image.status)
self.assertTrue(image_repo.save.called)
mock_set_img_data.assert_called_once_with(image, uri, None)
self.assertTrue(image_repo.get.called)
Expand Down

0 comments on commit 78b5b0a

Please sign in to comment.