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:
parent
bac77ee5af
commit
3e3b38e74a
|
@ -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
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue