Merge "Fix sporadic failure for test_bgpvpn_migration" into mcp/yoga
diff --git a/neutron_tempest_plugin/api/test_subnetpool_prefix_ops.py b/neutron_tempest_plugin/api/test_subnetpool_prefix_ops.py
index 2cd4e1f..49cce5b 100644
--- a/neutron_tempest_plugin/api/test_subnetpool_prefix_ops.py
+++ b/neutron_tempest_plugin/api/test_subnetpool_prefix_ops.py
@@ -23,7 +23,7 @@
SUBNET_NAME = 'smoke-subnet'
-class SubnetPoolPrefixOpsTestMixin(test_subnetpools.SubnetPoolsTestBase):
+class SubnetPoolPrefixOpsTestMixin(object):
def _compare_prefix_lists(self, list_expected, list_observed):
expected_set = netaddr.IPSet(iterable=list_expected)
@@ -65,7 +65,8 @@
resp['prefixes'])
-class SubnetPoolPrefixOpsIpv4Test(SubnetPoolPrefixOpsTestMixin):
+class SubnetPoolPrefixOpsIpv4Test(test_subnetpools.SubnetPoolsTestBase,
+ SubnetPoolPrefixOpsTestMixin):
prefixes = ['192.168.1.0/24', '10.10.10.0/24']
prefixes_to_add = ['192.168.2.0/24']
@@ -80,7 +81,8 @@
'min_prefixlen': cls.min_prefixlen}
-class SubnetPoolPrefixOpsIpv6Test(SubnetPoolPrefixOpsTestMixin):
+class SubnetPoolPrefixOpsIpv6Test(test_subnetpools.SubnetPoolsTestBase,
+ SubnetPoolPrefixOpsTestMixin):
prefixes = ['2001:db8:1234::/48', '2001:db8:1235::/48']
prefixes_to_add = ['2001:db8:4321::/48']
diff --git a/neutron_tempest_plugin/vpnaas/api/base_vpnaas.py b/neutron_tempest_plugin/vpnaas/api/base_vpnaas.py
index 0e54380..3ccf48b 100644
--- a/neutron_tempest_plugin/vpnaas/api/base_vpnaas.py
+++ b/neutron_tempest_plugin/vpnaas/api/base_vpnaas.py
@@ -14,7 +14,10 @@
# License for the specific language governing permissions and limitations
# under the License.
+import time
+
from tempest.lib.common.utils import data_utils
+from tempest.lib import exceptions as lib_exc
from neutron_tempest_plugin.api import base
from neutron_tempest_plugin import config
@@ -138,6 +141,31 @@
return ipsec_site_connection
@classmethod
+ def wait_ipsec_site_connection_status(cls, site_id, status, timeout=None,
+ interval=None):
+ start_time = int(time.time())
+ timeout = timeout or cls.client.build_timeout
+ interval = interval or cls.client.build_interval
+ current_status = ""
+ while True:
+ if current_status.lower() == status.lower():
+ return
+
+ timed_out = int(time.time()) - start_time >= timeout
+ if timed_out:
+ message = ('IPSec site connection %(site_id)s failed to reach '
+ 'desired status %(desired_status)s, current state '
+ '%(current_status)s in %(timeout)d' %
+ {"site_id": site_id,
+ "desired_status": status,
+ "current_status": current_status,
+ "timeout": timeout})
+ raise lib_exc.TimeoutException(message)
+ current_status = cls.client.show_ipsec_site_connection(
+ site_id)['ipsec_site_connection']['status']
+ time.sleep(interval)
+
+ @classmethod
def create_endpoint_group(cls, name, type, endpoints):
"""Wrapper utility that returns a test ipsec policy."""
body = cls.client.create_endpoint_group(
diff --git a/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py b/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py
index 92eed9e..41cd72f 100644
--- a/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py
+++ b/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py
@@ -100,6 +100,13 @@
cls.extra_subnet_attributes['ipv6_address_mode'] = 'slaac'
cls.extra_subnet_attributes['ipv6_ra_mode'] = 'slaac'
+ left_v4_cidr = netaddr.IPNetwork('10.20.0.0/24')
+ left_v6_cidr = netaddr.IPNetwork('2001:db8:0:2::/64')
+ cls.left_cidr = left_v6_cidr if cls.inner_ipv6 else left_v4_cidr
+ right_v4_cidr = netaddr.IPNetwork('10.10.0.0/24')
+ right_v6_cidr = netaddr.IPNetwork('2001:db8:0:1::/64')
+ cls.right_cidr = right_v6_cidr if cls.inner_ipv6 else right_v4_cidr
+
# LEFT
cls.router = cls.create_router(
data_utils.rand_name('left-router'),
@@ -107,14 +114,22 @@
external_network_id=CONF.network.public_network_id)
cls.network = cls.create_network(network_name='left-network')
ip_version = 6 if cls.inner_ipv6 else 4
- v4_cidr = netaddr.IPNetwork('10.20.0.0/24')
- v6_cidr = netaddr.IPNetwork('2001:db8:0:2::/64')
- cidr = v6_cidr if cls.inner_ipv6 else v4_cidr
- cls.subnet = cls.create_subnet(
- cls.network, ip_version=ip_version, cidr=cidr, name='left-subnet',
- **cls.extra_subnet_attributes)
- cls.create_router_interface(cls.router['id'], cls.subnet['id'])
+ is_distributed = cls.os_admin.network_client.show_router(
+ cls.router['id'])['router'].get('distributed')
+ cls.subnet = cls.create_subnet(
+ cls.network, ip_version=ip_version, cidr=cls.left_cidr,
+ name='left-subnet', **cls.extra_subnet_attributes)
+ cls.create_router_interface(cls.router['id'], cls.subnet['id'])
+ if is_distributed:
+ snat_port = cls.os_admin.network_client.list_ports(
+ device_id=cls.router['id'],
+ device_owner='network:router_centralized_snat')
+ snat_ip = cls._get_ip_on_subnet_for_port(
+ cls, snat_port['ports'][0], cls.subnet['id'])
+ cls.os_admin.network_client.update_subnet(
+ cls.subnet['id'], host_routes=[{"destination": cls.right_cidr,
+ "nexthop": snat_ip}])
# Gives an internal IPv4 subnet for floating IP to the left server,
# we use it to ssh into the left server.
if cls.inner_ipv6:
@@ -148,15 +163,23 @@
data_utils.rand_name('right-router'),
admin_state_up=True,
external_network_id=CONF.network.public_network_id)
+ is_distributed = cls.os_admin.network_client.show_router(
+ router['id'])['router'].get('distributed')
network = cls.create_network(network_name='right-network')
- v4_cidr = netaddr.IPNetwork('10.10.0.0/24')
- v6_cidr = netaddr.IPNetwork('2001:db8:0:1::/64')
- cidr = v6_cidr if cls.inner_ipv6 else v4_cidr
ip_version = 6 if cls.inner_ipv6 else 4
subnet = cls.create_subnet(
- network, ip_version=ip_version, cidr=cidr, name='right-subnet',
- **cls.extra_subnet_attributes)
+ network, ip_version=ip_version, cidr=cls.right_cidr,
+ name='right-subnet', **cls.extra_subnet_attributes)
cls.create_router_interface(router['id'], subnet['id'])
+ if is_distributed:
+ snat_port = cls.os_admin.network_client.list_ports(
+ device_id=router['id'],
+ device_owner='network:router_centralized_snat')
+ snat_ip = cls._get_ip_on_subnet_for_port(
+ cls, snat_port['ports'][0], subnet['id'])
+ cls.os_admin.network_client.update_subnet(
+ subnet['id'], host_routes=[{"destination": cls.left_cidr,
+ "nexthop": snat_ip}])
return network, subnet, router
@@ -191,6 +214,7 @@
site['vpnservice'] = self.create_vpnservice(
site['subnet']['id'], site['router']['id'],
name=data_utils.rand_name('%s-vpnservice' % site['name']))
+ site_connections = []
for i in range(0, 2):
site = sites[i]
vpnservice = site['vpnservice']
@@ -202,7 +226,7 @@
raise self.skipException(msg)
else:
peer_address = peer['vpnservice']['external_v4_ip']
- self.create_ipsec_site_connection(
+ site_connection = self.create_ipsec_site_connection(
self.ikepolicy['id'],
self.ipsecpolicy['id'],
vpnservice['id'],
@@ -212,6 +236,10 @@
psk=psk,
name=data_utils.rand_name(
'%s-ipsec-site-connection' % site['name']))
+ site_connections.append(site_connection)
+ for site_connection in site_connections:
+ self.wait_ipsec_site_connection_status(site_connection['id'],
+ status="ACTIVE")
def _get_ip_on_subnet_for_port(self, port, subnet_id):
for fixed_ip in port['fixed_ips']:
@@ -221,7 +249,6 @@
subnet_id, port)
raise self.fail(msg)
- @test.unstable_test("bug 1882220")
def _test_vpnaas(self):
# RIGHT
right_server = self._create_server(network=self._right_network,
@@ -259,6 +286,7 @@
class Vpnaas4in4(Vpnaas):
@decorators.idempotent_id('aa932ab2-63aa-49cf-a2a0-8ae71ac2bc24')
+ @decorators.attr(type='smoke')
def test_vpnaas(self):
self._test_vpnaas()
@@ -272,6 +300,7 @@
@testtools.skipIf(
CONF.neutron_vpnaas_plugin_options.skip_4in6_6in4_tests,
'VPNaaS 4in6 test is skipped.')
+ @test.unstable_test("bug 1882220")
def test_vpnaas_4in6(self):
self._test_vpnaas()
@@ -285,6 +314,7 @@
@testtools.skipIf(
CONF.neutron_vpnaas_plugin_options.skip_4in6_6in4_tests,
'VPNaaS 6in4 test is skipped.')
+ @test.unstable_test("bug 1882220")
def test_vpnaas_6in4(self):
self._test_vpnaas()
@@ -296,5 +326,6 @@
@decorators.idempotent_id('8b503ffc-aeb0-4938-8dba-73c7323e276d')
@testtools.skipUnless(CONF.network_feature_enabled.ipv6,
'IPv6 tests are disabled.')
+ @test.unstable_test("bug 1882220")
def test_vpnaas_6in6(self):
self._test_vpnaas()