Пример #1
0
 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
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
 def get_err_code(self):
     return utils.safe_get_err_code(self['errobj'])