def _run_add_lun(self, ldev, port, gid, lun=None): """Create a LUN between the specified LDEV and port-gid.""" ignore_error = [_LU_PATH_DEFINED] if lun is not None: ignore_error = [rest_api.ANOTHER_LDEV_MAPPED] assigned_lun, errobj = self.client.add_lun( port, gid, ldev, lun=lun, ignore_error=ignore_error, interval=_LUN_RETRY_INTERVAL, timeout=_LUN_MAX_WAITTIME) err_code = utils.safe_get_err_code(errobj) if lun is None: if err_code == _LU_PATH_DEFINED: lun = self._find_lun(ldev, port, gid) LOG.debug( 'An logical unit path has already defined in the ' 'specified logical device. (LDEV: %(ldev)s, ' 'port: %(port)s, gid: %(gid)s, lun: %(lun)s)', {'ldev': ldev, 'port': port, 'gid': gid, 'lun': lun}) else: lun = assigned_lun elif err_code == rest_api.ANOTHER_LDEV_MAPPED: utils.output_log(MSG.MAP_LDEV_FAILED, ldev=ldev, port=port, id=gid, lun=lun) return None LOG.debug( 'Created logical unit path to the specified logical device. ' '(LDEV: %(ldev)s, port: %(port)s, ' 'gid: %(gid)s, lun: %(lun)s)', {'ldev': ldev, 'port': port, 'gid': gid, 'lun': lun}) return lun
def _create_clone_pair(self, pvol, svol): """Create a clone copy pair on the storage.""" snapshot_name = '%(prefix)s%(svol)s' % { 'prefix': CLONE_NAME, 'svol': svol % _SNAP_HASH_SIZE, } try: body = {"snapshotGroupName": snapshot_name, "snapshotPoolId": self.storage_info['snap_pool_id'], "pvolLdevId": pvol, "svolLdevId": svol, "isClone": True, "clonesAutomation": True, "copySpeed": 'medium', "isDataReductionForceCopy": True} self.client.add_snapshot(body) except utils.HBSDError as ex: if (utils.safe_get_err_code(ex.kwargs.get('errobj')) == rest_api.INVALID_SNAPSHOT_POOL and not self.conf.hitachi_snap_pool): msg = utils.output_log( MSG.INVALID_PARAMETER, param='hitachi_snap_pool') raise utils.HBSDError(msg) else: raise try: self._wait_copy_pair_status(svol, set([PSUS, SMPP, SMPL])) except Exception: with excutils.save_and_reraise_exception(): try: self._delete_pair_from_storage(pvol, svol) except utils.HBSDError: utils.output_log( MSG.DELETE_PAIR_FAILED, pvol=pvol, svol=svol)
def _create_ctg_snap_pair(self, pairs): snapshotgroup_name = self._create_ctg_snapshot_group_name( pairs[0]['pvol']) try: for pair in pairs: try: body = { "snapshotGroupName": snapshotgroup_name, "snapshotPoolId": self.storage_info['snap_pool_id'], "pvolLdevId": pair['pvol'], "svolLdevId": pair['svol'], "isConsistencyGroup": True, "canCascade": True, "isDataReductionForceCopy": True } self.client.add_snapshot(body) except exception.VolumeDriverException as ex: if ((utils.safe_get_err_code(ex.kwargs.get('errobj')) == _MAX_CTG_COUNT_EXCEEDED_ADD_SNAPSHOT) or (utils.safe_get_err_code(ex.kwargs.get('errobj')) == _MAX_PAIR_COUNT_IN_CTG_EXCEEDED_ADD_SNAPSHOT)): msg = utils.output_log(MSG.FAILED_CREATE_CTG_SNAPSHOT) self.raise_error(msg) elif (utils.safe_get_err_code(ex.kwargs.get('errobj')) == rest_api.INVALID_SNAPSHOT_POOL and not self.conf.hitachi_snap_pool): msg = utils.output_log( MSG.INVALID_PARAMETER, param=self.driver_info['param_prefix'] + '_snap_pool') self.raise_error(msg) raise self._wait_copy_pair_status(pair['svol'], PAIR) self.client.split_snapshotgroup(snapshotgroup_name) for pair in pairs: self._wait_copy_pair_status(pair['svol'], PSUS) except Exception: with excutils.save_and_reraise_exception(): self._delete_pairs_from_storage(pairs)
def _create_snap_pair(self, pvol, svol): """Create a snapshot copy pair on the storage.""" snapshot_name = '%(prefix)s%(svol)s' % { 'prefix': self.driver_info['driver_prefix'] + '-snap', 'svol': svol % _SNAP_HASH_SIZE, } try: body = { "snapshotGroupName": snapshot_name, "snapshotPoolId": self.storage_info['snap_pool_id'], "pvolLdevId": pvol, "svolLdevId": svol, "autoSplit": True, "canCascade": True, "isDataReductionForceCopy": True } self.client.add_snapshot(body) except exception.VolumeDriverException as ex: if (utils.safe_get_err_code( ex.kwargs.get('errobj')) == rest_api.INVALID_SNAPSHOT_POOL and not self.conf.hitachi_snap_pool): msg = utils.output_log(MSG.INVALID_PARAMETER, param=self.driver_info['param_prefix'] + '_snap_pool') self.raise_error(msg) else: raise try: self._wait_copy_pair_status(svol, PSUS) except Exception: with excutils.save_and_reraise_exception(): try: self._delete_pair_from_storage(pvol, svol) except exception.VolumeDriverException: utils.output_log(MSG.DELETE_PAIR_FAILED, pvol=pvol, svol=svol)
def get_err_code(self): return utils.safe_get_err_code(self['errobj'])