From 3e3b38e74a69869c25d28022c7b052ae4e583aaf Mon Sep 17 00:00:00 2001 From: Jianghua Wang Date: Thu, 29 Mar 2018 13:06:15 +0000 Subject: [PATCH] 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 --- os_xenapi/client/image/__init__.py | 4 ++-- os_xenapi/client/image/vdi_handler.py | 15 +++++++------- os_xenapi/tests/client/image/test_init.py | 3 ++- .../tests/client/image/test_vdi_handler.py | 20 +++++++++---------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/os_xenapi/client/image/__init__.py b/os_xenapi/client/image/__init__.py index b373b79..f7fef89 100644 --- a/os_xenapi/client/image/__init__.py +++ b/os_xenapi/client/image/__init__.py @@ -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 diff --git a/os_xenapi/client/image/vdi_handler.py b/os_xenapi/client/image/vdi_handler.py index dea678f..4dfc49c 100644 --- a/os_xenapi/client/image/vdi_handler.py +++ b/os_xenapi/client/image/vdi_handler.py @@ -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): diff --git a/os_xenapi/tests/client/image/test_init.py b/os_xenapi/tests/client/image/test_init.py index 4bbd48a..a9c35ee 100644 --- a/os_xenapi/tests/client/image/test_init.py +++ b/os_xenapi/tests/client/image/test_init.py @@ -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() diff --git a/os_xenapi/tests/client/image/test_vdi_handler.py b/os_xenapi/tests/client/image/test_vdi_handler.py index 303e516..9e811f4 100644 --- a/os_xenapi/tests/client/image/test_vdi_handler.py +++ b/os_xenapi/tests/client/image/test_vdi_handler.py @@ -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