Merge "Make image_conversion use action wrapper"
This commit is contained in:
commit
f8d42b388d
|
@ -62,19 +62,22 @@ class _ConvertImage(task.Task):
|
||||||
|
|
||||||
default_provides = 'file_path'
|
default_provides = 'file_path'
|
||||||
|
|
||||||
def __init__(self, context, task_id, task_type,
|
def __init__(self, context, task_id, task_type, action_wrapper):
|
||||||
image_repo, image_id):
|
|
||||||
self.context = context
|
self.context = context
|
||||||
self.task_id = task_id
|
self.task_id = task_id
|
||||||
self.task_type = task_type
|
self.task_type = task_type
|
||||||
self.image_repo = image_repo
|
self.action_wrapper = action_wrapper
|
||||||
self.image_id = image_id
|
self.image_id = action_wrapper.image_id
|
||||||
self.dest_path = ""
|
self.dest_path = ""
|
||||||
self.python = CONF.wsgi.python_interpreter
|
self.python = CONF.wsgi.python_interpreter
|
||||||
super(_ConvertImage, self).__init__(
|
super(_ConvertImage, self).__init__(
|
||||||
name='%s-Convert_Image-%s' % (task_type, task_id))
|
name='%s-Convert_Image-%s' % (task_type, task_id))
|
||||||
|
|
||||||
def execute(self, file_path, **kwargs):
|
def execute(self, file_path, **kwargs):
|
||||||
|
with self.action_wrapper as action:
|
||||||
|
return self._execute(action, file_path, **kwargs)
|
||||||
|
|
||||||
|
def _execute(self, action, file_path, **kwargs):
|
||||||
|
|
||||||
target_format = CONF.image_conversion.output_format
|
target_format = CONF.image_conversion.output_format
|
||||||
# TODO(jokke): Once we support other schemas we need to take them into
|
# TODO(jokke): Once we support other schemas we need to take them into
|
||||||
|
@ -111,13 +114,11 @@ class _ConvertImage(task.Task):
|
||||||
raise RuntimeError(msg)
|
raise RuntimeError(msg)
|
||||||
|
|
||||||
virtual_size = metadata.get('virtual-size', 0)
|
virtual_size = metadata.get('virtual-size', 0)
|
||||||
image = self.image_repo.get(self.image_id)
|
action.set_image_attribute(virtual_size=virtual_size)
|
||||||
image.virtual_size = virtual_size
|
|
||||||
|
|
||||||
if source_format == target_format:
|
if source_format == target_format:
|
||||||
LOG.debug("Source is already in target format, "
|
LOG.debug("Source is already in target format, "
|
||||||
"not doing conversion for %s", self.image_id)
|
"not doing conversion for %s", self.image_id)
|
||||||
self.image_repo.save(image)
|
|
||||||
return file_path
|
return file_path
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -135,9 +136,8 @@ class _ConvertImage(task.Task):
|
||||||
if stderr:
|
if stderr:
|
||||||
raise RuntimeError(stderr)
|
raise RuntimeError(stderr)
|
||||||
|
|
||||||
image.disk_format = target_format
|
action.set_image_attribute(disk_format=target_format,
|
||||||
image.container_format = 'bare'
|
container_format='bare')
|
||||||
self.image_repo.save(image)
|
|
||||||
|
|
||||||
os.remove(src_path)
|
os.remove(src_path)
|
||||||
|
|
||||||
|
@ -161,14 +161,13 @@ def get_flow(**kwargs):
|
||||||
:param task_type: Type of the task.
|
:param task_type: Type of the task.
|
||||||
:param image_repo: Image repository used.
|
:param image_repo: Image repository used.
|
||||||
:param image_id: Image ID
|
:param image_id: Image ID
|
||||||
|
:param action_wrapper: An api_image_import.ActionWrapper.
|
||||||
"""
|
"""
|
||||||
context = kwargs.get('context')
|
context = kwargs.get('context')
|
||||||
task_id = kwargs.get('task_id')
|
task_id = kwargs.get('task_id')
|
||||||
task_type = kwargs.get('task_type')
|
task_type = kwargs.get('task_type')
|
||||||
image_repo = kwargs.get('image_repo')
|
action_wrapper = kwargs.get('action_wrapper')
|
||||||
image_id = kwargs.get('image_id')
|
|
||||||
|
|
||||||
return lf.Flow(task_type).add(
|
return lf.Flow(task_type).add(
|
||||||
_ConvertImage(context, task_id, task_type,
|
_ConvertImage(context, task_id, task_type, action_wrapper)
|
||||||
image_repo, image_id),
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -21,6 +21,7 @@ import glance_store
|
||||||
from oslo_concurrency import processutils
|
from oslo_concurrency import processutils
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
|
import glance.async_.flows.api_image_import as import_flow
|
||||||
import glance.async_.flows.plugins.image_conversion as image_conversion
|
import glance.async_.flows.plugins.image_conversion as image_conversion
|
||||||
from glance.async_ import utils as async_utils
|
from glance.async_ import utils as async_utils
|
||||||
from glance.common import utils
|
from glance.common import utils
|
||||||
|
@ -83,24 +84,32 @@ class TestConvertImageTask(test_utils.BaseTestCase):
|
||||||
task_time_to_live=task_ttl,
|
task_time_to_live=task_ttl,
|
||||||
task_input=task_input)
|
task_input=task_input)
|
||||||
|
|
||||||
|
self.image.extra_properties = {
|
||||||
|
'os_glance_import_task': self.task.task_id}
|
||||||
|
self.wrapper = import_flow.ImportActionWrapper(self.img_repo,
|
||||||
|
self.image_id,
|
||||||
|
self.task.task_id)
|
||||||
|
|
||||||
@mock.patch.object(os, 'remove')
|
@mock.patch.object(os, 'remove')
|
||||||
def test_image_convert_success(self, mock_os_remove):
|
def test_image_convert_success(self, mock_os_remove):
|
||||||
mock_os_remove.return_value = None
|
mock_os_remove.return_value = None
|
||||||
image_convert = image_conversion._ConvertImage(self.context,
|
image_convert = image_conversion._ConvertImage(self.context,
|
||||||
self.task.task_id,
|
self.task.task_id,
|
||||||
self.task_type,
|
self.task_type,
|
||||||
self.img_repo,
|
self.wrapper)
|
||||||
self.image_id)
|
|
||||||
|
|
||||||
self.task_repo.get.return_value = self.task
|
self.task_repo.get.return_value = self.task
|
||||||
image = mock.MagicMock(image_id=self.image_id, virtual_size=None,
|
image = mock.MagicMock(image_id=self.image_id, virtual_size=None,
|
||||||
|
extra_properties={
|
||||||
|
'os_glance_import_task': self.task.task_id},
|
||||||
disk_format='qcow2')
|
disk_format='qcow2')
|
||||||
self.img_repo.get.return_value = image
|
self.img_repo.get.return_value = image
|
||||||
|
|
||||||
with mock.patch.object(processutils, 'execute') as exc_mock:
|
with mock.patch.object(processutils, 'execute') as exc_mock:
|
||||||
exc_mock.return_value = ("", None)
|
exc_mock.return_value = ("", None)
|
||||||
with mock.patch.object(json, 'loads') as jloads_mock:
|
with mock.patch.object(json, 'loads') as jloads_mock:
|
||||||
jloads_mock.return_value = {'format': 'raw'}
|
jloads_mock.return_value = {'format': 'raw',
|
||||||
|
'virtual-size': 123}
|
||||||
image_convert.execute('file:///test/path.raw')
|
image_convert.execute('file:///test/path.raw')
|
||||||
|
|
||||||
# NOTE(hemanthm): Asserting that the source format is passed
|
# NOTE(hemanthm): Asserting that the source format is passed
|
||||||
|
@ -110,12 +119,15 @@ class TestConvertImageTask(test_utils.BaseTestCase):
|
||||||
self.assertIn('-f', exc_mock.call_args[0])
|
self.assertIn('-f', exc_mock.call_args[0])
|
||||||
self.assertEqual("qcow2", image.disk_format)
|
self.assertEqual("qcow2", image.disk_format)
|
||||||
|
|
||||||
|
self.assertEqual('bare', image.container_format)
|
||||||
|
self.assertEqual('qcow2', image.disk_format)
|
||||||
|
self.assertEqual(123, image.virtual_size)
|
||||||
|
|
||||||
def _setup_image_convert_info_fail(self):
|
def _setup_image_convert_info_fail(self):
|
||||||
image_convert = image_conversion._ConvertImage(self.context,
|
image_convert = image_conversion._ConvertImage(self.context,
|
||||||
self.task.task_id,
|
self.task.task_id,
|
||||||
self.task_type,
|
self.task_type,
|
||||||
self.img_repo,
|
self.wrapper)
|
||||||
self.image_id)
|
|
||||||
|
|
||||||
self.task_repo.get.return_value = self.task
|
self.task_repo.get.return_value = self.task
|
||||||
image = mock.MagicMock(image_id=self.image_id, virtual_size=None,
|
image = mock.MagicMock(image_id=self.image_id, virtual_size=None,
|
||||||
|
@ -239,8 +251,7 @@ class TestConvertImageTask(test_utils.BaseTestCase):
|
||||||
image_convert = image_conversion._ConvertImage(self.context,
|
image_convert = image_conversion._ConvertImage(self.context,
|
||||||
self.task.task_id,
|
self.task.task_id,
|
||||||
self.task_type,
|
self.task_type,
|
||||||
self.img_repo,
|
self.wrapper)
|
||||||
self.image_id)
|
|
||||||
|
|
||||||
self.task_repo.get.return_value = self.task
|
self.task_repo.get.return_value = self.task
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue