add a getter for connector mapping

Nova needs to check the architecture drivers like
"_connector_mapping_linux". To avoid accessing
private attribute, this adds a new function
"get_connector_mapping"

Change-Id: I66f37aace797eca54356b4aaf1bc1b655567c1e2
This commit is contained in:
Patricia Domingues 2018-03-30 13:26:21 -03:00
parent 1c43a21cde
commit 10be2fe948
2 changed files with 45 additions and 15 deletions

View File

@ -230,6 +230,31 @@ def get_connector_properties(root_helper, my_ip, multipath, enforce_multipath,
return props
def get_connector_mapping(arch=None):
"""Get connector mapping based on platform.
This is used by Nova to get the right connector information.
:param arch: The architecture being requested.
"""
# We do this instead of assigning it in the definition
# to help mocking for unit tests
if arch is None:
arch = platform.machine()
# Set the correct mapping for imports
if sys.platform == 'win32':
return _connector_mapping_windows
elif arch in (initiator.S390, initiator.S390X):
return _connector_mapping_linux_s390x
elif arch in (initiator.PPC64, initiator.PPC64LE):
return _connector_mapping_linux_ppc64
else:
return _connector_mapping_linux
# TODO(walter-boring) We have to keep this class defined here
# so we don't break backwards compatibility
class InitiatorConnector(object):
@ -242,21 +267,7 @@ class InitiatorConnector(object):
*args, **kwargs):
"""Build a Connector object based upon protocol and architecture."""
# We do this instead of assigning it in the definition
# to help mocking for unit tests
if arch is None:
arch = platform.machine()
# Set the correct mapping for imports
if sys.platform == 'win32':
_mapping = _connector_mapping_windows
elif arch in (initiator.S390, initiator.S390X):
_mapping = _connector_mapping_linux_s390x
elif arch in (initiator.PPC64, initiator.PPC64LE):
_mapping = _connector_mapping_linux_ppc64
else:
_mapping = _connector_mapping_linux
_mapping = get_connector_mapping(arch)
LOG.debug("Factory for %(protocol)s on %(arch)s",
{'protocol': protocol, 'arch': arch})

View File

@ -178,6 +178,25 @@ class ConnectorTestCase(test_base.TestCase):
'sudo', multipath=multipath,
enforce_multipath=enforce_multipath)
@mock.patch('sys.platform', 'win32')
def test_get_connector_mapping_win32(self):
mapping_win32 = connector.get_connector_mapping()
self.assertTrue('ISCSI' in mapping_win32)
self.assertFalse('RBD' in mapping_win32)
self.assertFalse('STORPOOL' in mapping_win32)
@mock.patch('os_brick.initiator.connector.platform.machine')
def test_get_connector_mapping(self, mock_platform_machine):
mock_platform_machine.return_value = 'x86_64'
mapping_x86 = connector.get_connector_mapping()
mock_platform_machine.return_value = 'ppc64le'
mapping_ppc = connector.get_connector_mapping()
self.assertNotEqual(mapping_x86, mapping_ppc)
mock_platform_machine.return_value = 's390x'
mapping_s390 = connector.get_connector_mapping()
self.assertNotEqual(mapping_x86, mapping_s390)
self.assertNotEqual(mapping_ppc, mapping_s390)
def test_factory(self):
obj = connector.InitiatorConnector.factory('iscsi', None)
self.assertEqual("ISCSIConnector", obj.__class__.__name__)