Ejemplo n.º 1
0
    def terminate_connection(self, volume, connector, **kwargs):
        LOG.info(
            'Terminate FC connection for volume %(id)s, '
            'connector info %(conn)s.', {
                'id': volume.id,
                'conn': connector
            })
        if self._is_volume_multi_attach_to_same_host(volume, connector):
            return

        metadata = huawei_utils.get_volume_private_data(volume)
        if metadata.get('hypermetro'):
            hypermetro = huawei_utils.get_hypermetro(self.local_cli, volume)
            if hypermetro:
                rmt_ini_tgt_map = huawei_flow.terminate_remote_fc_connection(
                    hypermetro['ID'], connector, self.fc_san,
                    self.hypermetro_rmt_cli)

        loc_ini_tgt_map = huawei_flow.terminate_fc_connection(
            volume, constants.LUN_TYPE, connector, self.fc_san, self.local_cli)
        if metadata.get('hypermetro'):
            self._merge_ini_tgt_map(loc_ini_tgt_map, rmt_ini_tgt_map)

        conn = {
            'driver_volume_type': 'fibre_channel',
            'data': {
                'initiator_target_map': loc_ini_tgt_map
            },
        }
        LOG.info('Terminate FC connection successfully: %s.', conn)
        zm_utils.remove_fc_zone(conn)
        return conn
Ejemplo n.º 2
0
    def initialize_connection(self, volume, connector):
        LOG.info(
            'Initialize FC connection for volume %(id)s, '
            'connector info %(conn)s.', {
                'id': volume.id,
                'conn': connector
            })

        metadata = huawei_utils.get_volume_private_data(volume)
        if metadata.get('hypermetro'):
            if (not connector.get('multipath')
                    and self.configuration.enforce_multipath_for_hypermetro):
                msg = _("Mapping hypermetro volume must use multipath.")
                LOG.error(msg)
                raise exception.VolumeBackendAPIException(data=msg)
            elif (not connector.get('multipath')
                  and not self.configuration.enforce_multipath_for_hypermetro):
                LOG.warning("Mapping hypermetro volume not use multipath,"
                            " so just mapping the local lun.")
            if not self.hypermetro_rmt_cli:
                msg = _("Mapping hypermetro volume requires remote.")
                LOG.error(msg)
                raise exception.VolumeBackendAPIException(data=msg)

        local_mapping = huawei_flow.initialize_fc_connection(
            volume, constants.LUN_TYPE, connector, self.fc_san, self.local_cli,
            self.configuration)
        if metadata.get('hypermetro') and connector.get('multipath'):
            hypermetro = huawei_utils.get_hypermetro(self.local_cli, volume)
            if not hypermetro:
                msg = _("Mapping hypermetro remote volume error.")
                LOG.error(msg)
                raise exception.VolumeBackendAPIException(data=msg)

            remote_mapping = huawei_flow.initialize_remote_fc_connection(
                hypermetro['ID'], connector, self.fc_san,
                self.hypermetro_rmt_cli, self.configuration)
            same_host_lun_id = self._change_same_host_lun_id(
                local_mapping, remote_mapping)
            mapping_info = self._merge_fc_mapping(local_mapping,
                                                  remote_mapping,
                                                  same_host_lun_id)
        else:
            mapping_info = local_mapping

        mapping_info.pop('aval_host_lun_ids', None)
        conn = {'driver_volume_type': 'fibre_channel', 'data': mapping_info}
        LOG.info('Initialize FC connection successfully: %s.', conn)
        zm_utils.add_fc_zone(conn)
        return conn
Ejemplo n.º 3
0
    def terminate_connection(self, volume, connector, **kwargs):
        LOG.info(
            'Terminate iscsi connection for volume %(id)s, '
            'connector info %(conn)s.', {
                'id': volume.id,
                'conn': connector
            })
        metadata = huawei_utils.get_volume_private_data(volume)
        if metadata.get('hypermetro'):
            hypermetro = huawei_utils.get_hypermetro(self.local_cli, volume)
            if hypermetro:
                huawei_flow.terminate_remote_iscsi_connection(
                    hypermetro['ID'], connector, self.hypermetro_rmt_cli)

        huawei_flow.terminate_iscsi_connection(volume, constants.LUN_TYPE,
                                               connector, self.local_cli)
        LOG.info('Terminate iscsi connection successfully.')
Ejemplo n.º 4
0
    def _terminate_connection_locked(self, host, volume, connector):
        LOG.info('Terminate iscsi connection for volume %(id)s, '
                 'connector info %(conn)s.',
                 {'id': volume.id, 'conn': connector})
        if self._is_volume_multi_attach_to_same_host(volume, connector):
            return

        metadata = huawei_utils.get_volume_private_data(volume)
        if metadata.get('hypermetro'):
            hypermetro = huawei_utils.get_hypermetro(self.local_cli, volume)
            if hypermetro:
                huawei_flow.terminate_remote_iscsi_connection(
                    hypermetro['ID'], connector, self.hypermetro_rmt_cli,
                    self.configuration)

        huawei_flow.terminate_iscsi_connection(
            volume, constants.LUN_TYPE, connector, self.local_cli,
            self.configuration)
        LOG.info('Terminate iscsi connection successfully.')
Ejemplo n.º 5
0
    def _remove_volume_from_metrogroup(self, volumes, metrogroup_id):
        metro_ids = []
        for volume in volumes:
            metadata = huawei_utils.get_volume_private_data(volume)
            if not metadata.get('hypermetro'):
                LOG.warning("Volume %s doesn't have hypermetro.", volume.id)
                continue

            hypermetro = huawei_utils.get_hypermetro(self.local_cli, volume)
            if not hypermetro:
                LOG.warning("Volume %s doesn't have hypermetro on the array.",
                            volume.id)
                continue

            metro_id = hypermetro['ID']
            self.local_cli.remove_metro_from_metrogroup(
                metrogroup_id, metro_id)
            metro_ids.append(metro_id)

        self._ensure_hypermetro_not_in_group(metrogroup_id, metro_ids)