コード例 #1
0
    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)
コード例 #2
0
ファイル: volumeops.py プロジェクト: hanjinze/nova
    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)
コード例 #3
0
    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)
コード例 #4
0
    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')
コード例 #5
0
ファイル: volumeops.py プロジェクト: Chillisystems/nova
    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)
コード例 #6
0
ファイル: test_volume_utils.py プロジェクト: ApostleJX/nova
    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")
コード例 #7
0
ファイル: test_volume_utils.py プロジェクト: 375670450/nova
    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')
コード例 #8
0
ファイル: volumeops.py プロジェクト: VinceOnGit/nova
    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)
コード例 #9
0
    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)
コード例 #10
0
    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)
コード例 #11
0
ファイル: test_volume_utils.py プロジェクト: ApostleJX/nova
    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)
コード例 #12
0
ファイル: test_volume_utils.py プロジェクト: 375670450/nova
    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)
コード例 #13
0
            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())
コード例 #14
0
ファイル: volumeops.py プロジェクト: A7Zulu/nova
                % 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())