summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVipin Balachandran <vbala@vmware.com>2014-08-18 20:28:23 +0530
committerVipin Balachandran <vbala@vmware.com>2014-08-21 20:43:15 +0530
commitabb4e829fcabeb6debb6158ccb444a265e209b17 (patch)
tree8d310a57e055be979123309e282e8653671990a9
parente434d1b81976378c0971ab645ea789ca484834a6 (diff)
downloadoslo-vmware-abb4e829fcabeb6debb6158ccb444a265e209b17.tar.gz
Support for copying streamOptimized disk to file
This patch adds a method for copying virtual disk in streamOptimized format from VMware datastore to a file. Change-Id: I1e358e6fe310312515bdcdf014f8beaf7a82256d
-rw-r--r--oslo/vmware/image_transfer.py29
-rw-r--r--tests/test_image_transfer.py29
2 files changed, 58 insertions, 0 deletions
diff --git a/oslo/vmware/image_transfer.py b/oslo/vmware/image_transfer.py
index a86773d..ffcc583 100644
--- a/oslo/vmware/image_transfer.py
+++ b/oslo/vmware/image_transfer.py
@@ -495,6 +495,35 @@ def download_stream_optimized_image(context, timeout_secs, image_service,
return imported_vm
+def copy_stream_optimized_disk(
+ context, timeout_secs, write_handle, **kwargs):
+ """Copy virtual disk from VMware server to the given write handle.
+
+ :param context: context
+ :param timeout_secs: time in seconds to wait for the copy to complete
+ :param write_handle: copy destination
+ :param kwargs: keyword arguments to configure the source
+ VMDK read handle
+ :raises: VimException, VimFaultException, VimAttributeException,
+ VimSessionOverLoadException, VimConnectionException,
+ ImageTransferException, ValueError
+ """
+ vmdk_file_path = kwargs.get('vmdk_file_path')
+ LOG.debug("Copying virtual disk: %(vmdk_path)s to %(dest)s.",
+ {'vmdk_path': vmdk_file_path,
+ 'dest': write_handle.name})
+ file_size = kwargs.get('vmdk_size')
+ read_handle = rw_handles.VmdkReadHandle(kwargs.get('session'),
+ kwargs.get('host'),
+ kwargs.get('port'),
+ kwargs.get('vm'),
+ kwargs.get('vmdk_file_path'),
+ file_size)
+ _start_transfer(context, timeout_secs, read_handle, file_size,
+ write_file_handle=write_handle)
+ LOG.debug("Downloaded virtual disk: %s.", vmdk_file_path)
+
+
def upload_image(context, timeout_secs, image_service, image_id, owner_id,
**kwargs):
"""Upload the VM's disk file to image service.
diff --git a/tests/test_image_transfer.py b/tests/test_image_transfer.py
index 1965cd9..969e4f4 100644
--- a/tests/test_image_transfer.py
+++ b/tests/test_image_transfer.py
@@ -452,6 +452,35 @@ class ImageTransferUtilityTest(base.TestCase):
vm_import_spec=vm_import_spec,
image_size=image_size)
+ @mock.patch.object(image_transfer, '_start_transfer')
+ @mock.patch('oslo.vmware.rw_handles.VmdkReadHandle')
+ def test_copy_stream_optimized_disk(
+ self, vmdk_read_handle, start_transfer):
+
+ read_handle = mock.sentinel.read_handle
+ vmdk_read_handle.return_value = read_handle
+
+ context = mock.sentinel.context
+ timeout = mock.sentinel.timeout
+ write_handle = mock.Mock(name='/cinder/images/tmpAbcd.vmdk')
+ session = mock.sentinel.session
+ host = mock.sentinel.host
+ port = mock.sentinel.port
+ vm = mock.sentinel.vm
+ vmdk_file_path = mock.sentinel.vmdk_file_path
+ vmdk_size = mock.sentinel.vmdk_size
+
+ image_transfer.copy_stream_optimized_disk(
+ context, timeout, write_handle, session=session, host=host,
+ port=port, vm=vm, vmdk_file_path=vmdk_file_path,
+ vmdk_size=vmdk_size)
+
+ vmdk_read_handle.assert_called_once_with(
+ session, host, port, vm, vmdk_file_path, vmdk_size)
+ start_transfer.assert_called_once_with(
+ context, timeout, read_handle, vmdk_size,
+ write_file_handle=write_handle)
+
@mock.patch('oslo.vmware.rw_handles.VmdkReadHandle')
@mock.patch.object(image_transfer, '_start_transfer')
def test_upload_image(self, fake_transfer, fake_rw_handles_VmdkReadHandle):