diff --git a/tobiko/__init__.py b/tobiko/__init__.py index 58dfb1178..2800ee881 100644 --- a/tobiko/__init__.py +++ b/tobiko/__init__.py @@ -174,3 +174,4 @@ load_yaml = _yaml.load_yaml from tobiko import config # noqa config.init_config() +LOCK_DIR = os.path.expanduser(config.CONF.tobiko.common.lock_dir) diff --git a/tobiko/openstack/stacks/__init__.py b/tobiko/openstack/stacks/__init__.py index 20b850f15..2f5f08dad 100644 --- a/tobiko/openstack/stacks/__init__.py +++ b/tobiko/openstack/stacks/__init__.py @@ -54,6 +54,7 @@ L3haDifferentHostServerStackFixture = _l3ha.L3haDifferentHostServerStackFixture L3haSameHostServerStackFixture = _l3ha.L3haSameHostServerStackFixture FloatingIpStackFixture = _neutron.FloatingIpStackFixture +NetworkBaseStackFixture = _neutron.NetworkBaseStackFixture NetworkStackFixture = _neutron.NetworkStackFixture NetworkWithNetMtuWriteStackFixture = ( _neutron.NetworkWithNetMtuWriteStackFixture) diff --git a/tobiko/openstack/stacks/_cirros.py b/tobiko/openstack/stacks/_cirros.py index c3f312238..4a98150ec 100644 --- a/tobiko/openstack/stacks/_cirros.py +++ b/tobiko/openstack/stacks/_cirros.py @@ -14,7 +14,6 @@ from __future__ import absolute_import import io -import os import typing from oslo_concurrency import lockutils @@ -32,7 +31,6 @@ import tobiko.tripleo from tobiko.openstack.stacks import _hot CONF = config.CONF -LOCK_DIR = os.path.expanduser(CONF.tobiko.common.lock_dir) CIRROS_IMAGE_VERSION = '0.5.2' @@ -58,7 +56,7 @@ class CirrosImageFixture(glance.URLGlanceImageFixture): 'pubkeys': ['rsa-sha2-256', 'rsa-sha2-512']} @lockutils.synchronized( - 'cirros_image_setup_fixture', external=True, lock_path=LOCK_DIR) + 'cirros_image_setup_fixture', external=True, lock_path=tobiko.LOCK_DIR) def setup_fixture(self): super(CirrosImageFixture, self).setup_fixture() diff --git a/tobiko/openstack/stacks/_l3ha.py b/tobiko/openstack/stacks/_l3ha.py index 853c82933..e5ed1a859 100644 --- a/tobiko/openstack/stacks/_l3ha.py +++ b/tobiko/openstack/stacks/_l3ha.py @@ -13,6 +13,8 @@ # under the License. from __future__ import absolute_import +from oslo_concurrency import lockutils + import tobiko from tobiko.openstack import neutron from tobiko.openstack.stacks import _cirros @@ -26,9 +28,14 @@ class L3haRouterStackFixture(_neutron.RouterStackFixture): @neutron.skip_if_missing_networking_extensions('l3-ha') -class L3haNetworkStackFixture(_neutron.NetworkStackFixture): +class L3haNetworkStackFixture(_neutron.NetworkBaseStackFixture): gateway_stack = tobiko.required_fixture(L3haRouterStackFixture) + @lockutils.synchronized( + 'create_l3ha_network_stack', external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() + @neutron.skip_if_missing_networking_extensions('l3-ha') class L3haServerStackFixture(_cirros.CirrosServerStackFixture): diff --git a/tobiko/openstack/stacks/_neutron.py b/tobiko/openstack/stacks/_neutron.py index 109debe3a..56ecb3aa7 100644 --- a/tobiko/openstack/stacks/_neutron.py +++ b/tobiko/openstack/stacks/_neutron.py @@ -16,7 +16,6 @@ from __future__ import absolute_import import json -import os import typing import netaddr @@ -35,7 +34,6 @@ from tobiko.shell import ssh CONF = config.CONF LOG = log.getLogger(__name__) -LOCK_DIR = os.path.expanduser(CONF.tobiko.common.lock_dir) class ExternalNetworkStackFixture(heat.HeatStackFixture): @@ -334,7 +332,7 @@ class SubnetPoolFixture(tobiko.SharedFixture): tobiko.addme_to_shared_resource(__name__, self.name) @lockutils.synchronized( - 'create_subnet_pool', external=True, lock_path=LOCK_DIR) + 'create_subnet_pool', external=True, lock_path=tobiko.LOCK_DIR) def try_create_subnet_pool(self): if not self.subnet_pool: self._subnet_pool = neutron.create_subnet_pool( @@ -382,7 +380,7 @@ class SubnetPoolIPv6Fixture(SubnetPoolFixture): @neutron.skip_if_missing_networking_extensions('port-security') -class NetworkStackFixture(heat.HeatStackFixture): +class NetworkBaseStackFixture(heat.HeatStackFixture): """Heat stack for creating internal network with a router to external""" subnet_pools_ipv4_stack = (tobiko.required_fixture(SubnetPoolFixture) if bool(CONF.tobiko.neutron.ipv4_cidr) @@ -576,13 +574,31 @@ class NetworkStackFixture(heat.HeatStackFixture): predicate=fixture.is_router_distributed) -class NetworkNoFipStackFixture(NetworkStackFixture): +class NetworkStackFixture(NetworkBaseStackFixture): + @lockutils.synchronized( + 'create_network_stack', external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() + + +class NetworkNoFipStackFixture(NetworkBaseStackFixture): """Extra Network Stack where VMs will not have FIPs""" gateway_stack = tobiko.required_fixture(RouterNoSnatStackFixture) + @lockutils.synchronized( + 'create_network_nofip_stack', external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() + @neutron.skip_if_missing_networking_extensions('net-mtu-writable') -class NetworkWithNetMtuWriteStackFixture(NetworkStackFixture): +class NetworkWithNetMtuWriteStackFixture(NetworkBaseStackFixture): + + @lockutils.synchronized( + 'create_network_withnetmtuwrite_stack', + external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() @property def custom_mtu_size(self): @@ -661,7 +677,7 @@ class StatelessSecurityGroupFixture(tobiko.SharedFixture): tobiko.addme_to_shared_resource(__name__, self.name) @lockutils.synchronized( - 'create_security_group', external=True, lock_path=LOCK_DIR) + 'create_security_group', external=True, lock_path=tobiko.LOCK_DIR) def try_create_security_group(self): if not self.security_group: self._security_group = neutron.create_security_group( diff --git a/tobiko/openstack/stacks/_qos.py b/tobiko/openstack/stacks/_qos.py index 642d77ae4..b0deb53b6 100644 --- a/tobiko/openstack/stacks/_qos.py +++ b/tobiko/openstack/stacks/_qos.py @@ -15,6 +15,8 @@ # under the License. from __future__ import absolute_import +from oslo_concurrency import lockutils + import tobiko from tobiko import config from tobiko.openstack import heat @@ -44,7 +46,7 @@ class QosPolicyStackFixture(heat.HeatStackFixture): @neutron.skip_if_missing_networking_extensions('qos') -class QosNetworkStackFixture(_neutron.NetworkStackFixture): +class QosNetworkStackFixture(_neutron.NetworkBaseStackFixture): #: stack with the qos policy for the network qos_stack = tobiko.required_fixture(QosPolicyStackFixture) @@ -56,6 +58,11 @@ class QosNetworkStackFixture(_neutron.NetworkStackFixture): value_specs = super().network_value_specs return dict(value_specs, qos_policy_id=self.qos_stack.qos_policy_id) + @lockutils.synchronized( + 'create_qos_network_stack', external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() + class QosServerStackFixture(_ubuntu.UbuntuServerStackFixture): #: stack with the network with a qos policy diff --git a/tobiko/openstack/stacks/_ubuntu.py b/tobiko/openstack/stacks/_ubuntu.py index b741ebc1a..3f765a3d6 100644 --- a/tobiko/openstack/stacks/_ubuntu.py +++ b/tobiko/openstack/stacks/_ubuntu.py @@ -13,7 +13,6 @@ # under the License. from __future__ import absolute_import -import os import typing from oslo_concurrency import lockutils @@ -28,7 +27,6 @@ from tobiko.shell import sh CONF = config.CONF -LOCK_DIR = os.path.expanduser(CONF.tobiko.common.lock_dir) class UbuntuMinimalImageFixture(glance.FileGlanceImageFixture): @@ -43,7 +41,8 @@ class UbuntuMinimalImageFixture(glance.FileGlanceImageFixture): is_reachable_timeout = CONF.tobiko.nova.ubuntu_is_reachable_timeout @lockutils.synchronized( - 'ubuntu_minimal_setup_fixture', external=True, lock_path=LOCK_DIR) + 'ubuntu_minimal_setup_fixture', + external=True, lock_path=tobiko.LOCK_DIR) def setup_fixture(self): super(UbuntuMinimalImageFixture, self).setup_fixture() diff --git a/tobiko/openstack/stacks/_vlan.py b/tobiko/openstack/stacks/_vlan.py index 2efad245f..4a6e722dc 100644 --- a/tobiko/openstack/stacks/_vlan.py +++ b/tobiko/openstack/stacks/_vlan.py @@ -19,6 +19,7 @@ import abc import typing import netaddr +from oslo_concurrency import lockutils import tobiko from tobiko import config @@ -33,8 +34,11 @@ from tobiko.openstack.stacks import _nova CONF = config.CONF -class VlanNetworkStackFixture(_neutron.NetworkStackFixture): - pass +class VlanNetworkStackFixture(_neutron.NetworkBaseStackFixture): + @lockutils.synchronized( + 'create_vlan_network_stack', external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() class VlanProxyServerStackFixture(_cirros.CirrosServerStackFixture): diff --git a/tobiko/tests/functional/openstack/stacks/test_neutron.py b/tobiko/tests/functional/openstack/stacks/test_neutron.py index 499ff74e7..34a186f1e 100644 --- a/tobiko/tests/functional/openstack/stacks/test_neutron.py +++ b/tobiko/tests/functional/openstack/stacks/test_neutron.py @@ -15,6 +15,7 @@ # under the License. from __future__ import absolute_import +from oslo_concurrency import lockutils from oslo_log import log import testtools @@ -150,8 +151,12 @@ class RouterInterfaceTestRouter(stacks.RouterStackFixture): pass -class RouterInterfaceTestNetwork(stacks.NetworkStackFixture): - pass +class RouterInterfaceTestNetwork(stacks.NetworkBaseStackFixture): + @lockutils.synchronized( + 'create_router_interface_network_stack', + external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() @keystone.skip_unless_has_keystone_credentials() diff --git a/tobiko/tests/scenario/neutron/test_router.py b/tobiko/tests/scenario/neutron/test_router.py index 2a7847b1d..c52c45d4c 100644 --- a/tobiko/tests/scenario/neutron/test_router.py +++ b/tobiko/tests/scenario/neutron/test_router.py @@ -20,6 +20,7 @@ import re import typing import pytest +from oslo_concurrency import lockutils from oslo_log import log import testtools @@ -170,7 +171,7 @@ class RouterNamespaceTestBase: return self.network_stack.gateway_stack @property - def network_stack(self) -> stacks.NetworkStackFixture: + def network_stack(self) -> stacks.NetworkBaseStackFixture: return self.server_stack.network_stack @property @@ -206,10 +207,15 @@ class DvrRouterStackFixture(stacks.RouterStackFixture): distributed = True -class DvrNetworkStackFixture(stacks.NetworkStackFixture): +class DvrNetworkStackFixture(stacks.NetworkBaseStackFixture): gateway_stack = tobiko.required_fixture(DvrRouterStackFixture, setup=False) + @lockutils.synchronized( + 'create_dvr_network_stack', external=True, lock_path=tobiko.LOCK_DIR) + def setup_stack(self): + super().setup_stack() + class DvrServerStackFixture(stacks.CirrosServerStackFixture): network_stack = tobiko.required_fixture(DvrNetworkStackFixture,