diff --git a/nova/network/security_group/openstack_driver.py b/nova/network/security_group/openstack_driver.py index 096ffa74e57c..d52a195414a1 100644 --- a/nova/network/security_group/openstack_driver.py +++ b/nova/network/security_group/openstack_driver.py @@ -21,13 +21,17 @@ import nova.network NOVA_DRIVER = ('nova.compute.api.SecurityGroupAPI') NEUTRON_DRIVER = ('nova.network.security_group.neutron_driver.' 'SecurityGroupAPI') +DRIVER_CACHE = None # singleton of the driver once loaded def get_openstack_security_group_driver(): - if is_neutron_security_groups(): - return importutils.import_object(NEUTRON_DRIVER) - else: - return importutils.import_object(NOVA_DRIVER) + global DRIVER_CACHE + if DRIVER_CACHE is None: + if is_neutron_security_groups(): + DRIVER_CACHE = importutils.import_object(NEUTRON_DRIVER) + else: + DRIVER_CACHE = importutils.import_object(NOVA_DRIVER) + return DRIVER_CACHE def is_neutron_security_groups(): diff --git a/nova/test.py b/nova/test.py index 32ec4e36ee44..b9433b42acee 100644 --- a/nova/test.py +++ b/nova/test.py @@ -296,7 +296,7 @@ class TestCase(testtools.TestCase): self.useFixture(nova_fixtures.PoisonFunctions()) - openstack_driver.DRIVER_CACHE = {} + openstack_driver.DRIVER_CACHE = None self.useFixture(nova_fixtures.ForbidNewLegacyNotificationFixture()) diff --git a/nova/tests/unit/network/test_config.py b/nova/tests/unit/network/test_config.py index d3077d31c653..c94957e9dfb4 100644 --- a/nova/tests/unit/network/test_config.py +++ b/nova/tests/unit/network/test_config.py @@ -12,6 +12,8 @@ # License for the specific language governing permissions and limitations # under the License. +import mock + import nova.network import nova.network.security_group.neutron_driver import nova.network.security_group.openstack_driver as sgapi @@ -55,3 +57,11 @@ class SecurityGroupAPIConfigTest(nova.test.NoDBTestCase): self.assertIsInstance( driver, nova.compute.api.SecurityGroupAPI) + + @mock.patch('oslo_utils.importutils.import_object') + def test_caches(self, mock_import): + self.flags(use_neutron=True) + sgapi.DRIVER_CACHE = None + for _ in range(2): + self.assertIsNotNone(sgapi.get_openstack_security_group_driver()) + mock_import.assert_called_once_with(sgapi.NEUTRON_DRIVER)