Merge "Fix vmware disk type changed when volume type is eagerZeroedThick"
This commit is contained in:
commit
2319cc7628
@ -581,6 +581,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
image_id)
|
image_id)
|
||||||
validate_disk_format.assert_called_once_with(image_meta['disk_format'])
|
validate_disk_format.assert_called_once_with(image_meta['disk_format'])
|
||||||
|
|
||||||
|
@mock.patch.object(VMDK_DRIVER, '_get_disk_type')
|
||||||
@mock.patch('cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver.'
|
@mock.patch('cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver.'
|
||||||
'_validate_disk_format')
|
'_validate_disk_format')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_get_adapter_type',
|
@mock.patch.object(VMDK_DRIVER, '_get_adapter_type',
|
||||||
@ -604,6 +605,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
validate_image_adapter_type,
|
validate_image_adapter_type,
|
||||||
get_adapter_type,
|
get_adapter_type,
|
||||||
validate_disk_format,
|
validate_disk_format,
|
||||||
|
get_disk_type,
|
||||||
vmware_disk_type='streamOptimized',
|
vmware_disk_type='streamOptimized',
|
||||||
backing_disk_size=VOL_SIZE,
|
backing_disk_size=VOL_SIZE,
|
||||||
call_extend_backing=False,
|
call_extend_backing=False,
|
||||||
@ -618,6 +620,9 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
vops.get_backing.return_value = backing
|
vops.get_backing.return_value = backing
|
||||||
vops.get_disk_size.return_value = backing_disk_size * units.Gi
|
vops.get_disk_size.return_value = backing_disk_size * units.Gi
|
||||||
|
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
get_disk_type.return_value = disk_type
|
||||||
|
|
||||||
context = mock.sentinel.context
|
context = mock.sentinel.context
|
||||||
volume = self._create_volume_dict()
|
volume = self._create_volume_dict()
|
||||||
image_id = mock.sentinel.image_id
|
image_id = mock.sentinel.image_id
|
||||||
@ -642,7 +647,8 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
vops.get_disk_size.assert_called_once_with(backing)
|
vops.get_disk_size.assert_called_once_with(backing)
|
||||||
if call_extend_backing:
|
if call_extend_backing:
|
||||||
extend_backing.assert_called_once_with(backing, volume['size'])
|
extend_backing.assert_called_once_with(backing, volume['size'],
|
||||||
|
disk_type)
|
||||||
else:
|
else:
|
||||||
self.assertFalse(extend_backing.called)
|
self.assertFalse(extend_backing.called)
|
||||||
|
|
||||||
@ -1578,16 +1584,19 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
vops.get_vmdk_path.return_value = vmdk_path
|
vops.get_vmdk_path.return_value = vmdk_path
|
||||||
dc = mock.sentinel.datacenter
|
dc = mock.sentinel.datacenter
|
||||||
vops.get_dc.return_value = dc
|
vops.get_dc.return_value = dc
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
eager_zero = (True if disk_type == "eagerZeroedThick" else False)
|
||||||
|
|
||||||
backing = mock.sentinel.backing
|
backing = mock.sentinel.backing
|
||||||
new_size = 1
|
new_size = 1
|
||||||
self._driver._extend_backing(backing, new_size)
|
self._driver._extend_backing(backing, new_size, disk_type)
|
||||||
|
|
||||||
vops.get_vmdk_path.assert_called_once_with(backing)
|
vops.get_vmdk_path.assert_called_once_with(backing)
|
||||||
vops.get_dc.assert_called_once_with(backing)
|
vops.get_dc.assert_called_once_with(backing)
|
||||||
vops.extend_virtual_disk.assert_called_once_with(new_size,
|
vops.extend_virtual_disk.assert_called_once_with(new_size,
|
||||||
vmdk_path,
|
vmdk_path,
|
||||||
dc)
|
dc,
|
||||||
|
eager_zero)
|
||||||
|
|
||||||
@mock.patch.object(VMDK_DRIVER, 'session')
|
@mock.patch.object(VMDK_DRIVER, 'session')
|
||||||
@mock.patch('oslo_vmware.vim_util.get_vc_version')
|
@mock.patch('oslo_vmware.vim_util.get_vc_version')
|
||||||
@ -2025,11 +2034,12 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
volume['volume_type_id'], 'clone_type',
|
volume['volume_type_id'], 'clone_type',
|
||||||
default_value=volumeops.FULL_CLONE_TYPE)
|
default_value=volumeops.FULL_CLONE_TYPE)
|
||||||
|
|
||||||
|
@mock.patch.object(VMDK_DRIVER, '_get_disk_type')
|
||||||
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_select_ds_for_volume')
|
@mock.patch.object(VMDK_DRIVER, '_select_ds_for_volume')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
||||||
def _test_clone_backing(
|
def _test_clone_backing(
|
||||||
self, extend_backing, select_ds_for_volume, vops,
|
self, extend_backing, select_ds_for_volume, vops, get_disk_type,
|
||||||
clone_type=volumeops.FULL_CLONE_TYPE, extend_needed=False,
|
clone_type=volumeops.FULL_CLONE_TYPE, extend_needed=False,
|
||||||
vc60=False):
|
vc60=False):
|
||||||
host = mock.sentinel.host
|
host = mock.sentinel.host
|
||||||
@ -2042,6 +2052,9 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
clone = mock.sentinel.clone
|
clone = mock.sentinel.clone
|
||||||
vops.clone_backing.return_value = clone
|
vops.clone_backing.return_value = clone
|
||||||
|
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
get_disk_type.return_value = disk_type
|
||||||
|
|
||||||
if vc60:
|
if vc60:
|
||||||
self._driver._vc_version = '6.0'
|
self._driver._vc_version = '6.0'
|
||||||
else:
|
else:
|
||||||
@ -2091,7 +2104,8 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
vops.update_backing_disk_uuid.assert_not_called()
|
vops.update_backing_disk_uuid.assert_not_called()
|
||||||
|
|
||||||
if volume.size > src_vsize:
|
if volume.size > src_vsize:
|
||||||
extend_backing.assert_called_once_with(clone, volume.size)
|
extend_backing.assert_called_once_with(clone, volume.size,
|
||||||
|
disk_type)
|
||||||
else:
|
else:
|
||||||
extend_backing.assert_not_called()
|
extend_backing.assert_not_called()
|
||||||
|
|
||||||
@ -2284,10 +2298,13 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
host=host, resource_pool=rp, folder=folder,
|
host=host, resource_pool=rp, folder=folder,
|
||||||
disks_to_clone=[vol_dev_uuid])
|
disks_to_clone=[vol_dev_uuid])
|
||||||
|
|
||||||
|
@mock.patch.object(VMDK_DRIVER, '_get_disk_type')
|
||||||
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
||||||
def _test_extend_backing_if_needed(
|
def _test_extend_backing_if_needed(
|
||||||
self, extend_backing, vops, extend=True):
|
self, extend_backing, vops, get_disk_type, extend=True):
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
get_disk_type.return_value = disk_type
|
||||||
if extend:
|
if extend:
|
||||||
vol_size = 2
|
vol_size = 2
|
||||||
else:
|
else:
|
||||||
@ -2301,7 +2318,8 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
vops.get_disk_size.assert_called_once_with(backing)
|
vops.get_disk_size.assert_called_once_with(backing)
|
||||||
if extend:
|
if extend:
|
||||||
extend_backing.assert_called_once_with(backing, vol_size)
|
extend_backing.assert_called_once_with(backing, vol_size,
|
||||||
|
disk_type)
|
||||||
else:
|
else:
|
||||||
extend_backing.assert_not_called()
|
extend_backing.assert_not_called()
|
||||||
|
|
||||||
@ -3106,26 +3124,35 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
self.assertFalse(extend_backing.called)
|
self.assertFalse(extend_backing.called)
|
||||||
|
|
||||||
|
@mock.patch.object(VMDK_DRIVER, '_get_disk_type')
|
||||||
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
||||||
def test_extend_volume(self, extend_backing, vops):
|
def test_extend_volume(self, extend_backing, vops, get_disk_type):
|
||||||
backing = mock.sentinel.backing
|
backing = mock.sentinel.backing
|
||||||
vops.get_backing.return_value = backing
|
vops.get_backing.return_value = backing
|
||||||
|
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
get_disk_type.return_value = disk_type
|
||||||
|
|
||||||
volume = self._create_volume_dict()
|
volume = self._create_volume_dict()
|
||||||
new_size = 2
|
new_size = 2
|
||||||
self._driver.extend_volume(volume, new_size)
|
self._driver.extend_volume(volume, new_size)
|
||||||
|
|
||||||
extend_backing.assert_called_once_with(backing, new_size)
|
extend_backing.assert_called_once_with(backing, new_size, disk_type)
|
||||||
|
|
||||||
|
@mock.patch.object(VMDK_DRIVER, '_get_disk_type')
|
||||||
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_select_ds_for_volume')
|
@mock.patch.object(VMDK_DRIVER, '_select_ds_for_volume')
|
||||||
def test_extend_volume_with_no_disk_space(self, select_ds_for_volume,
|
def test_extend_volume_with_no_disk_space(self, select_ds_for_volume,
|
||||||
extend_backing, vops):
|
extend_backing, vops,
|
||||||
|
get_disk_type):
|
||||||
backing = mock.sentinel.backing
|
backing = mock.sentinel.backing
|
||||||
vops.get_backing.return_value = backing
|
vops.get_backing.return_value = backing
|
||||||
|
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
get_disk_type.return_value = disk_type
|
||||||
|
|
||||||
extend_backing.side_effect = [exceptions.NoDiskSpaceException, None]
|
extend_backing.side_effect = [exceptions.NoDiskSpaceException, None]
|
||||||
|
|
||||||
host = mock.sentinel.host
|
host = mock.sentinel.host
|
||||||
@ -3147,24 +3174,28 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
|
|||||||
host)
|
host)
|
||||||
vops.move_backing_to_folder(backing, folder)
|
vops.move_backing_to_folder(backing, folder)
|
||||||
|
|
||||||
extend_backing_calls = [mock.call(backing, new_size),
|
extend_backing_calls = [mock.call(backing, new_size, disk_type),
|
||||||
mock.call(backing, new_size)]
|
mock.call(backing, new_size, disk_type)]
|
||||||
self.assertEqual(extend_backing_calls, extend_backing.call_args_list)
|
self.assertEqual(extend_backing_calls, extend_backing.call_args_list)
|
||||||
|
|
||||||
|
@mock.patch.object(VMDK_DRIVER, '_get_disk_type')
|
||||||
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
@mock.patch.object(VMDK_DRIVER, '_extend_backing')
|
||||||
def test_extend_volume_with_extend_backing_error(
|
def test_extend_volume_with_extend_backing_error(
|
||||||
self, extend_backing, vops):
|
self, extend_backing, vops, get_disk_type):
|
||||||
backing = mock.sentinel.backing
|
backing = mock.sentinel.backing
|
||||||
vops.get_backing.return_value = backing
|
vops.get_backing.return_value = backing
|
||||||
|
|
||||||
|
disk_type = mock.sentinel.disk_type
|
||||||
|
get_disk_type.return_value = disk_type
|
||||||
|
|
||||||
extend_backing.side_effect = exceptions.VimException("Error")
|
extend_backing.side_effect = exceptions.VimException("Error")
|
||||||
|
|
||||||
volume = self._create_volume_dict()
|
volume = self._create_volume_dict()
|
||||||
new_size = 2
|
new_size = 2
|
||||||
self.assertRaises(exceptions.VimException, self._driver.extend_volume,
|
self.assertRaises(exceptions.VimException, self._driver.extend_volume,
|
||||||
volume, new_size)
|
volume, new_size)
|
||||||
extend_backing.assert_called_once_with(backing, new_size)
|
extend_backing.assert_called_once_with(backing, new_size, disk_type)
|
||||||
|
|
||||||
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
@mock.patch.object(VMDK_DRIVER, 'volumeops')
|
||||||
@mock.patch.object(VMDK_DRIVER, '_get_volume_group_folder')
|
@mock.patch.object(VMDK_DRIVER, '_get_volume_group_folder')
|
||||||
|
@ -1273,7 +1273,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
LOG.info("Done copying image: %(id)s to volume: %(vol)s.",
|
LOG.info("Done copying image: %(id)s to volume: %(vol)s.",
|
||||||
{'id': image_id, 'vol': volume['name']})
|
{'id': image_id, 'vol': volume['name']})
|
||||||
|
|
||||||
def _extend_backing(self, backing, new_size_in_gb):
|
def _extend_backing(self, backing, new_size_in_gb, disk_type):
|
||||||
"""Extend volume backing's virtual disk.
|
"""Extend volume backing's virtual disk.
|
||||||
|
|
||||||
:param backing: volume backing
|
:param backing: volume backing
|
||||||
@ -1281,8 +1281,9 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
"""
|
"""
|
||||||
root_vmdk_path = self.volumeops.get_vmdk_path(backing)
|
root_vmdk_path = self.volumeops.get_vmdk_path(backing)
|
||||||
datacenter = self.volumeops.get_dc(backing)
|
datacenter = self.volumeops.get_dc(backing)
|
||||||
|
eager_zero = disk_type == EAGER_ZEROED_THICK_VMDK_TYPE
|
||||||
self.volumeops.extend_virtual_disk(new_size_in_gb, root_vmdk_path,
|
self.volumeops.extend_virtual_disk(new_size_in_gb, root_vmdk_path,
|
||||||
datacenter)
|
datacenter, eager_zero)
|
||||||
|
|
||||||
def copy_image_to_volume(self, context, volume, image_service, image_id):
|
def copy_image_to_volume(self, context, volume, image_service, image_id):
|
||||||
"""Creates volume from image.
|
"""Creates volume from image.
|
||||||
@ -1359,7 +1360,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
{'name': volume['name'],
|
{'name': volume['name'],
|
||||||
'vol_size': volume_size,
|
'vol_size': volume_size,
|
||||||
'disk_size': disk_size})
|
'disk_size': disk_size})
|
||||||
self._extend_backing(backing, volume['size'])
|
self._extend_backing(backing, volume['size'],
|
||||||
|
VMwareVcVmdkDriver._get_disk_type(volume))
|
||||||
# TODO(vbala): handle volume_size < disk_size case.
|
# TODO(vbala): handle volume_size < disk_size case.
|
||||||
|
|
||||||
def copy_volume_to_image(self, context, volume, image_service, image_meta):
|
def copy_volume_to_image(self, context, volume, image_service, image_meta):
|
||||||
@ -1623,7 +1625,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
|
|
||||||
# try extending vmdk in place
|
# try extending vmdk in place
|
||||||
try:
|
try:
|
||||||
self._extend_backing(backing, new_size)
|
self._extend_backing(backing, new_size,
|
||||||
|
VMwareVcVmdkDriver._get_disk_type(volume))
|
||||||
LOG.info("Successfully extended volume: %(vol)s to size: "
|
LOG.info("Successfully extended volume: %(vol)s to size: "
|
||||||
"%(size)s GB.",
|
"%(size)s GB.",
|
||||||
{'vol': vol_name, 'size': new_size})
|
{'vol': vol_name, 'size': new_size})
|
||||||
@ -1646,7 +1649,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
self.volumeops.relocate_backing(backing, summary.datastore, rp,
|
self.volumeops.relocate_backing(backing, summary.datastore, rp,
|
||||||
host)
|
host)
|
||||||
self.volumeops.move_backing_to_folder(backing, folder)
|
self.volumeops.move_backing_to_folder(backing, folder)
|
||||||
self._extend_backing(backing, new_size)
|
self._extend_backing(backing, new_size,
|
||||||
|
VMwareVcVmdkDriver._get_disk_type(volume))
|
||||||
except exceptions.VMwareDriverException:
|
except exceptions.VMwareDriverException:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
LOG.error("Failed to extend volume: %(vol)s to size: "
|
LOG.error("Failed to extend volume: %(vol)s to size: "
|
||||||
@ -2031,7 +2035,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
# we need to extend/resize the capacity of the vmdk virtual disk from
|
# we need to extend/resize the capacity of the vmdk virtual disk from
|
||||||
# the size of the source volume to the volume size.
|
# the size of the source volume to the volume size.
|
||||||
if volume['size'] > src_vsize:
|
if volume['size'] > src_vsize:
|
||||||
self._extend_backing(clone, volume['size'])
|
self._extend_backing(clone, volume['size'],
|
||||||
|
VMwareVcVmdkDriver._get_disk_type(volume))
|
||||||
LOG.info("Successfully created clone: %s.", clone)
|
LOG.info("Successfully created clone: %s.", clone)
|
||||||
|
|
||||||
def _create_volume_from_template(self, volume, path):
|
def _create_volume_from_template(self, volume, path):
|
||||||
@ -2129,7 +2134,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
|
|||||||
volume_size = volume.size * units.Gi
|
volume_size = volume.size * units.Gi
|
||||||
disk_size = self.volumeops.get_disk_size(backing)
|
disk_size = self.volumeops.get_disk_size(backing)
|
||||||
if volume_size > disk_size:
|
if volume_size > disk_size:
|
||||||
self._extend_backing(backing, volume.size)
|
self._extend_backing(backing, volume.size,
|
||||||
|
VMwareVcVmdkDriver._get_disk_type(volume))
|
||||||
|
|
||||||
def _create_volume_from_temp_backing(self, volume, tmp_backing):
|
def _create_volume_from_temp_backing(self, volume, tmp_backing):
|
||||||
try:
|
try:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user