FC: refactor fczm utils decorators to functions
This patch changes the Fibre Channel Zone Manager utility decorators to functions. Those functions now have to be called manually. The intention of this is to unify how the FC drivers are to be declared and used vs. the iSCSI. No more magic decorators for FC drivers only. Change-Id: I8e6e964e3694654b8ba93fe432a0dd49fa5e1df0
This commit is contained in:
parent
e6028249cc
commit
3b28cb2a10
@ -240,38 +240,42 @@ class FakeISERDriver(FakeLoggingVolumeDriver):
|
||||
|
||||
class FakeFibreChannelDriver(driver.FibreChannelDriver):
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
return {
|
||||
conn_info = {
|
||||
'driver_volume_type': 'fibre_channel',
|
||||
'data': {
|
||||
'initiator_target_map': {'fake_wwn': ['fake_wwn2']},
|
||||
}}
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def no_zone_initialize_connection(self, volume, connector):
|
||||
"""This shouldn't call the ZM."""
|
||||
return {
|
||||
conn_info = {
|
||||
'driver_volume_type': 'bogus',
|
||||
'data': {
|
||||
'initiator_target_map': {'fake_wwn': ['fake_wwn2']},
|
||||
}}
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
return {
|
||||
conn_info = {
|
||||
'driver_volume_type': 'fibre_channel',
|
||||
'data': {
|
||||
'initiator_target_map': {'fake_wwn': ['fake_wwn2']},
|
||||
}}
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def no_zone_terminate_connection(self, volume, connector, **kwargs):
|
||||
return {
|
||||
conn_info = {
|
||||
'driver_volume_type': 'bogus',
|
||||
'data': {
|
||||
'initiator_target_map': {'fake_wwn': ['fake_wwn2']},
|
||||
}}
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
|
||||
class FakeGateDriver(lvm.LVMVolumeDriver):
|
||||
|
@ -159,7 +159,6 @@ class EMCCoprHDFCDriver(driver.FibreChannelDriver):
|
||||
"""Make sure volume is exported."""
|
||||
pass
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Initializes the connection and returns connection info."""
|
||||
|
||||
@ -196,12 +195,13 @@ class EMCCoprHDFCDriver(driver.FibreChannelDriver):
|
||||
properties['auth_password'] = auth_secret
|
||||
|
||||
LOG.debug('FC properties: %s', properties)
|
||||
return {
|
||||
conn_info = {
|
||||
'driver_volume_type': 'fibre_channel',
|
||||
'data': properties,
|
||||
}
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Driver entry point to detach a volume from an instance."""
|
||||
|
||||
@ -221,6 +221,7 @@ class EMCCoprHDFCDriver(driver.FibreChannelDriver):
|
||||
'data': {
|
||||
'target_wwn': target_wwns,
|
||||
'initiator_target_map': initiator_target_map}}
|
||||
fczm_utils.remove_fc_zone(data)
|
||||
|
||||
LOG.debug('Return FC data: %s', data)
|
||||
return data
|
||||
|
@ -76,7 +76,14 @@ class SCFCDriver(storagecenter_common.SCCommonDriver,
|
||||
self.configuration.safe_get('volume_backend_name') or 'Dell-FC'
|
||||
self.storage_protocol = 'FC'
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def validate_connector(self, connector):
|
||||
"""Fail if connector doesn't contain all the data needed by driver.
|
||||
|
||||
Do a check on the connector and ensure that it has wwnns, wwpns.
|
||||
"""
|
||||
self.validate_connector_has_setting(connector, 'wwpns')
|
||||
self.validate_connector_has_setting(connector, 'wwnns')
|
||||
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Initializes the connection and returns connection info.
|
||||
|
||||
@ -148,6 +155,7 @@ class SCFCDriver(storagecenter_common.SCCommonDriver,
|
||||
init_targ_map,
|
||||
'discard': True}}
|
||||
LOG.debug('Return FC data: %s', data)
|
||||
fczm_utils.add_fc_zone(data)
|
||||
return data
|
||||
LOG.error('Lun mapping returned null!')
|
||||
|
||||
@ -231,7 +239,6 @@ class SCFCDriver(storagecenter_common.SCCommonDriver,
|
||||
'data': {}}
|
||||
return info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, force=False, **kwargs):
|
||||
# Special case
|
||||
if connector is None:
|
||||
@ -293,6 +300,7 @@ class SCFCDriver(storagecenter_common.SCCommonDriver,
|
||||
if scserver and api.get_volume_count(scserver) == 0:
|
||||
info['data'] = {'target_wwn': targets,
|
||||
'initiator_target_map': init_targ_map}
|
||||
fczm_utils.remove_fc_zone(info)
|
||||
return info
|
||||
|
||||
except Exception:
|
||||
|
@ -122,7 +122,6 @@ class UnityDriver(driver.ManageableVD,
|
||||
"""Make sure volume is exported."""
|
||||
pass
|
||||
|
||||
@zm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Initializes the connection and returns connection info.
|
||||
|
||||
@ -168,12 +167,15 @@ class UnityDriver(driver.ManageableVD,
|
||||
}
|
||||
|
||||
"""
|
||||
return self.adapter.initialize_connection(volume, connector)
|
||||
conn_info = self.adapter.initialize_connection(volume, connector)
|
||||
zm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@zm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Disallow connection from connector."""
|
||||
return self.adapter.terminate_connection(volume, connector)
|
||||
conn_info = self.adapter.terminate_connection(volume, connector)
|
||||
zm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def get_volume_stats(self, refresh=False):
|
||||
"""Get volume stats.
|
||||
|
@ -198,7 +198,6 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
||||
"""
|
||||
pass
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Initializes the connection and returns connection info.
|
||||
|
||||
@ -239,7 +238,9 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
||||
device_info = self.common.initialize_connection(
|
||||
volume, connector)
|
||||
if device_info:
|
||||
return self.populate_data(device_info, volume, connector)
|
||||
conn_info = self.populate_data(device_info, volume, connector)
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
else:
|
||||
return {}
|
||||
|
||||
@ -268,7 +269,6 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
||||
|
||||
return data
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Disallow connection from connector.
|
||||
|
||||
@ -290,6 +290,7 @@ class VMAXFCDriver(san.SanDriver, driver.FibreChannelDriver):
|
||||
if zoning_mappings:
|
||||
self.common.terminate_connection(volume, connector)
|
||||
data = self._cleanup_zones(zoning_mappings)
|
||||
fczm_utils.remove_fc_zone(data)
|
||||
return data
|
||||
|
||||
def _get_zoning_mappings(self, volume, connector):
|
||||
|
@ -165,7 +165,6 @@ class VNXDriver(driver.ManageableVD,
|
||||
"""Make sure volume is exported."""
|
||||
pass
|
||||
|
||||
@zm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Initializes the connection and returns connection info.
|
||||
|
||||
@ -219,9 +218,9 @@ class VNXDriver(driver.ManageableVD,
|
||||
LOG.debug("Exit initialize_connection"
|
||||
" - Returning connection info: %(conn_info)s.",
|
||||
{'conn_info': conn_info})
|
||||
zm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@zm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Disallow connection from connector."""
|
||||
LOG.debug("Entering terminate_connection"
|
||||
@ -231,6 +230,7 @@ class VNXDriver(driver.ManageableVD,
|
||||
LOG.debug("Exit terminate_connection"
|
||||
" - Returning connection info: %(conn_info)s.",
|
||||
{'conn_info': conn_info})
|
||||
zm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def get_volume_stats(self, refresh=False):
|
||||
|
@ -1206,7 +1206,6 @@ class XtremIOFCDriver(XtremIOVolumeDriver,
|
||||
seq = range(len(uniq_luns) + 1)
|
||||
return min(set(seq) - uniq_luns)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
wwpns = self._get_initiator_names(connector)
|
||||
ig_name = self._get_ig_name(connector)
|
||||
@ -1240,14 +1239,15 @@ class XtremIOFCDriver(XtremIOVolumeDriver,
|
||||
for ig in igs:
|
||||
lunmap = self.create_lun_map(volume, ig, lun_num)
|
||||
lun_num = lunmap['lun']
|
||||
return {'driver_volume_type': 'fibre_channel',
|
||||
conn_info = {'driver_volume_type': 'fibre_channel',
|
||||
'data': {
|
||||
'target_discovered': False,
|
||||
'target_lun': lun_num,
|
||||
'target_wwn': self.get_targets(),
|
||||
'initiator_target_map': i_t_map}}
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
(super(XtremIOFCDriver, self)
|
||||
.terminate_connection(volume, connector, **kwargs))
|
||||
@ -1264,8 +1264,10 @@ class XtremIOFCDriver(XtremIOVolumeDriver,
|
||||
data = {'target_wwn': self.get_targets(),
|
||||
'initiator_target_map': i_t_map}
|
||||
|
||||
return {'driver_volume_type': 'fibre_channel',
|
||||
conn_info = {'driver_volume_type': 'fibre_channel',
|
||||
'data': data}
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def _get_initiator_names(self, connector):
|
||||
return [wwpn if ':' in wwpn else
|
||||
|
@ -83,7 +83,6 @@ class DotHillFCDriver(cinder.volume.driver.FibreChannelDriver):
|
||||
def delete_volume(self, volume):
|
||||
self.common.delete_volume(volume)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
self.common.client_login()
|
||||
try:
|
||||
@ -98,11 +97,11 @@ class DotHillFCDriver(cinder.volume.driver.FibreChannelDriver):
|
||||
data['initiator_target_map'] = init_targ_map
|
||||
info = {'driver_volume_type': 'fibre_channel',
|
||||
'data': data}
|
||||
fczm_utils.add_fc_zone(info)
|
||||
return info
|
||||
finally:
|
||||
self.common.client_logout()
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
info = {'driver_volume_type': 'fibre_channel', 'data': {}}
|
||||
try:
|
||||
@ -112,6 +111,7 @@ class DotHillFCDriver(cinder.volume.driver.FibreChannelDriver):
|
||||
ports, init_targ_map = self.get_init_targ_map(connector)
|
||||
info['data'] = {'target_wwn': ports,
|
||||
'initiator_target_map': init_targ_map}
|
||||
fczm_utils.remove_fc_zone(info)
|
||||
finally:
|
||||
return info
|
||||
|
||||
|
@ -146,7 +146,6 @@ class FJDXFCDriver(driver.FibreChannelDriver):
|
||||
"""Driver entry point to remove an export for a volume."""
|
||||
return
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Allow connection to connector and return connection info."""
|
||||
LOG.debug('initialize_connection, volume id: %(vid)s, '
|
||||
@ -163,9 +162,9 @@ class FJDXFCDriver(driver.FibreChannelDriver):
|
||||
info['data'] = data
|
||||
LOG.debug('initialize_connection, '
|
||||
'info: %s, exit method.', info)
|
||||
fczm_utils.add_fc_zone(info)
|
||||
return info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Disallow connection from connector."""
|
||||
wwpns = connector.get('wwpns') if connector else None
|
||||
@ -185,6 +184,7 @@ class FJDXFCDriver(driver.FibreChannelDriver):
|
||||
# No more volumes attached to the host
|
||||
init_tgt_map = self.common.build_fc_init_tgt_map(connector)
|
||||
info['data'] = {'initiator_target_map': init_tgt_map}
|
||||
fczm_utils.remove_fc_zone(info)
|
||||
|
||||
LOG.debug('terminate_connection, unmap: %(unmap)s, '
|
||||
'connection info: %(info)s, exit method',
|
||||
|
@ -123,7 +123,6 @@ class HPE3PARFCDriver(hpebasedriver.HPE3PARDriverBase):
|
||||
self.protocol = 'FC'
|
||||
|
||||
@utils.trace
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Assigns the volume to a server.
|
||||
|
||||
@ -200,12 +199,12 @@ class HPE3PARFCDriver(hpebasedriver.HPE3PARDriverBase):
|
||||
|
||||
encryption_key_id = volume.get('encryption_key_id', None)
|
||||
info['data']['encrypted'] = encryption_key_id is not None
|
||||
fczm_utils.add_fc_zone(info)
|
||||
return info
|
||||
finally:
|
||||
self._logout(common)
|
||||
|
||||
@utils.trace
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Driver entry point to unattach a volume from an instance."""
|
||||
common = self._login()
|
||||
@ -247,7 +246,7 @@ class HPE3PARFCDriver(hpebasedriver.HPE3PARDriverBase):
|
||||
|
||||
info['data'] = {'target_wwn': target_wwns,
|
||||
'initiator_target_map': init_targ_map}
|
||||
|
||||
fczm_utils.remove_fc_zone(info)
|
||||
return info
|
||||
|
||||
finally:
|
||||
|
@ -2113,7 +2113,6 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver):
|
||||
data['vendor_name'] = 'Huawei'
|
||||
return data
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
@coordination.synchronized('huawei-mapping-{connector[host]}')
|
||||
def initialize_connection(self, volume, connector):
|
||||
lun_id, lun_type = self.get_lun_id_and_type(volume)
|
||||
@ -2232,6 +2231,7 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver):
|
||||
fc_info['data']['target_lun'] = same_host_id
|
||||
hyperm.rmt_client.logout()
|
||||
|
||||
fczm_utils.add_fc_zone(fc_info)
|
||||
LOG.info("Return FC info is: %s.", fc_info)
|
||||
return fc_info
|
||||
|
||||
@ -2256,7 +2256,6 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver):
|
||||
|
||||
return same_host_id
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
@coordination.synchronized('huawei-mapping-{connector[host]}')
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Delete map between a volume and a host."""
|
||||
@ -2346,6 +2345,9 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver):
|
||||
LOG.info("terminate_connection, return data is: %s.",
|
||||
fc_info)
|
||||
|
||||
# This only does something if and only if the initiator_target_map
|
||||
# exists in fc_info
|
||||
fczm_utils.remove_fc_zone(fc_info)
|
||||
return fc_info
|
||||
|
||||
def _delete_zone_and_remove_fc_initiators(self, wwns, host_id):
|
||||
|
@ -259,7 +259,6 @@ class FlashSystemFCDriver(fscommon.FlashSystemDriver):
|
||||
|
||||
return {'driver_volume_type': type_str, 'data': properties}
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
@utils.synchronized('flashsystem-init-conn', external=True)
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Perform work so that an FC connection can be made.
|
||||
@ -316,9 +315,9 @@ class FlashSystemFCDriver(fscommon.FlashSystemDriver):
|
||||
'conn': connector,
|
||||
'prop': properties})
|
||||
|
||||
fczm_utils.add_fc_zone(properties)
|
||||
return properties
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
@utils.synchronized('flashsystem-term-conn', external=True)
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Cleanup after connection has been terminated.
|
||||
@ -353,6 +352,7 @@ class FlashSystemFCDriver(fscommon.FlashSystemDriver):
|
||||
self._build_initiator_target_map(
|
||||
connector['wwpns'], conn_wwpns))
|
||||
return_data['data'] = properties
|
||||
fczm_utils.remove_fc_zone(return_data)
|
||||
|
||||
LOG.debug(
|
||||
'leave: terminate_connection: volume %(vol)s with '
|
||||
|
@ -144,17 +144,19 @@ class IBMStorageDriver(san.SanDriver,
|
||||
|
||||
return self.proxy.remove_export(context, volume)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Map the created volume."""
|
||||
|
||||
return self.proxy.initialize_connection(volume, connector)
|
||||
conn_info = self.proxy.initialize_connection(volume, connector)
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Terminate a connection to a volume."""
|
||||
|
||||
return self.proxy.terminate_connection(volume, connector)
|
||||
conn_info = self.proxy.terminate_connection(volume, connector)
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def create_volume_from_snapshot(self, volume, snapshot):
|
||||
"""Create a volume from a snapshot."""
|
||||
|
@ -133,12 +133,13 @@ class StorwizeSVCFCDriver(storwize_common.StorwizeSVCCommonDriver):
|
||||
|
||||
return self.initialize_connection(volume, connector)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Perform necessary work to make a FC connection."""
|
||||
@coordination.synchronized('storwize-host-{system_id}-{host}')
|
||||
def _do_initialize_connection_locked(system_id, host):
|
||||
return self._do_initialize_connection(volume, connector)
|
||||
conn_info = self._do_initialize_connection(volume, connector)
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
return _do_initialize_connection_locked(self._state['system_id'],
|
||||
connector['host'])
|
||||
|
||||
@ -297,7 +298,6 @@ class StorwizeSVCFCDriver(storwize_common.StorwizeSVCCommonDriver):
|
||||
|
||||
return self.terminate_connection(volume, connector, **kwargs)
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Cleanup after an FC connection has been terminated."""
|
||||
# If a fake connector is generated by nova when the host
|
||||
@ -308,8 +308,10 @@ class StorwizeSVCFCDriver(storwize_common.StorwizeSVCCommonDriver):
|
||||
|
||||
@coordination.synchronized('storwize-host-{system_id}-{host}')
|
||||
def _do_terminate_connection_locked(system_id, host):
|
||||
return self._do_terminate_connection(volume, connector,
|
||||
conn_info = self._do_terminate_connection(volume, connector,
|
||||
**kwargs)
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
return _do_terminate_connection_locked(self._state['system_id'], host)
|
||||
|
||||
def _do_terminate_connection(self, volume, connector, **kwargs):
|
||||
|
@ -330,11 +330,13 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
|
||||
target_wwpns = list(self._get_online_fc_ports())
|
||||
target_wwpns, init_target_map = self._build_initiator_target_map(
|
||||
connector, target_wwpns)
|
||||
return dict(driver_volume_type='fibre_channel',
|
||||
conn_info = dict(driver_volume_type='fibre_channel',
|
||||
data=dict(target_discovered=False,
|
||||
target_wwn=target_wwpns,
|
||||
target_lun=lun,
|
||||
initiator_target_map=init_target_map))
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def _get_iscsi_network_space(self, netspace_name):
|
||||
netspace = self._system.network_spaces.safe_get(
|
||||
@ -417,7 +419,6 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
|
||||
ports = [iqn.IQN(connector['initiator'])]
|
||||
return ports
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
@infinisdk_to_cinder_exceptions
|
||||
@coordination.synchronized('infinidat-{self.management_address}-lock')
|
||||
def initialize_connection(self, volume, connector):
|
||||
@ -427,7 +428,6 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
|
||||
else:
|
||||
return self._initialize_connection_iscsi(volume, connector)
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
@infinisdk_to_cinder_exceptions
|
||||
@coordination.synchronized('infinidat-{self.management_address}-lock')
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
@ -462,8 +462,11 @@ class InfiniboxVolumeDriver(san.SanISCSIDriver):
|
||||
target_wwpns))
|
||||
result_data = dict(target_wwn=target_wwpns,
|
||||
initiator_target_map=target_map)
|
||||
return dict(driver_volume_type=volume_type,
|
||||
conn_info = dict(driver_volume_type=volume_type,
|
||||
data=result_data)
|
||||
if self._protocol == 'FC':
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@infinisdk_to_cinder_exceptions
|
||||
def get_volume_stats(self, refresh=False):
|
||||
|
@ -58,7 +58,6 @@ class InStorageMCSFCDriver(instorage_common.InStorageMCSCommonDriver,
|
||||
self.protocol = 'FC'
|
||||
|
||||
@cinder_utils.trace
|
||||
@fczm_utils.add_fc_zone
|
||||
@coordination.synchronized('instorage-host'
|
||||
'{self._state[system_id]}'
|
||||
'{connector[host]}')
|
||||
@ -155,9 +154,10 @@ class InStorageMCSFCDriver(instorage_common.InStorageMCSCommonDriver,
|
||||
'%(conn)s.\n', {'vol': volume,
|
||||
'conn': connector})
|
||||
|
||||
return {'driver_volume_type': 'fibre_channel', 'data': properties, }
|
||||
info = {'driver_volume_type': 'fibre_channel', 'data': properties, }
|
||||
fczm_utils.add_fc_zone(info)
|
||||
return info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Cleanup after an FC connection has been terminated."""
|
||||
# If a fake connector is generated by nova when the host
|
||||
@ -227,6 +227,8 @@ class InStorageMCSFCDriver(instorage_common.InStorageMCSCommonDriver,
|
||||
(connector['wwpns'],
|
||||
target_wwpns))
|
||||
info['data'] = {'initiator_target_map': init_targ_map}
|
||||
# Only remove the zone if it's the last volume removed
|
||||
fczm_utils.remove_fc_zone(info)
|
||||
# No volume mapped to the host, delete host from array
|
||||
self._assistant.delete_host(host_name)
|
||||
|
||||
|
@ -49,7 +49,6 @@ class KaminarioFCDriver(common.KaminarioCinderDriver):
|
||||
self._protocol = 'FC'
|
||||
self.lookup_service = fczm_utils.create_lookup_service()
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
@utils.trace
|
||||
@coordination.synchronized('{self.k2_lock_name}')
|
||||
def initialize_connection(self, volume, connector):
|
||||
@ -76,13 +75,14 @@ class KaminarioFCDriver(common.KaminarioCinderDriver):
|
||||
if temp_client:
|
||||
self.client = temp_client
|
||||
# Return target volume information.
|
||||
return {'driver_volume_type': 'fibre_channel',
|
||||
conn_info = {'driver_volume_type': 'fibre_channel',
|
||||
'data': {"target_discovered": True,
|
||||
"target_lun": lun,
|
||||
"target_wwn": target_wwpns,
|
||||
"initiator_target_map": init_target_map}}
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
@utils.trace
|
||||
@coordination.synchronized('{self.k2_lock_name}')
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
@ -105,6 +105,8 @@ class KaminarioFCDriver(common.KaminarioCinderDriver):
|
||||
connector, target_wwpns)
|
||||
properties["data"] = {"target_wwn": target_wwpns,
|
||||
"initiator_target_map": init_target_map}
|
||||
fczm_utils.remove_fc_zone(properties)
|
||||
|
||||
# To support replication failback
|
||||
if temp_client:
|
||||
self.client = temp_client
|
||||
|
@ -80,13 +80,15 @@ class MStorageFCDriver(volume_helper.MStorageDSVDriver,
|
||||
def get_volume_stats(self, refresh=False):
|
||||
return self.fc_get_volume_stats(refresh)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
return self.fc_initialize_connection(volume, connector)
|
||||
conn_info = self.fc_initialize_connection(volume, connector)
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
return self.fc_terminate_connection(volume, connector)
|
||||
conn_info = self.fc_terminate_connection(volume, connector)
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def create_export_snapshot(self, context, snapshot, connector):
|
||||
return self.fc_do_export_snapshot(context, snapshot, connector)
|
||||
|
@ -94,14 +94,16 @@ class NetAppCmodeFibreChannelDriver(driver.BaseVD,
|
||||
def unmanage(self, volume):
|
||||
return self.library.unmanage(volume)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
return self.library.initialize_connection_fc(volume, connector)
|
||||
conn_info = self.library.initialize_connection_fc(volume, connector)
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
return self.library.terminate_connection_fc(volume, connector,
|
||||
conn_info = self.library.terminate_connection_fc(volume, connector,
|
||||
**kwargs)
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def get_pool(self, volume):
|
||||
return self.library.get_pool(volume)
|
||||
|
@ -88,14 +88,16 @@ class NetAppEseriesFibreChannelDriver(driver.BaseVD,
|
||||
def unmanage(self, volume):
|
||||
return self.library.unmanage(volume)
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector, **kwargs):
|
||||
return self.library.initialize_connection_fc(volume, connector)
|
||||
conn_info = self.library.initialize_connection_fc(volume, connector)
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
return self.library.terminate_connection_fc(volume, connector,
|
||||
conn_info = self.library.terminate_connection_fc(volume, connector,
|
||||
**kwargs)
|
||||
fczm_utils.remove_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
def get_pool(self, volume):
|
||||
return self.library.get_pool(volume)
|
||||
|
@ -860,7 +860,6 @@ class NimbleFCDriver(NimbleBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
|
||||
return init_targ_map
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Driver entry point to attach a volume to an instance."""
|
||||
LOG.info('Entering initialize_connection volume=%(vol)s'
|
||||
@ -899,10 +898,9 @@ class NimbleFCDriver(NimbleBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
|
||||
LOG.info("Return FC data for zone addition: %(data)s.",
|
||||
{'data': data})
|
||||
|
||||
fczm_utils.add_fc_zone(data)
|
||||
return data
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Driver entry point to unattach a volume from an instance."""
|
||||
LOG.info('Entering terminate_connection volume=%(vol)s'
|
||||
@ -934,6 +932,10 @@ class NimbleFCDriver(NimbleBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
data = {'driver_volume_type': 'fibre_channel',
|
||||
'data': {'target_wwn': target_wwns}}
|
||||
|
||||
# FIXME: need to optionally add the initiator_target_map here when
|
||||
# there are no more volumes exported to the initiator / target pair
|
||||
# otherwise the zone will never get removed.
|
||||
fczm_utils.remove_fc_zone(data)
|
||||
return data
|
||||
|
||||
def get_wwpns_from_array(self, array_name):
|
||||
|
@ -218,7 +218,6 @@ class DPLFCDriver(dplcommon.DPLCOMMONDriver,
|
||||
|
||||
return init_targ_map
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Allow connection to connector and return connection info."""
|
||||
"""
|
||||
@ -336,10 +335,11 @@ class DPLFCDriver(dplcommon.DPLCOMMONDriver,
|
||||
LOG.info('Connect initialization info: '
|
||||
'{driver_volume_type: fibre_channel, '
|
||||
'data: %(properties)s', {'properties': properties})
|
||||
return {'driver_volume_type': 'fibre_channel',
|
||||
conn_info = {'driver_volume_type': 'fibre_channel',
|
||||
'data': properties}
|
||||
fczm_utils.add_fc_zone(conn_info)
|
||||
return conn_info
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Disallow connection from connector."""
|
||||
"""
|
||||
@ -397,6 +397,7 @@ class DPLFCDriver(dplcommon.DPLCOMMONDriver,
|
||||
lsTargets)
|
||||
info['data'] = {'target_wwn': lsTargets,
|
||||
'initiator_target_map': init_targ_map}
|
||||
fczm_utils.remove_fc_zone(info)
|
||||
|
||||
return info
|
||||
|
||||
|
@ -1932,7 +1932,6 @@ class PureFCDriver(PureBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
ports = array.list_ports()
|
||||
return [port["wwn"] for port in ports if port["wwn"]]
|
||||
|
||||
@fczm_utils.add_fc_zone
|
||||
@pure_driver_debug_trace
|
||||
def initialize_connection(self, volume, connector):
|
||||
"""Allow connection to connector and return connection info."""
|
||||
@ -1952,6 +1951,7 @@ class PureFCDriver(PureBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
}
|
||||
}
|
||||
|
||||
fczm_utils.add_fc_zone(properties)
|
||||
return properties
|
||||
|
||||
@utils.retry(exception.PureRetryableException,
|
||||
@ -2009,7 +2009,6 @@ class PureFCDriver(PureBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
|
||||
return init_targ_map
|
||||
|
||||
@fczm_utils.remove_fc_zone
|
||||
@pure_driver_debug_trace
|
||||
def terminate_connection(self, volume, connector, **kwargs):
|
||||
"""Terminate connection."""
|
||||
@ -2027,4 +2026,5 @@ class PureFCDriver(PureBaseVolumeDriver, driver.FibreChannelDriver):
|
||||
properties["data"] = {"target_wwn": target_wwns,
|
||||
"initiator_target_map": init_targ_map}
|
||||
|
||||
fczm_utils.remove_fc_zone(properties)
|
||||
return properties
|
||||
|
@ -73,49 +73,27 @@ def get_formatted_wwn(wwn_str):
|
||||
for i in range(0, len(wwn_str), 2)])).lower()
|
||||
|
||||
|
||||
def add_fc_zone(initialize_connection):
|
||||
"""Decorator to add a FC Zone."""
|
||||
|
||||
def decorator(self, *args, **kwargs):
|
||||
conn_info = initialize_connection(self, *args, **kwargs)
|
||||
if not conn_info:
|
||||
LOG.warning("Driver didn't return connection info, "
|
||||
"can't add zone.")
|
||||
return None
|
||||
|
||||
vol_type = conn_info.get('driver_volume_type', None)
|
||||
def add_fc_zone(connection_info):
|
||||
"""Utility function to add a FC Zone."""
|
||||
if connection_info:
|
||||
vol_type = connection_info.get('driver_volume_type', None)
|
||||
if vol_type == 'fibre_channel':
|
||||
if 'initiator_target_map' in conn_info['data']:
|
||||
if 'initiator_target_map' in connection_info['data']:
|
||||
zm = create_zone_manager()
|
||||
if zm:
|
||||
LOG.debug("add_fc_zone connection info: %(conninfo)s.",
|
||||
{'conninfo': conn_info})
|
||||
zm.add_connection(conn_info)
|
||||
|
||||
return conn_info
|
||||
|
||||
return decorator
|
||||
{'conninfo': connection_info})
|
||||
zm.add_connection(connection_info)
|
||||
|
||||
|
||||
def remove_fc_zone(terminate_connection):
|
||||
"""Decorator for FC drivers to remove zone."""
|
||||
|
||||
def decorator(self, *args, **kwargs):
|
||||
conn_info = terminate_connection(self, *args, **kwargs)
|
||||
if not conn_info:
|
||||
LOG.warning("Driver didn't return connection info from "
|
||||
"terminate_connection call.")
|
||||
return None
|
||||
|
||||
vol_type = conn_info.get('driver_volume_type', None)
|
||||
def remove_fc_zone(connection_info):
|
||||
"""Utility function for FC drivers to remove zone."""
|
||||
if connection_info:
|
||||
vol_type = connection_info.get('driver_volume_type', None)
|
||||
if vol_type == 'fibre_channel':
|
||||
if 'initiator_target_map' in conn_info['data']:
|
||||
if 'initiator_target_map' in connection_info['data']:
|
||||
zm = create_zone_manager()
|
||||
if zm:
|
||||
LOG.debug("remove_fc_zone connection info: %(conninfo)s.",
|
||||
{'conninfo': conn_info})
|
||||
zm.delete_connection(conn_info)
|
||||
|
||||
return conn_info
|
||||
|
||||
return decorator
|
||||
{'conninfo': connection_info})
|
||||
zm.delete_connection(connection_info)
|
||||
|
Loading…
Reference in New Issue
Block a user