def _detach_vbd(self, vbd_ref, unplug=False): if unplug: vm_utils.unplug_vbd(self._session, vbd_ref) sr_ref = volume_utils.find_sr_from_vbd(self._session, vbd_ref) vm_utils.destroy_vbd(self._session, vbd_ref) # Forget SR only if not in use volume_utils.purge_sr(self._session, sr_ref)
def _detach_vbds_and_srs(self, vm_ref, vbd_refs): is_vm_shutdown = vm_utils.is_vm_shutdown(self._session, vm_ref) for vbd_ref in vbd_refs: # find sr before we destroy the vbd sr_ref = volume_utils.find_sr_from_vbd(self._session, vbd_ref) if not is_vm_shutdown: vm_utils.unplug_vbd(self._session, vbd_ref, vm_ref) vm_utils.destroy_vbd(self._session, vbd_ref) # Forget (i.e. disconnect) SR only if not in use volume_utils.purge_sr(self._session, sr_ref)
def test_purge_sr_no_VBDs(self, mock_forget): def _call_xenapi(func, *args): if func == 'SR.get_VDIs': return ['VDI1', 'VDI2'] if func == 'VDI.get_VBDs': return [] self.session = mock.Mock() self.session.call_xenapi = _call_xenapi volume_utils.purge_sr(self.session, 'SR') mock_forget.assert_called_once_with(self.session, 'SR')
def test_purge_sr_no_VBDs(self, mock_forget): def _call_xenapi(func, *args): if func == "SR.get_VDIs": return ["VDI1", "VDI2"] if func == "VDI.get_VBDs": return [] self.session = mock.Mock() self.session.call_xenapi = _call_xenapi volume_utils.purge_sr(self.session, "SR") mock_forget.assert_called_once_with(self.session, "SR")
def safe_cleanup_from_vdis(self, vdi_refs): # A helper method to detach volumes that are not associated with an # instance for vdi_ref in vdi_refs: try: sr_ref = volume_utils.find_sr_from_vdi(self._session, vdi_ref) except exception.StorageError as exc: LOG.debug(exc.format_message()) continue try: # Forget (i.e. disconnect) SR only if not in use volume_utils.purge_sr(self._session, sr_ref) except Exception: LOG.debug("Ignoring error while purging sr: %s" % sr_ref, exc_info=True)
def safe_cleanup_from_vdis(self, vdi_refs): # A helper method to detach volumes that are not associated with an # instance for vdi_ref in vdi_refs: try: sr_ref = volume_utils.find_sr_from_vdi(self._session, vdi_ref) except exception.StorageError as exc: LOG.debug(exc.format_message()) continue try: # Forget (i.e. disconnect) SR only if not in use volume_utils.purge_sr(self._session, sr_ref) except Exception: LOG.debug('Ignoring error while purging sr: %s' % sr_ref, exc_info=True)
def test_purge_sr_in_use(self, mock_forget): def _call_xenapi(func, *args): if func == 'SR.get_VDIs': return ['VDI1', 'VDI2'] if func == 'VDI.get_VBDs': if args[0] == 'VDI1': return ['VBD1'] if args[0] == 'VDI2': return ['VBD2'] self.session = mock.Mock() self.session.call_xenapi = _call_xenapi volume_utils.purge_sr(self.session, 'SR') self.assertEqual([], mock_forget.mock_calls)
def test_purge_sr_in_use(self, mock_forget): def _call_xenapi(func, *args): if func == "SR.get_VDIs": return ["VDI1", "VDI2"] if func == "VDI.get_VBDs": if args[0] == "VDI1": return ["VBD1"] if args[0] == "VDI2": return ["VBD2"] self.session = mock.Mock() self.session.call_xenapi = _call_xenapi volume_utils.purge_sr(self.session, "SR") self.assertEqual([], mock_forget.mock_calls)
vbd_ref = vm_utils.find_vbd_by_number(self._session, vm_ref, device_number) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Unable to locate volume %s') % mountpoint) try: vm_rec = self._session.call_xenapi("VM.get_record", vm_ref) sr_ref = volume_utils.find_sr_from_vbd(self._session, vbd_ref) if vm_rec['power_state'] != 'Halted': vm_utils.unplug_vbd(self._session, vbd_ref) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Unable to detach volume %s') % mountpoint) try: vm_utils.destroy_vbd(self._session, vbd_ref) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Unable to destroy vbd %s') % mountpoint) # Forget SR only if no other volumes on this host are using it try: volume_utils.purge_sr(self._session, sr_ref) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Error purging SR %s') % sr_ref) LOG.info( _('Mountpoint %(mountpoint)s detached from' ' instance %(instance_name)s') % locals())
% locals()) device_number = volume_utils.mountpoint_to_number(mountpoint) try: vbd_ref = vm_utils.find_vbd_by_number(self._session, vm_ref, device_number) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Unable to locate volume %s') % mountpoint) try: sr_ref = volume_utils.find_sr_from_vbd(self._session, vbd_ref) vm_utils.unplug_vbd(self._session, vbd_ref) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Unable to detach volume %s') % mountpoint) try: vm_utils.destroy_vbd(self._session, vbd_ref) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Unable to destroy vbd %s') % mountpoint) # Forget SR only if no other volumes on this host are using it try: volume_utils.purge_sr(self._session, sr_ref) except volume_utils.StorageError, exc: LOG.exception(exc) raise Exception(_('Error purging SR %s') % sr_ref) LOG.info(_('Mountpoint %(mountpoint)s detached from' ' instance %(instance_name)s') % locals())