VDI-streaming: support non-default SR

If the SR is not the default one, the nova option of "sr_matching_filter"
can be used to get proper SR. In order to support it with VDI streaming,
we should add a new parameter - sr_ref which will be passed down by
nova code.

Change-Id: I624ee58f9c630f1712e066f3523ee6db45775e5c
This commit is contained in:
Jianghua Wang 2018-03-29 13:06:15 +00:00
parent bac77ee5af
commit 3e3b38e74a
4 changed files with 21 additions and 21 deletions

View File

@ -15,9 +15,9 @@
from os_xenapi.client.image import vdi_handler
def stream_to_vdis(context, session, instance, host_url, data):
def stream_to_vdis(context, session, instance, host_url, sr_ref, data):
handler = vdi_handler.ImageStreamToVDIs(context, session, instance,
host_url, data)
host_url, sr_ref, data)
handler.start()
return handler.vdis

View File

@ -29,12 +29,14 @@ CHUNK_SIZE = 4 * 1024 * 1024
class ImageStreamToVDIs(object):
def __init__(self, context, session, instance, host_url, image_stream_in):
def __init__(self, context, session, instance, host_url, sr_ref,
image_stream_in):
self.context = context
self.session = session
self.instance = instance
self.host_url = urlparse.urlparse(host_url)
self.image_stream = image_stream_in
self.sr_ref = sr_ref
self.task_ref = None
self.vdis = {}
@ -56,9 +58,9 @@ class ImageStreamToVDIs(object):
vhd_file_parser = vhd_utils.VHDFileParser(vhd_file)
vhd_footer = vhd_file_parser.parse_vhd_footer()
virtual_size = vhd_footer.current_size
sr_ref, vdi_ref = self._createVDI(self.session,
self.instance,
virtual_size)
vdi_ref = self._createVDI(self.session,
self.instance,
virtual_size)
self._vhd_stream_to_vdi(vhd_file_parser, vdi_ref,
file_size)
@ -75,12 +77,11 @@ class ImageStreamToVDIs(object):
self._clean()
def _createVDI(self, session, instance, virtual_size):
sr_ref = utils.get_default_sr(session)
vdi_ref = utils.create_vdi(session, sr_ref, instance,
vdi_ref = utils.create_vdi(session, self.sr_ref, instance,
instance['name'], 'root', virtual_size)
vdi_uuid = session.VDI.get_uuid(vdi_ref)
LOG.debug("Created a new VDI: uuid=%s" % vdi_uuid)
return sr_ref, vdi_ref
return vdi_ref
def _vhd_stream_to_vdi(self, vhd_file_parser, vdi_ref, file_size):

View File

@ -26,12 +26,13 @@ class ImageTestCase(base.TestCase):
self.session = mock.Mock()
self.instance = {'name': 'instance-001'}
self.host_url = "http://fake-host.com"
self.sr_ref = "fake_sr_ref"
self.stream = mock.Mock()
@mock.patch.object(vdi_handler.ImageStreamToVDIs, 'start')
def test_stream_to_vdis(self, mock_start):
image.stream_to_vdis(self.context, self.session, self.instance,
self.host_url, self.stream)
self.host_url, self.sr_ref, self.stream)
mock_start.assert_called_once_with()

View File

@ -33,12 +33,13 @@ class ImageStreamToVDIsTestCase(base.TestCase):
self.session = mock.Mock()
self.instance = {'name': 'instance-001'}
self.host_url = "http://fake-host.com"
self.sr_ref = "fake-sr-ref"
self.stream = mock.Mock()
@mock.patch.object(tarfile, 'open')
@mock.patch.object(vhd_utils, 'VHDFileParser')
@mock.patch.object(vdi_handler.ImageStreamToVDIs, '_createVDI',
return_value=('fake_sr_ref', 'fake_vdi_ref'))
return_value='fake_vdi_ref')
@mock.patch.object(vdi_handler.ImageStreamToVDIs, '_vhd_stream_to_vdi')
def test_start(self, mock_to_vdi, mock_createVDI,
mock_get_parser, mock_open):
@ -58,7 +59,7 @@ class ImageStreamToVDIsTestCase(base.TestCase):
image_cmd = vdi_handler.ImageStreamToVDIs(self.context, self.session,
self.instance, self.host_url,
self.stream)
self.sr_ref, self.stream)
image_cmd.start()
self.session.task.create.assert_called_once_with(
@ -72,21 +73,18 @@ class ImageStreamToVDIsTestCase(base.TestCase):
29371904)
self.session.VDI.get_uuid.assert_called_once_with('fake_vdi_ref')
@mock.patch.object(utils, 'get_default_sr',
return_value='fake-sr-ref')
@mock.patch.object(utils, 'create_vdi',
return_value='fake-vdi-ref')
def test_createVDI(self, mock_create_vdi, mock_get_sr):
def test_createVDI(self, mock_create_vdi):
virtual_size = 1073741824
image_cmd = vdi_handler.ImageStreamToVDIs(self.context, self.session,
self.instance, self.host_url,
self.stream)
expect_result = ('fake-sr-ref', 'fake-vdi-ref')
self.sr_ref, self.stream)
expect_result = 'fake-vdi-ref'
result = image_cmd._createVDI(self.session, self.instance,
virtual_size)
mock_get_sr.assert_called_once_with(self.session)
mock_create_vdi.assert_called_once_with(self.session, 'fake-sr-ref',
self.instance, 'instance-001',
'root', virtual_size)
@ -110,7 +108,7 @@ class ImageStreamToVDIsTestCase(base.TestCase):
'Content-Length': '%s' % file_size}
image_cmd = vdi_handler.ImageStreamToVDIs(self.context, self.session,
self.instance, self.host_url,
self.stream)
self.sr_ref, self.stream)
mock_parser = mock.Mock()
mock_parser.cached_buff = b'\x00' * cache_size
mock_parser.src_file = vdh_stream
@ -150,7 +148,7 @@ class ImageStreamToVDIsTestCase(base.TestCase):
file_size = cache_size + vdi_handler.CHUNK_SIZE * 2 + remain_size
image_cmd = vdi_handler.ImageStreamToVDIs(self.context, self.session,
self.instance, self.host_url,
self.stream)
self.sr_ref, self.stream)
mock_parser = mock.Mock()
mock_parser.cached_buff = b'\x00' * cache_size
mock_parser.src_file = vdh_stream
@ -178,7 +176,7 @@ class ImageStreamToVDIsTestCase(base.TestCase):
file_size = cache_size + vdi_handler.CHUNK_SIZE * 2 + remain_size
image_cmd = vdi_handler.ImageStreamToVDIs(self.context, self.session,
self.instance, self.host_url,
self.stream)
self.sr_ref, self.stream)
mock_parser = mock.Mock()
mock_parser.cached_buff = b'\x00' * cache_size
mock_parser.src_file = vdh_stream