Merge "Add scenario test for port forwarding and UDP"
This commit is contained in:
commit
c0a62c5fec
|
@ -26,6 +26,7 @@ from tempest.lib.common.utils import test_utils
|
|||
from tempest.lib import exceptions as lib_exc
|
||||
|
||||
from neutron_tempest_plugin.api import base as base_api
|
||||
from neutron_tempest_plugin.common import shell
|
||||
from neutron_tempest_plugin.common import ssh
|
||||
from neutron_tempest_plugin import config
|
||||
from neutron_tempest_plugin.scenario import constants
|
||||
|
@ -385,7 +386,8 @@ class BaseTempestTestCase(base_api.BaseNetworkTest):
|
|||
for server in servers:
|
||||
kwargs = {}
|
||||
try:
|
||||
kwargs['port'] = server['port_forwarding']['external_port']
|
||||
kwargs['port'] = (
|
||||
server['port_forwarding_tcp']['external_port'])
|
||||
except KeyError:
|
||||
pass
|
||||
ssh_client = ssh.Client(
|
||||
|
@ -405,3 +407,34 @@ class BaseTempestTestCase(base_api.BaseNetworkTest):
|
|||
if log_errors:
|
||||
self._log_console_output(servers)
|
||||
raise
|
||||
|
||||
def nc_listen(self, server, ssh_client, port, protocol, echo_msg):
|
||||
"""Create nc server listening on the given TCP/UDP port.
|
||||
|
||||
Listener is created always on remote host.
|
||||
"""
|
||||
udp = ''
|
||||
if protocol.lower() == neutron_lib_constants.PROTO_NAME_UDP:
|
||||
udp = '-u'
|
||||
cmd = "sudo nc %(udp)s -p %(port)s -lk -e echo %(msg)s &" % {
|
||||
'udp': udp, 'port': port, 'msg': echo_msg}
|
||||
try:
|
||||
return ssh_client.exec_command(cmd)
|
||||
except lib_exc.SSHTimeout as ssh_e:
|
||||
LOG.debug(ssh_e)
|
||||
self._log_console_output([server])
|
||||
raise
|
||||
|
||||
def nc_client(self, ip_address, port, protocol):
|
||||
"""Check connectivity to TCP/UDP port at host via nc.
|
||||
|
||||
Client is always executed locally on host where tests are executed.
|
||||
"""
|
||||
udp = ''
|
||||
if protocol.lower() == neutron_lib_constants.PROTO_NAME_UDP:
|
||||
udp = '-u'
|
||||
cmd = 'echo "knock knock" | nc -w 1 %(udp)s %(host)s %(port)s' % {
|
||||
'udp': udp, 'host': ip_address, 'port': port}
|
||||
result = shell.execute_local_command(cmd)
|
||||
self.assertEqual(0, result.exit_status)
|
||||
return result.stdout
|
||||
|
|
|
@ -13,10 +13,12 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from neutron_lib import constants
|
||||
from oslo_log import log
|
||||
from tempest.lib.common.utils import data_utils
|
||||
from tempest.lib import decorators
|
||||
|
||||
from neutron_tempest_plugin.common import ssh
|
||||
from neutron_tempest_plugin import config
|
||||
from neutron_tempest_plugin.scenario import base
|
||||
|
||||
|
@ -42,12 +44,13 @@ class PortForwardingTestJSON(base.BaseTempestTestCase):
|
|||
cls.create_loginable_secgroup_rule(secgroup_id=cls.secgroup['id'])
|
||||
cls.keypair = cls.create_keypair()
|
||||
|
||||
@decorators.idempotent_id('ab40fc48-ca8d-41a0-b2a3-f6679c847bfe')
|
||||
def test_port_forwarding_to_2_servers(self):
|
||||
internal_tcp_port = 22
|
||||
def _prepare_resources(self, num_servers, internal_tcp_port, protocol):
|
||||
servers = []
|
||||
for i in range(1, 3):
|
||||
external_tcp_port = 1000 + i
|
||||
external_port_base = 1025
|
||||
for i in range(1, num_servers + 1):
|
||||
internal_udp_port = internal_tcp_port + 10
|
||||
external_tcp_port = external_port_base + i
|
||||
external_udp_port = external_tcp_port + 10
|
||||
name = data_utils.rand_name("server-%s" % i)
|
||||
port = self.create_port(
|
||||
self.network,
|
||||
|
@ -59,13 +62,55 @@ class PortForwardingTestJSON(base.BaseTempestTestCase):
|
|||
networks=[{'port': port['id']}])['server']
|
||||
server['name'] = name
|
||||
self.wait_for_server_active(server)
|
||||
server['port_forwarding'] = self.create_port_forwarding(
|
||||
server['port_forwarding_tcp'] = self.create_port_forwarding(
|
||||
self.fip['id'],
|
||||
internal_port_id=port['id'],
|
||||
internal_ip_address=port['fixed_ips'][0]['ip_address'],
|
||||
internal_port=internal_tcp_port,
|
||||
external_port=external_tcp_port,
|
||||
protocol="tcp")
|
||||
protocol=constants.PROTO_NAME_TCP)
|
||||
server['port_forwarding_udp'] = self.create_port_forwarding(
|
||||
self.fip['id'],
|
||||
internal_port_id=port['id'],
|
||||
internal_ip_address=port['fixed_ips'][0]['ip_address'],
|
||||
internal_port=internal_udp_port,
|
||||
external_port=external_udp_port,
|
||||
protocol=constants.PROTO_NAME_UDP)
|
||||
servers.append(server)
|
||||
return servers
|
||||
|
||||
def _test_udp_port_forwarding(self, servers):
|
||||
for server in servers:
|
||||
msg = "%s-UDP-test" % server['name']
|
||||
ssh_client = ssh.Client(
|
||||
self.fip['floating_ip_address'],
|
||||
CONF.validation.image_ssh_user,
|
||||
pkey=self.keypair['private_key'],
|
||||
port=server['port_forwarding_tcp']['external_port'])
|
||||
self.nc_listen(server,
|
||||
ssh_client,
|
||||
server['port_forwarding_udp']['internal_port'],
|
||||
constants.PROTO_NAME_UDP,
|
||||
msg)
|
||||
for server in servers:
|
||||
expected_msg = "%s-UDP-test" % server['name']
|
||||
self.assertIn(
|
||||
expected_msg, self.nc_client(
|
||||
self.fip['floating_ip_address'],
|
||||
server['port_forwarding_udp']['external_port'],
|
||||
constants.PROTO_NAME_UDP))
|
||||
|
||||
@decorators.idempotent_id('ab40fc48-ca8d-41a0-b2a3-f6679c847bfe')
|
||||
def test_port_forwarding_to_2_servers(self):
|
||||
udp_sg_rule = {'protocol': constants.PROTO_NAME_UDP,
|
||||
'direction': constants.INGRESS_DIRECTION,
|
||||
'remote_ip_prefix': '0.0.0.0/0'}
|
||||
self.create_secgroup_rules(
|
||||
[udp_sg_rule], secgroup_id=self.secgroup['id'])
|
||||
servers = self._prepare_resources(
|
||||
num_servers=2, internal_tcp_port=22,
|
||||
protocol=constants.PROTO_NAME_TCP)
|
||||
# Test TCP port forwarding by SSH to each server
|
||||
self.check_servers_hostnames(servers)
|
||||
# And now test UDP port forwarding using nc
|
||||
self._test_udp_port_forwarding(servers)
|
||||
|
|
Loading…
Reference in New Issue