def do_setup(self, context):
        self.conf.update_config_value()

        self.local_cli = rest_client.RestClient(
            self.configuration.san_address, self.configuration.san_user,
            self.configuration.san_password, self.configuration.vstore_name,
            self.configuration.ssl_cert_verify,
            self.configuration.ssl_cert_path)
        self.local_cli.login()
        self.support_dedup_and_compress = huawei_utils.is_support_clone_pair(
            self.local_cli)

        for c in constants.CHECK_FEATURES:
            self.support_capability[c] = False

        if self.configuration.hypermetro:
            self.hypermetro_rmt_cli = rest_client.RestClient(
                self.configuration.hypermetro['san_address'],
                self.configuration.hypermetro['san_user'],
                self.configuration.hypermetro['san_password'],
                self.configuration.hypermetro['vstore_name'],
            )
            self.hypermetro_rmt_cli.login()

        if self.configuration.replication:
            self.replication_rmt_cli = rest_client.RestClient(
                self.configuration.replication['san_address'],
                self.configuration.replication['san_user'],
                self.configuration.replication['san_password'],
                self.configuration.replication['vstore_name'],
            )
            self.replication_rmt_cli.login()
Example #2
0
    def do_setup(self, context):
        self.conf.update_config_value()

        self.local_cli = rest_client.RestClient(
            self.configuration.san_address, self.configuration.san_user,
            self.configuration.san_password, self.configuration.vstore_name,
            self.configuration.ssl_cert_verify,
            self.configuration.ssl_cert_path)
        self.local_cli.login()

        if self.configuration.hypermetro:
            self.hypermetro_rmt_cli = rest_client.RestClient(
                self.configuration.hypermetro['san_address'],
                self.configuration.hypermetro['san_user'],
                self.configuration.hypermetro['san_password'],
                self.configuration.hypermetro['vstore_name'],
            )
            self.hypermetro_rmt_cli.login()

        if self.configuration.replication:
            self.replication_rmt_cli = rest_client.RestClient(
                self.configuration.replication['san_address'],
                self.configuration.replication['san_user'],
                self.configuration.replication['san_password'],
                self.configuration.replication['vstore_name'],
            )
            self.replication_rmt_cli.login()
    def delete_hypermetro(self, volume):
        """Delete hypermetro."""
        metadata = huawei_utils.get_volume_metadata(volume)
        metro_id = metadata['hypermetro_id']
        remote_lun_id = metadata['remote_lun_id']

        if metro_id:
            exst_flag = self.client.check_hypermetro_exist(metro_id)
            if exst_flag:
                metro_info = self.client.get_hypermetro_by_id(metro_id)
                metro_status = int(metro_info['data']['RUNNINGSTATUS'])

                LOG.debug("Hypermetro status is: %s.", metro_status)
                if constants.HYPERMETRO_RUNNSTATUS_STOP != metro_status:
                    self.client.stop_hypermetro(metro_id)

                # Delete hypermetro
                self.client.delete_hypermetro(metro_id)

        # Delete remote lun.
        if remote_lun_id:
            metro_devices = self.configuration.hypermetro_devices
            device_info = huawei_utils.get_remote_device_info(metro_devices)
            self.rmt_client = rest_client.RestClient(self.configuration)
            self.rmt_client.login_with_ip(device_info)

            try:
                if self.rmt_client.check_lun_exist(remote_lun_id):
                    self.rmt_client.delete_lun(remote_lun_id)
            except Exception as err:
                msg = _("Delete remote lun err. %s.") % err
                LOG.exception(msg)
                raise exception.VolumeBackendAPIException(data=msg)
            finally:
                self.rmt_client.logout()
Example #4
0
 def _init_rmt_client(self):
     # Multiple addresses support.
     rmt_addrs = self.replica_device[0]['san_address'].split(';')
     rmt_addrs = list(set([x.strip() for x in rmt_addrs if x.strip()]))
     rmt_user = self.replica_device[0]['san_user']
     rmt_password = self.replica_device[0]['san_password']
     self.rmt_client = rest_client.RestClient(self.conf,
                                              rmt_addrs,
                                              rmt_user,
                                              rmt_password)
    def create_hypermetro(self, local_lun_id, lun_param):
        """Create hypermetro."""
        metro_devices = self.configuration.hypermetro_devices
        device_info = huawei_utils.get_remote_device_info(metro_devices)
        self.rmt_client = rest_client.RestClient(self.configuration)
        self.rmt_client.login_with_ip(device_info)

        try:
            # Get the remote pool info.
            config_pool = device_info['StoragePool']
            remote_pool = self.rmt_client.find_all_pools()
            pool = self.rmt_client.find_pool_info(config_pool,
                                                  remote_pool)
            # Create remote lun
            lun_param['PARENTID'] = pool['ID']
            remotelun_info = self.rmt_client.create_volume(lun_param)
            remote_lun_id = remotelun_info['ID']

            # Get hypermetro domain
            try:
                domain_name = device_info['domain_name']
                domain_id = self.rmt_client.get_hyper_domain_id(domain_name)
                self._wait_volume_ready(remote_lun_id)
                hypermetro = self._create_hypermetro_pair(domain_id,
                                                          local_lun_id,
                                                          remote_lun_id)

                return hypermetro['ID'], remote_lun_id
            except Exception as err:
                self.rmt_client.delete_lun(remote_lun_id)
                msg = _('Create hypermetro error. %s.') % err
                raise exception.VolumeBackendAPIException(data=msg)
        except exception.VolumeBackendAPIException:
            raise
        except Exception as err:
            msg = _("Create remote LUN error. %s.") % err
            LOG.exception(msg)
            raise exception.VolumeBackendAPIException(data=msg)
        finally:
            self.rmt_client.logout()
Example #6
0
 def do_setup(self, context):
     """Instantiate common class and login storage system."""
     self.restclient = rest_client.RestClient(self.configuration)
     return self.restclient.login()
    def disconnect_volume_fc(self, volume, connector):
        """Delete map between a volume and a host for FC."""
        # Login remote storage device.
        self.xml_file_path = self.configuration.cinder_huawei_conf_file
        metro_devices = self.configuration.hypermetro_devices
        device_info = huawei_utils.get_remote_device_info(metro_devices)
        self.rmt_client = rest_client.RestClient(self.configuration)
        self.rmt_client.login_with_ip(device_info)

        try:
            wwns = connector['wwpns']
            volume_name = huawei_utils.encode_name(volume['id'])
            metadata = huawei_utils.get_volume_metadata(volume)
            lun_id = metadata['remote_lun_id']
            host_name = connector['host']
            left_lunnum = -1
            lungroup_id = None
            view_id = None

            LOG.info(_LI('terminate_connection_fc: volume name: %(volume)s, '
                         'wwpns: %(wwns)s, '
                         'lun_id: %(lunid)s.'),
                     {'volume': volume_name,
                      'wwns': wwns,
                      'lunid': lun_id},)

            if host_name and (len(host_name) > constants.MAX_HOSTNAME_LENGTH):
                host_name = six.text_type(hash(host_name))

            hostid = self.rmt_client.find_host(host_name)
            if hostid:
                mapping_view_name = constants.MAPPING_VIEW_PREFIX + hostid
                view_id = self.rmt_client.find_mapping_view(
                    mapping_view_name)
                if view_id:
                    lungroup_id = self.rmt_client.find_lungroup_from_map(
                        view_id)

            if lun_id and self.rmt_client.check_lun_exist(lun_id):
                if lungroup_id:
                    lungroup_ids = self.rmt_client.get_lungroupids_by_lunid(
                        lun_id)
                    if lungroup_id in lungroup_ids:
                        self.rmt_client.remove_lun_from_lungroup(
                            lungroup_id, lun_id)
                    else:
                        LOG.warning(_LW("Lun is not in lungroup. "
                                        "Lun id: %(lun_id)s, "
                                        "lungroup id: %(lungroup_id)s"),
                                    {"lun_id": lun_id,
                                     "lungroup_id": lungroup_id})

            (tgt_port_wwns, init_targ_map) = (
                self.rmt_client.get_init_targ_map(wwns))

            hostid = self.rmt_client.find_host(host_name)
            if hostid:
                mapping_view_name = constants.MAPPING_VIEW_PREFIX + hostid
                view_id = self.rmt_client.find_mapping_view(
                    mapping_view_name)
                if view_id:
                    lungroup_id = self.rmt_client.find_lungroup_from_map(
                        view_id)
            if lungroup_id:
                left_lunnum = self.rmt_client.get_lunnum_from_lungroup(
                    lungroup_id)

        except Exception as err:
            msg = _("Remote detatch volume error. %s.") % err
            LOG.exception(msg)
            raise exception.VolumeBackendAPIException(data=msg)
        finally:
            self.rmt_client.logout()

        if int(left_lunnum) > 0:
            info = {'driver_volume_type': 'fibre_channel',
                    'data': {}}
        else:
            info = {'driver_volume_type': 'fibre_channel',
                    'data': {'target_wwn': tgt_port_wwns,
                             'initiator_target_map': init_targ_map}, }

        return info
    def connect_volume_fc(self, volume, connector):
        """Create map between a volume and a host for FC."""
        self.xml_file_path = self.configuration.cinder_huawei_conf_file
        metro_devices = self.configuration.hypermetro_devices
        device_info = huawei_utils.get_remote_device_info(metro_devices)
        self.rmt_client = rest_client.RestClient(self.configuration)
        self.rmt_client.login_with_ip(device_info)

        try:
            wwns = connector['wwpns']
            volume_name = huawei_utils.encode_name(volume['id'])

            LOG.info(_LI(
                'initialize_connection_fc, initiator: %(wwpns)s,'
                ' volume name: %(volume)s.'),
                {'wwpns': wwns,
                 'volume': volume_name})

            metadata = huawei_utils.get_volume_metadata(volume)
            lun_id = metadata['remote_lun_id']

            if lun_id is None:
                lun_id = self.rmt_client.get_volume_by_name(volume_name)
            if lun_id is None:
                msg = _("Can't get volume id. Volume name: %s.") % volume_name
                LOG.error(msg)
                raise exception.VolumeBackendAPIException(data=msg)

            host_name_before_hash = None
            host_name = connector['host']
            if host_name and (len(host_name) > constants.MAX_HOSTNAME_LENGTH):
                host_name_before_hash = host_name
                host_name = six.text_type(hash(host_name))

            # Create hostgroup if not exist.
            host_id = self.rmt_client.add_host_with_check(
                host_name, host_name_before_hash)

            online_wwns_in_host = (
                self.rmt_client.get_host_online_fc_initiators(host_id))
            online_free_wwns = self.rmt_client.get_online_free_wwns()
            for wwn in wwns:
                if (wwn not in online_wwns_in_host
                        and wwn not in online_free_wwns):
                    wwns_in_host = (
                        self.rmt_client.get_host_fc_initiators(host_id))
                    iqns_in_host = (
                        self.rmt_client.get_host_iscsi_initiators(host_id))
                    if not wwns_in_host and not iqns_in_host:
                        self.rmt_client.remove_host(host_id)

                    msg = _('Can not add FC port to host.')
                    LOG.error(msg)
                    raise exception.VolumeBackendAPIException(data=msg)

            for wwn in wwns:
                if wwn in online_free_wwns:
                    self.rmt_client.add_fc_port_to_host(host_id, wwn)

            (tgt_port_wwns, init_targ_map) = (
                self.rmt_client.get_init_targ_map(wwns))

            # Add host into hostgroup.
            hostgroup_id = self.rmt_client.add_host_into_hostgroup(host_id)
            map_info = self.rmt_client.do_mapping(lun_id,
                                                  hostgroup_id,
                                                  host_id)
            host_lun_id = self.rmt_client.find_host_lun_id(host_id, lun_id)
        except exception.VolumeBackendAPIException:
            raise
        except Exception as err:
            msg = _("Connect volume fc: connect volume error. %s.") % err
            LOG.exception(msg)
            raise exception.VolumeBackendAPIException(data=msg)

        # Return FC properties.
        fc_info = {'driver_volume_type': 'fibre_channel',
                   'data': {'target_lun': int(host_lun_id),
                            'target_discovered': True,
                            'target_wwn': tgt_port_wwns,
                            'volume_id': volume['id'],
                            'initiator_target_map': init_targ_map,
                            'map_info': map_info},
                   }

        LOG.info(_LI('Remote return FC info is: %s.'), fc_info)

        return fc_info