Merge "Delete image residual data"
This commit is contained in:
commit
4337293662
|
@ -924,8 +924,8 @@ class Manager(periodic_task.PeriodicTasks):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.exception("Unexpected exception while uploading image: %s",
|
LOG.exception("Unexpected exception while uploading image: %s",
|
||||||
six.text_type(e))
|
six.text_type(e))
|
||||||
self.driver.delete_image(context, snapshot_image.id,
|
self.driver.delete_committed_image(context, snapshot_image.id,
|
||||||
'glance')
|
glance.GlanceDriver())
|
||||||
self.driver.delete_image(context, container_image_id,
|
self.driver.delete_image(context, container_image_id,
|
||||||
'docker')
|
'docker')
|
||||||
raise
|
raise
|
||||||
|
@ -952,8 +952,8 @@ class Manager(periodic_task.PeriodicTasks):
|
||||||
except exception.DockerError as e:
|
except exception.DockerError as e:
|
||||||
LOG.error("Error occurred while calling docker commit API: %s",
|
LOG.error("Error occurred while calling docker commit API: %s",
|
||||||
six.text_type(e))
|
six.text_type(e))
|
||||||
self.driver.delete_image(context, snapshot_image.id,
|
self.driver.delete_committed_image(context, snapshot_image.id,
|
||||||
'glance')
|
glance.GlanceDriver())
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
if unpause:
|
if unpause:
|
||||||
|
@ -975,8 +975,8 @@ class Manager(periodic_task.PeriodicTasks):
|
||||||
LOG.debug('Deleting image...')
|
LOG.debug('Deleting image...')
|
||||||
# TODO(hongbin): Let caller pass down image_driver instead of using
|
# TODO(hongbin): Let caller pass down image_driver instead of using
|
||||||
# CONF.default_image_driver
|
# CONF.default_image_driver
|
||||||
self.driver.delete_image(context, image.image_id,
|
if image.image_id:
|
||||||
CONF.default_image_driver)
|
self.driver.delete_image(context, image.image_id)
|
||||||
image.destroy(context, image.uuid)
|
image.destroy(context, image.uuid)
|
||||||
|
|
||||||
def image_pull(self, context, image):
|
def image_pull(self, context, image):
|
||||||
|
|
|
@ -141,6 +141,7 @@ class DockerDriver(driver.ContainerDriver):
|
||||||
return docker.get_image(name)
|
return docker.get_image(name)
|
||||||
|
|
||||||
def delete_image(self, context, img_id, image_driver=None):
|
def delete_image(self, context, img_id, image_driver=None):
|
||||||
|
image = self.inspect_image(img_id)['RepoTags'][0]
|
||||||
if image_driver:
|
if image_driver:
|
||||||
image_driver_list = [image_driver.lower()]
|
image_driver_list = [image_driver.lower()]
|
||||||
else:
|
else:
|
||||||
|
@ -148,11 +149,24 @@ class DockerDriver(driver.ContainerDriver):
|
||||||
for driver_name in image_driver_list:
|
for driver_name in image_driver_list:
|
||||||
try:
|
try:
|
||||||
image_driver = img_driver.load_image_driver(driver_name)
|
image_driver = img_driver.load_image_driver(driver_name)
|
||||||
image_driver.delete_image(context, img_id)
|
if driver_name == 'glance':
|
||||||
|
image_driver.delete_image_tar(context, image)
|
||||||
|
elif driver_name == 'docker':
|
||||||
|
image_driver.delete_image(context, img_id)
|
||||||
except exception.ZunException:
|
except exception.ZunException:
|
||||||
LOG.exception('Unknown exception occurred while deleting '
|
LOG.exception('Unknown exception occurred while deleting '
|
||||||
'image %s', img_id)
|
'image %s', img_id)
|
||||||
|
|
||||||
|
def delete_committed_image(self, context, img_id, image_driver):
|
||||||
|
try:
|
||||||
|
image_driver.delete_committed_image(context, img_id)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.exception('Unknown exception occurred while'
|
||||||
|
'deleting image %s: %s',
|
||||||
|
img_id,
|
||||||
|
six.text_type(e))
|
||||||
|
raise exception.ZunException(six.text_type(e))
|
||||||
|
|
||||||
def images(self, repo, quiet=False):
|
def images(self, repo, quiet=False):
|
||||||
with docker_utils.docker_client() as docker:
|
with docker_utils.docker_client() as docker:
|
||||||
return docker.images(repo, quiet)
|
return docker.images(repo, quiet)
|
||||||
|
|
|
@ -286,5 +286,8 @@ class ContainerDriver(object):
|
||||||
image_driver):
|
image_driver):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def delete_image(context, img_id, **kwargs):
|
def delete_committed_image(self, context, img_id, image_driver):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def delete_image(self, context, img_id, image_driver):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
|
@ -85,3 +85,11 @@ class ContainerImageDriver(object):
|
||||||
def delete_image(self, context, img_id):
|
def delete_image(self, context, img_id):
|
||||||
"""Delete an image."""
|
"""Delete an image."""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def delete_committed_image(self, context, img_id, image_driver):
|
||||||
|
"""Delete a committed image."""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def delete_image_tar(self, context, image):
|
||||||
|
"""Delete an image."""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
|
@ -156,9 +156,9 @@ class GlanceDriver(driver.ContainerImageDriver):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise exception.ZunException(six.text_type(e))
|
raise exception.ZunException(six.text_type(e))
|
||||||
|
|
||||||
def delete_image(self, context, img_id):
|
def delete_committed_image(self, context, img_id):
|
||||||
"""Delete an image."""
|
"""Delete a committed image."""
|
||||||
LOG.debug('Delete an image %s in glance', img_id)
|
LOG.debug('Delete the committed image %s in glance', img_id)
|
||||||
try:
|
try:
|
||||||
return utils.delete_image(context, img_id)
|
return utils.delete_image(context, img_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -167,3 +167,17 @@ class GlanceDriver(driver.ContainerImageDriver):
|
||||||
img_id,
|
img_id,
|
||||||
six.text_type(e))
|
six.text_type(e))
|
||||||
raise exception.ZunException(six.text_type(e))
|
raise exception.ZunException(six.text_type(e))
|
||||||
|
|
||||||
|
def delete_image_tar(self, context, image):
|
||||||
|
"""Delete image tar file that pull from glance"""
|
||||||
|
repo = image.split(':')[0]
|
||||||
|
tag = image.split(':')[1]
|
||||||
|
image = self._search_image_on_host(context, repo, tag)
|
||||||
|
if image:
|
||||||
|
if self._verify_md5sum_for_image(image):
|
||||||
|
tarfile = image.get('path')
|
||||||
|
try:
|
||||||
|
os.unlink(tarfile)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.exception('Cannot delete tar file %s', tarfile)
|
||||||
|
raise exception.ZunException(six.text_type(e))
|
||||||
|
|
|
@ -1210,7 +1210,7 @@ class TestManager(base.TestCase):
|
||||||
|
|
||||||
@mock.patch.object(ContainerActionEvent, 'event_start')
|
@mock.patch.object(ContainerActionEvent, 'event_start')
|
||||||
@mock.patch.object(ContainerActionEvent, 'event_finish')
|
@mock.patch.object(ContainerActionEvent, 'event_finish')
|
||||||
@mock.patch.object(fake_driver, 'delete_image')
|
@mock.patch.object(fake_driver, 'delete_committed_image')
|
||||||
@mock.patch.object(fake_driver, 'commit')
|
@mock.patch.object(fake_driver, 'commit')
|
||||||
@mock.patch.object(fake_driver, 'pause')
|
@mock.patch.object(fake_driver, 'pause')
|
||||||
@mock.patch.object(fake_driver, 'unpause')
|
@mock.patch.object(fake_driver, 'unpause')
|
||||||
|
|
|
@ -72,11 +72,14 @@ class TestDockerDriver(base.DriverTestCase):
|
||||||
self.driver.get_image(name='image_name')
|
self.driver.get_image(name='image_name')
|
||||||
self.mock_docker.get_image.assert_called_once_with('image_name')
|
self.mock_docker.get_image.assert_called_once_with('image_name')
|
||||||
|
|
||||||
def test_delete_image(self):
|
@mock.patch('zun.image.glance.driver.GlanceDriver.delete_image_tar')
|
||||||
self.mock_docker.remove_image = mock.Mock()
|
def test_delete_image(self, mock_delete_image):
|
||||||
mock_image = mock.MagicMock()
|
self.mock_docker.inspect_image = mock.Mock(
|
||||||
self.driver.delete_image(self.context, mock_image)
|
return_value={'RepoTags': ['ubuntu:1']})
|
||||||
self.mock_docker.remove_image.assert_called_once_with(mock_image)
|
img_id = '1234'
|
||||||
|
self.driver.delete_image(self.context, img_id, 'glance')
|
||||||
|
self.mock_docker.inspect_image.assert_called_once_with(img_id)
|
||||||
|
self.assertTrue(mock_delete_image.called)
|
||||||
|
|
||||||
def test_load_image(self):
|
def test_load_image(self):
|
||||||
self.mock_docker.load_image = mock.Mock()
|
self.mock_docker.load_image = mock.Mock()
|
||||||
|
|
|
@ -155,10 +155,10 @@ class TestDriver(base.BaseTestCase):
|
||||||
self.assertTrue(mock_update_image.called)
|
self.assertTrue(mock_update_image.called)
|
||||||
|
|
||||||
@mock.patch('zun.image.glance.utils.delete_image')
|
@mock.patch('zun.image.glance.utils.delete_image')
|
||||||
def test_delete_image(self, mock_delete_image):
|
def test_delete_committed_image(self, mock_delete_image):
|
||||||
image_meta = mock.MagicMock()
|
image_meta = mock.MagicMock()
|
||||||
image_meta.id = '1234'
|
image_meta.id = '1234'
|
||||||
mock_delete_image.return_value = [image_meta]
|
mock_delete_image.return_value = [image_meta]
|
||||||
ret = self.driver.delete_image(None, 'id')
|
ret = self.driver.delete_committed_image(None, 'id')
|
||||||
self.assertEqual(1, len(ret))
|
self.assertEqual(1, len(ret))
|
||||||
self.assertTrue(mock_delete_image.called)
|
self.assertTrue(mock_delete_image.called)
|
||||||
|
|
Loading…
Reference in New Issue