2017-10-25 05:50:37 -07:00
|
|
|
#!/usr/bin/env python
|
|
|
|
""" Container integration tests """
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
from framework import VppTestCase, VppTestRunner, running_extended_tests
|
|
|
|
from scapy.layers.l2 import Ether
|
|
|
|
from scapy.packet import Raw
|
|
|
|
from scapy.layers.inet import IP, UDP, TCP
|
|
|
|
from scapy.packet import Packet
|
|
|
|
from socket import inet_pton, AF_INET, AF_INET6
|
|
|
|
from scapy.layers.inet6 import IPv6, ICMPv6Unknown, ICMPv6EchoRequest
|
|
|
|
from scapy.layers.inet6 import ICMPv6EchoReply, IPv6ExtHdrRouting
|
|
|
|
from scapy.layers.inet6 import IPv6ExtHdrFragment
|
|
|
|
from pprint import pprint
|
|
|
|
from random import randint
|
|
|
|
from util import L4_Conn
|
|
|
|
|
|
|
|
|
|
|
|
class Conn(L4_Conn):
|
|
|
|
# for now same as L4_Conn
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2018-12-06 07:46:13 -08:00
|
|
|
@unittest.skipUnless(running_extended_tests, "part of extended tests")
|
2017-10-25 05:50:37 -07:00
|
|
|
class ContainerIntegrationTestCase(VppTestCase):
|
|
|
|
""" Container integration extended testcases """
|
|
|
|
|
|
|
|
@classmethod
|
2018-11-27 05:53:35 -08:00
|
|
|
def setUpClass(cls):
|
|
|
|
super(ContainerIntegrationTestCase, cls).setUpClass()
|
2017-10-25 05:50:37 -07:00
|
|
|
# create pg0 and pg1
|
2018-11-27 05:53:35 -08:00
|
|
|
cls.create_pg_interfaces(range(2))
|
|
|
|
for i in cls.pg_interfaces:
|
2017-10-25 05:50:37 -07:00
|
|
|
i.admin_up()
|
|
|
|
i.config_ip4()
|
|
|
|
i.config_ip6()
|
|
|
|
i.resolve_arp()
|
|
|
|
i.resolve_ndp()
|
|
|
|
|
2019-01-25 14:05:48 -08:00
|
|
|
@classmethod
|
|
|
|
def tearDownClass(cls):
|
|
|
|
super(ContainerIntegrationTestCase, cls).tearDownClass()
|
|
|
|
|
2017-10-25 05:50:37 -07:00
|
|
|
def tearDown(self):
|
|
|
|
"""Run standard test teardown and log various show commands
|
|
|
|
"""
|
|
|
|
super(ContainerIntegrationTestCase, self).tearDown()
|
2019-03-13 09:23:05 -07:00
|
|
|
|
|
|
|
def show_commands_at_teardown(self):
|
|
|
|
self.logger.info(self.vapi.cli("show ip arp"))
|
|
|
|
self.logger.info(self.vapi.cli("show ip6 neighbors"))
|
2017-10-25 05:50:37 -07:00
|
|
|
|
|
|
|
def run_basic_conn_test(self, af, acl_side):
|
|
|
|
""" Basic connectivity test """
|
|
|
|
conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242)
|
|
|
|
conn1.send_through(0)
|
|
|
|
# the return packets should pass
|
|
|
|
conn1.send_through(1)
|
|
|
|
|
|
|
|
def run_negative_conn_test(self, af, acl_side):
|
|
|
|
""" Packets with local spoofed address """
|
|
|
|
conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242)
|
|
|
|
try:
|
|
|
|
p2 = conn1.send_through(0).command()
|
|
|
|
except:
|
|
|
|
# If we asserted while waiting, it's good.
|
|
|
|
# the conn should have timed out.
|
|
|
|
p2 = None
|
|
|
|
self.assert_equal(p2, None, ": packet should have been dropped")
|
|
|
|
|
|
|
|
def test_0010_basic_conn_test(self):
|
|
|
|
""" IPv4 basic connectivity test """
|
|
|
|
self.run_basic_conn_test(AF_INET, 0)
|
|
|
|
|
|
|
|
def test_0011_basic_conn_test(self):
|
|
|
|
""" IPv6 basic connectivity test """
|
|
|
|
self.run_basic_conn_test(AF_INET6, 0)
|
|
|
|
|
|
|
|
def test_0050_loopback_prepare_test(self):
|
|
|
|
""" Create loopbacks overlapping with remote addresses """
|
2018-06-24 22:49:33 +02:00
|
|
|
self.create_loopback_interfaces(2)
|
2017-10-25 05:50:37 -07:00
|
|
|
for i in range(2):
|
|
|
|
intf = self.lo_interfaces[i]
|
|
|
|
intf.admin_up()
|
|
|
|
intf._local_ip4 = self.pg_interfaces[i].remote_ip4
|
|
|
|
intf._local_ip4_prefix_len = 32
|
|
|
|
intf.config_ip4()
|
|
|
|
intf._local_ip6 = self.pg_interfaces[i].remote_ip6
|
|
|
|
intf._local_ip6_prefix_len = 128
|
|
|
|
intf.config_ip6()
|
|
|
|
|
|
|
|
def test_0110_basic_conn_test(self):
|
|
|
|
""" IPv4 local-spoof connectivity test """
|
|
|
|
self.run_negative_conn_test(AF_INET, 0)
|
|
|
|
|
|
|
|
def test_0111_basic_conn_test(self):
|
|
|
|
""" IPv6 local-spoof connectivity test """
|
|
|
|
self.run_negative_conn_test(AF_INET, 1)
|
|
|
|
|
|
|
|
def test_0200_basic_conn_test(self):
|
|
|
|
""" Configure container commands """
|
|
|
|
for i in range(2):
|
|
|
|
for addr in [self.pg_interfaces[i].remote_ip4,
|
|
|
|
self.pg_interfaces[i].remote_ip6]:
|
|
|
|
self.vapi.ppcli("ip container " + addr + " " +
|
|
|
|
self.pg_interfaces[i].name)
|
|
|
|
self.vapi.ppcli("stn rule address " + addr +
|
|
|
|
" interface " + self.pg_interfaces[i].name)
|
|
|
|
|
|
|
|
def test_0210_basic_conn_test(self):
|
|
|
|
""" IPv4 test after configuring container """
|
|
|
|
self.run_basic_conn_test(AF_INET, 0)
|
|
|
|
|
|
|
|
def test_0211_basic_conn_test(self):
|
|
|
|
""" IPv6 test after configuring container """
|
|
|
|
self.run_basic_conn_test(AF_INET, 1)
|
|
|
|
|
|
|
|
def test_0300_unconfigure_commands(self):
|
|
|
|
""" Unconfigure container commands """
|
|
|
|
for i in range(2):
|
|
|
|
for addr in [self.pg_interfaces[i].remote_ip4,
|
|
|
|
self.pg_interfaces[i].remote_ip6]:
|
|
|
|
self.vapi.ppcli("ip container " + addr + " " +
|
|
|
|
self.pg_interfaces[i].name +
|
|
|
|
" del")
|
|
|
|
self.vapi.ppcli("stn rule address " + addr +
|
|
|
|
" interface " + self.pg_interfaces[i].name +
|
|
|
|
" del")
|
|
|
|
|
|
|
|
def test_0410_spoof_test(self):
|
|
|
|
""" IPv4 local-spoof after unconfig test """
|
|
|
|
self.run_negative_conn_test(AF_INET, 0)
|
|
|
|
|
|
|
|
def test_0411_spoof_test(self):
|
|
|
|
""" IPv6 local-spoof after unconfig test """
|
|
|
|
self.run_negative_conn_test(AF_INET, 1)
|