From 10be2fe948bcb69e4a5d9331307429a744d4b555 Mon Sep 17 00:00:00 2001 From: Patricia Domingues Date: Fri, 30 Mar 2018 13:26:21 -0300 Subject: [PATCH] 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 --- os_brick/initiator/connector.py | 41 ++++++++++++++-------- os_brick/tests/initiator/test_connector.py | 19 ++++++++++ 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/os_brick/initiator/connector.py b/os_brick/initiator/connector.py index f444b2f23..58fe3444c 100644 --- a/os_brick/initiator/connector.py +++ b/os_brick/initiator/connector.py @@ -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}) diff --git a/os_brick/tests/initiator/test_connector.py b/os_brick/tests/initiator/test_connector.py index 61699c88e..8ef29b574 100644 --- a/os_brick/tests/initiator/test_connector.py +++ b/os_brick/tests/initiator/test_connector.py @@ -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__)