Use VM on external network in DVR ingress test

In case proxy host on the environment for some reason
does not have routing to the external network
spawn a VM on external network to use it as a proxy
host for sending traffic to the VM under test.

Note: on podified environment we can not ping VM in
DVR test from a local ip since tempest is running on
one of the OCP cluster nodes and FIP-related traffic
will be captured on the gateway node (when only
compute nodes are expected) and thus affecting the
results.

Change-Id: I35def1d0d0e419cbcf552bc6148ed112567aa8f6
This commit is contained in:
Roman Safronov 2024-08-01 02:04:17 +03:00
parent 2dfbfad335
commit f89d5d40d2
2 changed files with 46 additions and 25 deletions

View File

@ -577,7 +577,7 @@ class BaseTempestWhiteboxTestCase(base.BaseTempestTestCase):
def _create_server( def _create_server(
self, create_floating_ip=True, exclude_hosts=None, self, create_floating_ip=True, exclude_hosts=None,
network=None, **kwargs): network=None, use_admin_client=False, **kwargs):
network = network or self.network network = network or self.network
kwargs.setdefault('name', data_utils.rand_name('server-test')) kwargs.setdefault('name', data_utils.rand_name('server-test'))
kwargs['flavorRef'] = self.flavor_ref kwargs['flavorRef'] = self.flavor_ref
@ -602,7 +602,7 @@ class BaseTempestWhiteboxTestCase(base.BaseTempestTestCase):
else: else:
kwargs['host'] = self.find_different_compute_host( kwargs['host'] = self.find_different_compute_host(
exclude_hosts) exclude_hosts)
if kwargs.get('host'): if kwargs.get('host') or use_admin_client:
servers_client = self.os_admin.servers_client servers_client = self.os_admin.servers_client
network_client = self.os_admin.network_client network_client = self.os_admin.network_client
else: else:
@ -623,7 +623,7 @@ class BaseTempestWhiteboxTestCase(base.BaseTempestTestCase):
"this list: '{}'. Can not proceed.".format( "this list: '{}'. Can not proceed.".format(
' '.join(exclude_hosts))) ' '.join(exclude_hosts)))
self.wait_for_server_active(server, client=servers_client) self.wait_for_server_active(server, client=servers_client)
port = self.client.list_ports( port = network_client.list_ports(
network_id=network['id'], network_id=network['id'],
device_id=server['id'])['ports'][0] device_id=server['id'])['ports'][0]
if create_floating_ip: if create_floating_ip:
@ -1173,15 +1173,6 @@ class TrafficFlowTest(BaseTempestWhiteboxTestCase):
filters += " and ip[2:2]=={} and ip dst {}".format(size, dst_ip) filters += " and ip[2:2]=={} and ip dst {}".format(size, dst_ip)
self._start_captures(filters) self._start_captures(filters)
# if the host is localhost, don't use remote connectivity,
# ping directly on the host
if ssh_client.host in (
'localhost', '127.0.0.1', '0:0:0:0:0:0:0:1', '::1'):
self.ping_ip_address(dst_ip, mtu=size, should_succeed=True)
# tcpdump requires a delay between capturing packets and writing
# them to its file.
time.sleep(2)
else:
self.check_remote_connectivity( self.check_remote_connectivity(
ssh_client, dst_ip, mtu=size, ping_count=2) ssh_client, dst_ip, mtu=size, ping_count=2)
self._stop_captures() self._stop_captures()

View File

@ -30,6 +30,7 @@ from tempest import config
from tempest.lib.common.utils import data_utils from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils from tempest.lib.common.utils import test_utils
from tempest.lib import decorators from tempest.lib import decorators
from tempest.lib import exceptions as lib_exceptions
from whitebox_neutron_tempest_plugin.common import utils as local_utils from whitebox_neutron_tempest_plugin.common import utils as local_utils
from whitebox_neutron_tempest_plugin.tests.scenario import base from whitebox_neutron_tempest_plugin.tests.scenario import base
@ -213,18 +214,47 @@ class OvnDvrTest(OvnDvrBase):
7. Restart the server and verify that routing has not changed 7. Restart the server and verify that routing has not changed
""" """
# will the pings be send from self.proxy_host_client or from localhost? def _get_extra_parameters():
if not WB_CONF.bgp: ssh_client = None
ssh_local_client = self.proxy_host_client expected_routing_nodes = [self.compute]
else: try:
ssh_local_client = self.get_local_ssh_client() self.proxy_host_client.exec_command(
"ping -c 10 -W2 -s56 {}".format(
self.server['fip']['floating_ip_address']))
ssh_client = self.proxy_host_client
except lib_exceptions.SSHExecCommandFailed:
# In case VM under test is not responding from the proxy host
# this means that there is a limitation of the environment and
# as a fallback scenario we create an additional VM
# (on external network) that we'll use for pinging the VM under
# test.
LOG.debug(
"VM is not pingable from the proxy host. "
"Creating a VM on external_network to complete "
"the required setup.")
self.external_network = self.client.show_network(
CONF.network.public_network_id)['network']
ext_vm = self._create_server(
network=self.external_network,
create_floating_ip=False,
use_admin_client=True)
self.ext_vm_ssh_client = ssh.Client(
ext_vm['port']['fixed_ips'][0]['ip_address'],
self.username, pkey=self.keypair['private_key'])
ssh_client = self.ext_vm_ssh_client
ext_vm_host = self.get_host_for_server(ext_vm['server']['id'])
# expected_routing_nodes should not have duplicates
expected_routing_nodes = list(set([self.compute, ext_vm_host]))
return ssh_client, expected_routing_nodes
self._setup() self._setup()
ssh_client, expected_routing_nodes = _get_extra_parameters()
self.check_north_south_icmp_flow( self.check_north_south_icmp_flow(
dst_ip=self.server['fip']['floating_ip_address'], dst_ip=self.server['fip']['floating_ip_address'],
expected_routing_nodes=[self.compute], expected_routing_nodes=expected_routing_nodes,
expected_mac=self.fip_port_mac, expected_mac=self.fip_port_mac,
ssh_client=ssh_local_client) ssh_client=ssh_client)
# Delete fip # Delete fip
LOG.debug('Deleting floating ip') LOG.debug('Deleting floating ip')
@ -239,9 +269,9 @@ class OvnDvrTest(OvnDvrBase):
fip_port_mac = self.get_fip_port_details(fip)['mac_address'] fip_port_mac = self.get_fip_port_details(fip)['mac_address']
self.check_north_south_icmp_flow( self.check_north_south_icmp_flow(
dst_ip=fip['floating_ip_address'], dst_ip=fip['floating_ip_address'],
expected_routing_nodes=[self.compute], expected_routing_nodes=expected_routing_nodes,
expected_mac=fip_port_mac, expected_mac=fip_port_mac,
ssh_client=ssh_local_client) ssh_client=ssh_client)
# Reboot the server and make sure that routing is still via compute. # Reboot the server and make sure that routing is still via compute.
LOG.debug('Rebooting vm') LOG.debug('Rebooting vm')
@ -252,9 +282,9 @@ class OvnDvrTest(OvnDvrBase):
neutron_constants.SERVER_STATUS_ACTIVE) neutron_constants.SERVER_STATUS_ACTIVE)
self.check_north_south_icmp_flow( self.check_north_south_icmp_flow(
dst_ip=fip['floating_ip_address'], dst_ip=fip['floating_ip_address'],
expected_routing_nodes=[self.compute], expected_routing_nodes=expected_routing_nodes,
expected_mac=fip_port_mac, expected_mac=fip_port_mac,
ssh_client=ssh_local_client) ssh_client=ssh_client)
@decorators.idempotent_id('0fcf9f97-6368-4c5d-a5f5-ff8a7643e3b6') @decorators.idempotent_id('0fcf9f97-6368-4c5d-a5f5-ff8a7643e3b6')
def test_validate_fip2fip_compute(self): def test_validate_fip2fip_compute(self):