From aead964b735d6be8e905ae13be697e673df1b550 Mon Sep 17 00:00:00 2001 From: Renjing Xiao Date: Fri, 11 Jul 2025 14:55:55 +0100 Subject: [PATCH] Place VMs on different computes in MTU tests Workaround for connectivity issue from tenant VM to external provider VM when both are on the same compute with DVR + VLAN tenant network. Related-Bug: OSPRH-17095 Related-Bug: OSPRH-9095 Change-Id: Ica1489cbdff6be4c68bb049d4b8c39b0b8b8af67 Signed-off-by: Renjing Xiao --- .../tests/scenario/base.py | 46 +++++++++++++++++++ .../tests/scenario/test_dvr_ovn.py | 28 ++--------- .../tests/scenario/test_mtu.py | 16 ++++++- zuul.d/master_jobs.yaml | 3 -- 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/whitebox_neutron_tempest_plugin/tests/scenario/base.py b/whitebox_neutron_tempest_plugin/tests/scenario/base.py index 89f2475..b6b7617 100644 --- a/whitebox_neutron_tempest_plugin/tests/scenario/base.py +++ b/whitebox_neutron_tempest_plugin/tests/scenario/base.py @@ -1052,6 +1052,52 @@ class BaseTempestWhiteboxTestCase(base.BaseTempestTestCase): LOG.debug('Command for resource creation succeeded') return _id + @classmethod + def is_vlan_tenant_enabled(cls, msg='', skip_if_fails=False): + if cls.is_devstack: + for node in cls.nodes: + if not node['is_controller']: + continue + if not cls.check_service_setting( + host=node, service='', + config_files=[cls.neutron_conf], + section='ml2', param='tenant_network_types', + value='vlan', msg=msg, skip_if_fails=skip_if_fails): + return False + return True + return cls.check_service_setting( + {'client': cls.proxy_host_client}, + config_files=cls.get_configs_of_service(), section='ml2', + param='tenant_network_types', value='vlan', msg=msg, + skip_if_fails=skip_if_fails) + + @classmethod + def is_dvr_ovn_enabled(cls, msg='', skip_if_fails=False): + if cls.is_devstack: + for node in cls.nodes: + if not node['is_controller']: + continue + if not cls.check_service_setting( + host=node, service='', config_files=[cls.neutron_conf], + param='enable_dvr', msg=msg, skip_if_fails=skip_if_fails + ) or not cls.check_service_setting( + host=node, service='', config_files=[cls.neutron_conf], + param='router_distributed', msg=msg, + skip_if_fails=skip_if_fails + ) or not cls.check_service_setting( + host=node, service='', + config_files=[WB_CONF.ml2_plugin_config], + section='ovn', param='enable_distributed_floating_ip', + msg=msg, skip_if_fails=skip_if_fails + ): + return False + return True + return cls.check_service_setting( + {'client': cls.proxy_host_client}, + config_files=cls.get_configs_of_service(), section='ovn', + param='enable_distributed_floating_ip', + skip_if_fails=skip_if_fails) + class BaseTempestTestCaseAdvanced(BaseTempestWhiteboxTestCase): """Base class skips test suites unless advanced image is available, diff --git a/whitebox_neutron_tempest_plugin/tests/scenario/test_dvr_ovn.py b/whitebox_neutron_tempest_plugin/tests/scenario/test_dvr_ovn.py index 4d8f39e..bc4959d 100644 --- a/whitebox_neutron_tempest_plugin/tests/scenario/test_dvr_ovn.py +++ b/whitebox_neutron_tempest_plugin/tests/scenario/test_dvr_ovn.py @@ -52,31 +52,11 @@ class OvnDvrBase(base.TrafficFlowTest, base.BaseTempestTestCaseOvn): raise cls.skipException( "The tests require environment with at least 2 nodes") cls.bgp_expose_tenant_networks = False - for node in cls.nodes: - if cls.is_devstack: - if not node['is_controller']: - continue - cls.check_service_setting( - host=node, service='', - config_files=[cls.neutron_conf], - param='enable_dvr') - cls.check_service_setting( - host=node, service='', - config_files=[cls.neutron_conf], - param='router_distributed') - cls.check_service_setting( - host=node, service='', - config_files=[WB_CONF.ml2_plugin_config], - section='ovn', param='enable_distributed_floating_ip') - # TODO(rsafrono) add code that defines - # cls.bgp_expose_tenant_networks on devstack - # in case such bgp environment will be ever created + cls.is_dvr_ovn_enabled(msg=msg, skip_if_fails=True) + # TODO(rsafrono) add code that defines + # cls.bgp_expose_tenant_networks on devstack + # in case such bgp environment will be ever created if not cls.is_devstack: - config_files = cls.get_configs_of_service() - cls.check_service_setting( - {'client': cls.proxy_host_client}, - config_files=config_files, section='ovn', - param='enable_distributed_floating_ip', msg=msg) if WB_CONF.bgp: for node in cls.nodes: if node['is_networker'] and not node['is_controller']: diff --git a/whitebox_neutron_tempest_plugin/tests/scenario/test_mtu.py b/whitebox_neutron_tempest_plugin/tests/scenario/test_mtu.py index e547ac7..f10ff0c 100644 --- a/whitebox_neutron_tempest_plugin/tests/scenario/test_mtu.py +++ b/whitebox_neutron_tempest_plugin/tests/scenario/test_mtu.py @@ -161,11 +161,23 @@ class GatewayMtuTest(base.TrafficFlowTest, base.BaseTempestTestCaseOvn): self.local_client = ext_vm_ssh_client # We'll use the default self.server as a proxy for no-FIP scenario - self.server = self._create_server() + # TODO(rxiao): Temporary workaround for known issue with DVR + VLAN + # tenant network. Place proxy server `server` and test server + # `test_server` on a different compute than the external server + # `ext_vm`. Remove the if block and keep only the else path once + # OSPRH-17095 is resolved. + if (not self.is_devstack and not self.is_setup_single_compute() and + self.is_vlan_tenant_enabled() and self.is_dvr_ovn_enabled()): + different_host = {'different_host': [ext_vm['server']['id']]} + self.server = self._create_server(scheduler_hints=different_host) + self.test_server = self._create_server( + create_floating_ip=False, scheduler_hints=different_host) + else: + self.server = self._create_server() + self.test_server = self._create_server(create_floating_ip=False) server_ssh_client = ssh.Client( self.server['fip']['floating_ip_address'], self.username, pkey=self.keypair['private_key']) - self.test_server = self._create_server(create_floating_ip=False) test_server_ip = self.test_server['port']['fixed_ips'][0]['ip_address'] self.test_server_client = ssh.Client( test_server_ip, self.username, diff --git a/zuul.d/master_jobs.yaml b/zuul.d/master_jobs.yaml index 34e8793..dfec43b 100644 --- a/zuul.d/master_jobs.yaml +++ b/zuul.d/master_jobs.yaml @@ -30,7 +30,6 @@ (^whitebox_neutron_tempest_plugin.tests.scenario.test_router_flavors)|\ (^whitebox_neutron_tempest_plugin.tests.scenario.test_security_group_logging)|\ (^whitebox_neutron_tempest_plugin.tests.scenario.test_l3ha_ovn)|\ - (^whitebox_neutron_tempest_plugin.tests.scenario.test_mtu)|\ (test_multicast.*restart)|\ (test_multicast.*ext*)|\ (^whitebox_neutron_tempest_plugin.*test_qos_user_policies)|\ @@ -434,8 +433,6 @@ service_providers: service_provider: "L3_ROUTER_NAT:user-defined:neutron.services.ovn_l3.service_providers.user_defined.UserDefined" tempest_concurrency: 1 - # (rsafrono) whitebox_neutron_tempest_plugin.tests.scenario.test_mtu are not enabled on devstack - # due to https://bugs.launchpad.net/neutron/+bug/2060828 tempest_test_regex: "\ (^whitebox_neutron_tempest_plugin.tests.scenario.test_metadata_rate_limiting)|\ (^whitebox_neutron_tempest_plugin.tests.scenario.test_router_flavors)|\