예제 #1
0
 def comm_create_pair(self, pvol, svol, is_vvol):
     if not is_vvol:
         args = '-compsplit -pace %s' % self.pace
         method = basic_lib.FULL
     else:
         pool = self.conf.hitachi_thin_pool_id
         args = ('-localrepdppoolno %d -localmngdppoolno %d '
                 '-compsplit -pace %s' % (pool, pool, self.pace))
         method = basic_lib.THIN
     try:
         self.pairoperate('create', pvol, svol, is_vvol, args=args)
     except exception.HBSDCmdError as ex:
         if (re.search('DMER0300B8', ex.stderr)
                 or re.search('DMER0800CF', ex.stderr)
                 or re.search('DMER0800D[0-6D]', ex.stderr)
                 or re.search('DMER03006A', ex.stderr)
                 or re.search('DMER030080', ex.stderr)):
             msg = basic_lib.output_err(615, copy_method=method, pvol=pvol)
             raise exception.HBSDBusy(message=msg)
         else:
             raise
예제 #2
0
    def delete_pair(self, ldev, all_split=True, is_vvol=None):
        paired_info = self.command.get_paired_info(ldev)
        LOG.debug('paired_info: %s', paired_info)
        pvol = paired_info['pvol']
        svols = paired_info['svol']
        driver = self.generated_from
        restart = False
        svol_list = []
        try:
            if pvol is None:
                return
            elif pvol == ldev:
                for svol in svols[:]:
                    if svol['is_vvol'] or svol['status'] != basic_lib.PSUS:
                        continue

                    self.command.delete_pair(pvol, svol['lun'], False)
                    restart = True
                    driver.pair_terminate_connection(svol['lun'])
                    svols.remove(svol)

                if all_split and svols:
                    svol_list.append(six.text_type(svols[0]['lun']))
                    for svol in svols[1:]:
                        svol_list.append(', %d' % svol['lun'])

                    msg = basic_lib.output_err(616,
                                               pvol=pvol,
                                               svol=''.join(svol_list))
                    raise exception.HBSDBusy(message=msg)

                if not svols:
                    driver.pair_terminate_connection(pvol)

            else:
                self.add_volinfo(pvol)
                if not self.volume_info[pvol]['in_use'].lock.acquire(False):
                    desc = self.volume_info[pvol]['in_use'].desc
                    msg = basic_lib.output_err(660, desc=desc)
                    raise exception.HBSDBusy(message=msg)
                try:
                    paired_info = self.command.get_paired_info(ldev)
                    if paired_info['pvol'] is None:
                        return
                    svol = paired_info['svol'][0]
                    if svol['status'] != basic_lib.PSUS:
                        msg = basic_lib.output_err(616, pvol=pvol, svol=ldev)
                        raise exception.HBSDBusy(message=msg)

                    self.command.delete_pair(pvol, ldev, svol['is_vvol'])
                    if not svol['is_vvol']:
                        restart = True
                    driver.pair_terminate_connection(ldev)
                    paired_info = self.command.get_paired_info(pvol)
                    if paired_info['pvol'] is None:
                        driver.pair_terminate_connection(pvol)
                finally:
                    self.volume_info[pvol]['in_use'].lock.release()
        except Exception:
            with excutils.save_and_reraise_exception():
                if restart:
                    try:
                        self.command.restart_pair_horcm()
                    except Exception as e:
                        LOG.warning('Failed to restart horcm: %s', e)
        else:
            if (all_split or is_vvol) and restart:
                try:
                    self.command.restart_pair_horcm()
                except Exception as e:
                    LOG.warning('Failed to restart horcm: %s', e)