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
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'])
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)