client.__exit__.assert_called_once()
mock_supports_layering.assert_called_once()
+ @common_mocks
+ def test_delete_backup_snaps(self):
+ self.driver.rbd.Image.remove_snap = mock.Mock()
+ with mock.patch.object(self.driver, '_get_backup_snaps') as \
+ mock_get_backup_snaps:
+ mock_get_backup_snaps.return_value = [{'name': 'snap1'}]
+ rbd_image = self.driver.rbd.Image()
+ self.driver._delete_backup_snaps(rbd_image)
+ mock_get_backup_snaps.assert_called_once_with(rbd_image)
+ self.assertTrue(self.driver.rbd.Image.remove_snap.called)
+
@common_mocks
def test_delete_volume(self):
client = self.mock_client.return_value
if int(volume['size']):
self._resize(volume)
- def _delete_backup_snaps(self, client, volume_name):
- rbd_image = self.rbd.Image(client.ioctx, volume_name)
- try:
- backup_snaps = self._get_backup_snaps(rbd_image)
- if backup_snaps:
- for snap in backup_snaps:
- rbd_image.remove_snap(snap['name'])
- else:
- LOG.debug(_("volume has no backup snaps"))
- finally:
- rbd_image.close()
+ def _delete_backup_snaps(self, rbd_image):
+ backup_snaps = self._get_backup_snaps(rbd_image)
+ if backup_snaps:
+ for snap in backup_snaps:
+ rbd_image.remove_snap(snap['name'])
+ else:
+ LOG.debug(_("volume has no backup snaps"))
def _get_clone_info(self, volume, volume_name, snap=None):
"""If volume is a clone, return its parent info.
parent = None
# Ensure any backup snapshots are deleted
- self._delete_backup_snaps(client, volume_name)
+ self._delete_backup_snaps(rbd_image)
# If the volume has non-clone snapshots this delete is expected to
# raise VolumeIsBusy so do so straight away.