Esempio n. 1
0
    def _get_snapshot_id(self, volume_name, snapshot_name):
        """Queries the gateway to find the lun id for the exported snapshot.

        Arguments:
            volume_name    -- LUN to query
            snapshot_name  -- Exported snapshot associated with LUN

        Returns:
            LUN ID for the exported lun
        """
        lun_id = -1

        prefix = "/vshare/config/export/snapshot/container"
        bn = "%s/%s/lun/%s/snap/%s/target/**" \
            % (prefix, self.container, volume_name, snapshot_name)
        resp = self.vip.basic.get_node_values(bn)

        for node in resp:
            if node.endswith('/lun_id'):
                lun_id = resp[node]
                break

        if lun_id == -1:
            raise exception.ViolinBackendErrNotFound()
        return lun_id
Esempio n. 2
0
    def _fatal_error_code(self, response):
        """Raise an exception for certain errors in a XG response.

        Error codes are extracted from vdmd_mgmt.c.

        Arguments:
            response -- a response dict result from an XG request
        """
        # known non-fatal response codes:
        # 1024: 'lun deletion in progress, try again later'
        # 14032: 'lc_err_lock_busy'

        if response['code'] == 14000:
            # lc_generic_error
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14002:
            # lc_err_assertion_failed
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14004:
            # lc_err_not_found
            raise exception.ViolinBackendErrNotFound()
        elif response['code'] == 14005:
            # lc_err_exists
            raise exception.ViolinBackendErrExists()
        elif response['code'] == 14008:
            # lc_err_unexpected_arg
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14014:
            # lc_err_io_error
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14016:
            # lc_err_io_closed
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14017:
            # lc_err_io_timeout
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14021:
            # lc_err_unexpected_case
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14025:
            # lc_err_no_fs_space
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14035:
            # lc_err_range
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14036:
            # lc_err_invalid_param
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 14121:
            # lc_err_cancelled_err
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 512:
            # Not enough free space in container (vdmd bug)
            raise exception.ViolinBackendErr(message=response['message'])
        elif response['code'] == 1 and 'LUN ID conflict' \
                in response['message']:
            # lun id conflict while attempting to export
            raise exception.ViolinBackendErr(message=response['message'])
Esempio n. 3
0
    def test_delete_lun_lun_already_deleted(self):
        """Array fails to delete a lun that doesn't exist."""
        response = {'code': 14005, 'message': 'LUN ... does not exist.'}

        conf = {
            'lun.delete_lun.return_value': response,
        }
        self.driver.vip = self.setup_mock_vshare(m_conf=conf)
        self.driver._send_cmd = mock.Mock(
            side_effect=exception.ViolinBackendErrNotFound(
                response['message']))

        self.assertTrue(self.driver._delete_lun(VOLUME) is None)