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
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
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.')
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.')
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)