@mock.patch.object(vmware_images, 'fetch_stream_optimized_image')
@mock.patch.object(VMDK_DRIVER, '_extend_vmdk_virtual_disk')
@mock.patch.object(VMDK_DRIVER, '_select_ds_for_volume')
+ @mock.patch.object(VMDK_DRIVER, '_get_storage_profile_id')
@mock.patch.object(VMDK_DRIVER, 'session')
@mock.patch.object(VMDK_DRIVER, 'volumeops')
- def test_copy_image_to_volume_stream_optimized(self, volumeops,
+ def test_copy_image_to_volume_stream_optimized(self,
+ volumeops,
session,
+ get_profile_id,
_select_ds_for_volume,
_extend_virtual_disk,
fetch_optimized_image):
"""
self._test_copy_image_to_volume_stream_optimized(volumeops,
session,
+ get_profile_id,
_select_ds_for_volume,
_extend_virtual_disk,
fetch_optimized_image)
def _test_copy_image_to_volume_stream_optimized(self, volumeops,
session,
+ get_profile_id,
_select_ds_for_volume,
_extend_virtual_disk,
fetch_optimized_image):
size = 5 * units.Gi
size_gb = float(size) / units.Gi
fake_volume_size = 1 + size_gb
+ adapter_type = 'ide'
fake_image_meta = {'disk_format': 'vmdk', 'size': size,
- 'properties': {'vmware_disktype':
- 'streamOptimized'}}
+ 'properties': {'vmware_disktype': 'streamOptimized',
+ 'vmware_adaptertype': adapter_type}}
image_service = mock.Mock(glance.GlanceImageService)
fake_host = mock.sentinel.host
fake_rp = mock.sentinel.rp
_select_ds_for_volume.side_effect = None
_select_ds_for_volume.return_value = (fake_host, fake_rp,
fake_folder, fake_summary)
+ profile_id = 'profile-1'
+ get_profile_id.return_value = profile_id
self._driver.copy_image_to_volume(fake_context, fake_volume,
image_service, fake_image_id)
image_service.show.assert_called_with(fake_context, fake_image_id)
_select_ds_for_volume.assert_called_with(fake_volume)
+ get_profile_id.assert_called_once_with(fake_volume)
volumeops.get_create_spec.assert_called_with(fake_volume['name'],
0,
fake_disk_type,
- fake_summary.name)
+ fake_summary.name,
+ profile_id,
+ adapter_type)
self.assertTrue(fetch_optimized_image.called)
fetch_optimized_image.assert_called_with(fake_context, timeout,
image_service,
@mock.patch.object(vmware_images, 'fetch_stream_optimized_image')
@mock.patch.object(VMDK_DRIVER, '_extend_vmdk_virtual_disk')
@mock.patch.object(VMDK_DRIVER, '_select_ds_for_volume')
+ @mock.patch.object(VMDK_DRIVER, '_get_storage_profile_id')
@mock.patch.object(VMDK_DRIVER, 'session')
@mock.patch.object(VMDK_DRIVER, 'volumeops')
def test_copy_image_to_volume_stream_optimized(self, volumeops,
session,
+ get_profile_id,
_select_ds_for_volume,
_extend_virtual_disk,
fetch_optimized_image):
"""
self._test_copy_image_to_volume_stream_optimized(volumeops,
session,
+ get_profile_id,
_select_ds_for_volume,
_extend_virtual_disk,
fetch_optimized_image)
EAGER_ZEROED_THICK_VMDK_TYPE),
THIN_VMDK_TYPE)
+ def _get_storage_profile_id(self, volume):
+ storage_profile = self._get_storage_profile(volume)
+ profile_id = None
+ if self._storage_policy_enabled and storage_profile:
+ profile = self.volumeops.retrieve_profile_id(storage_profile)
+ if profile:
+ profile_id = profile.uniqueId
+ return profile_id
+
def _create_backing(self, volume, host, create_params={}):
"""Create volume backing under the given host.
datastores)
# check if a storage profile needs to be associated with the backing VM
- storage_profile = self._get_storage_profile(volume)
- profileId = None
- if self._storage_policy_enabled and storage_profile:
- profile = self.volumeops.retrieve_profile_id(storage_profile)
- if profile:
- profileId = profile.uniqueId
+ profile_id = self._get_storage_profile_id(volume)
# default is a backing with single disk
disk_less = create_params.get(CREATE_PARAM_DISK_LESS, False)
resource_pool,
host,
summary.name,
- profileId)
+ profile_id)
# create a backing with single disk
disk_type = VMwareEsxVmdkDriver._get_disk_type(volume)
resource_pool,
host,
summary.name,
- profileId,
+ profile_id,
adapter_type)
def _relocate_backing(self, volume, backing, host):
raise exception.VolumeBackendAPIException(data=err_msg)
def _fetch_stream_optimized_image(self, context, volume, image_service,
- image_id, image_size):
+ image_id, image_size, adapter_type):
"""Creates volume from image using HttpNfc VM import.
Uses Nfc API to download the VMDK file from Glance. Nfc creates the
"%(size)s GB." % {'ds': summary.name, 'size': size_gb})
# prepare create spec for backing vm
+ profile_id = self._get_storage_profile_id(volume)
disk_type = VMwareEsxVmdkDriver._get_disk_type(volume)
# The size of stream optimized glance image is often suspect,
vm_create_spec = self.volumeops.get_create_spec(volume['name'],
dummy_disk_size,
disk_type,
- summary.name)
+ summary.name,
+ profile_id,
+ adapter_type)
# convert vm_create_spec to vm_import_spec
cf = self.session.vim.client.factory
vm_import_spec = cf.create('ns0:VirtualMachineImportSpec')
metadata = image_service.show(context, image_id)
VMwareEsxVmdkDriver._validate_disk_format(metadata['disk_format'])
- # Get disk_type for vmdk disk
- disk_type = None
+ # Get the disk type, adapter type and size of vmdk image
+ disk_type = 'preallocated'
+ adapter_type = 'lsiLogic'
image_size_in_bytes = metadata['size']
properties = metadata['properties']
- if properties and 'vmware_disktype' in properties:
- disk_type = properties['vmware_disktype']
+ if properties:
+ if 'vmware_disktype' in properties:
+ disk_type = properties['vmware_disktype']
+ if 'vmware_adaptertype' in properties:
+ adapter_type = properties['vmware_adaptertype']
try:
if disk_type == 'streamOptimized':
self._fetch_stream_optimized_image(context, volume,
image_service, image_id,
- image_size_in_bytes)
+ image_size_in_bytes,
+ adapter_type)
else:
self._fetch_flat_image(context, volume, image_service,
image_id, image_size_in_bytes)