DRBD: extend volume if larger than snapshot

Extend volume if during create_volume_from_snapshot() the new volume
is larger than the snapshot it was created from. Moved resize checks
and calls from create_cloned_volume() to create_volume_from_snapshot()
to reuse code.

Extended and added new test cases to cover the change.

Closes-Bug: #1560636

Change-Id: I16c93ce272320a72964ea2f8727b3f0fb24149f7
Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
This commit is contained in:
Danny Al-Gaaf 2016-03-23 09:58:10 +01:00
parent a176df2807
commit f8f2f421f9
2 changed files with 65 additions and 18 deletions

View File

@ -480,17 +480,62 @@ class DrbdManageIscsiTestCase(test.TestCase):
self.assertEqual("list_snapshots", dmd.odm.calls[4][0])
self.assertEqual("restore_snapshot", dmd.odm.calls[5][0])
self.assertEqual("run_external_plugin", dmd.odm.calls[6][0])
self.assertEqual("list_snapshots", dmd.odm.calls[7][0])
self.assertEqual("remove_snapshot", dmd.odm.calls[8][0])
# resize image checks
self.assertEqual("list_volumes", dmd.odm.calls[7][0])
self.assertEqual(newvol['id'], dmd.odm.calls[7][3]["aux:cinder-id"])
self.assertEqual("resize_volume", dmd.odm.calls[8][0])
self.assertEqual("res", dmd.odm.calls[8][1])
self.assertEqual(2, dmd.odm.calls[8][2])
self.assertEqual(-1, dmd.odm.calls[8][3])
self.assertEqual(5242880, dmd.odm.calls[8][4])
self.assertEqual("run_external_plugin", dmd.odm.calls[9][0])
self.assertEqual("list_snapshots", dmd.odm.calls[10][0])
self.assertEqual("remove_snapshot", dmd.odm.calls[11][0])
def test_create_volume_from_snapshot(self):
snap = {'project_id': 'testprjid',
'name': 'testvol',
'volume_size': 1,
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
'volume_type_id': 'drbdmanage',
'created_at': timeutils.utcnow()}
newvol = {'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
dmd.odm = DrbdManageFakeDriver()
dmd.create_volume_from_snapshot(newvol, snap)
self.assertEqual("list_snapshots", dmd.odm.calls[0][0])
self.assertEqual("restore_snapshot", dmd.odm.calls[1][0])
self.assertEqual("run_external_plugin", dmd.odm.calls[2][0])
def test_create_volume_from_snapshot_larger_size(self):
snap = {'project_id': 'testprjid',
'name': 'testvol',
'volume_size': 1,
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
'volume_type_id': 'drbdmanage',
'created_at': timeutils.utcnow()}
newvol = {'size': 5,
'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
dmd.odm = DrbdManageFakeDriver()
dmd.create_volume_from_snapshot(newvol, snap)
self.assertEqual("list_snapshots", dmd.odm.calls[0][0])
self.assertEqual("restore_snapshot", dmd.odm.calls[1][0])
self.assertEqual("run_external_plugin", dmd.odm.calls[2][0])
# resize image checks
self.assertEqual("list_volumes", dmd.odm.calls[9][0])
self.assertEqual(newvol['id'], dmd.odm.calls[9][3]["aux:cinder-id"])
self.assertEqual("resize_volume", dmd.odm.calls[10][0])
self.assertEqual("res", dmd.odm.calls[10][1])
self.assertEqual(2, dmd.odm.calls[10][2])
self.assertEqual(-1, dmd.odm.calls[10][3])
self.assertEqual(5242880, dmd.odm.calls[10][4])
self.assertEqual("list_volumes", dmd.odm.calls[3][0])
self.assertEqual(newvol['id'], dmd.odm.calls[3][3]["aux:cinder-id"])
self.assertEqual("resize_volume", dmd.odm.calls[4][0])
self.assertEqual("res", dmd.odm.calls[4][1])
self.assertEqual(2, dmd.odm.calls[4][2])
self.assertEqual(-1, dmd.odm.calls[4][3])
self.assertEqual(5242880, dmd.odm.calls[4][4])
class DrbdManageDrbdTestCase(DrbdManageIscsiTestCase):

View File

@ -585,24 +585,26 @@ class DrbdManageBaseDriver(driver.VolumeDriver):
{'res': new_res, 'vol': volume['id']})
raise exception.VolumeBackendAPIException(data=message)
if (('size' in volume) and (volume['size'] > snapshot['volume_size'])):
LOG.debug("resize volume '%(dst_vol)s' from %(src_size)d to "
"%(dst_size)d",
{'dst_vol': volume['id'],
'src_size': snapshot['volume_size'],
'dst_size': volume['size']})
self.extend_volume(volume, volume['size'])
def create_cloned_volume(self, volume, src_vref):
temp_id = self._clean_uuid()
snapshot = {'id': temp_id}
self.create_snapshot({'id': temp_id, 'volume_id': src_vref['id']})
self.create_snapshot({'id': temp_id,
'volume_id': src_vref['id']})
snapshot['volume_size'] = src_vref['size']
self.create_volume_from_snapshot(volume, snapshot)
self.delete_snapshot(snapshot)
if (('size' in volume) and (volume['size'] > src_vref['size'])):
LOG.debug("resize volume '%(dst_vol)s' from %(src_size)d to "
"%(dst_size)d",
{'dst_vol': volume['id'],
'src_size': src_vref['size'],
'dst_size': volume['size']})
self.extend_volume(volume, volume['size'])
def _update_volume_stats(self):
data = {}