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:
parent
2dfbfad335
commit
f89d5d40d2
@ -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()
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user