blob: 1e3ec40a2f76fa28e79a74223e4a9ef30c9a0108 [file] [log] [blame]
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -07001#!/usr/bin/env python
2""" Container integration tests """
3
4import unittest
5from framework import VppTestCase, VppTestRunner, running_extended_tests
6from scapy.layers.l2 import Ether
7from scapy.packet import Raw
8from scapy.layers.inet import IP, UDP, TCP
9from scapy.packet import Packet
10from socket import inet_pton, AF_INET, AF_INET6
11from scapy.layers.inet6 import IPv6, ICMPv6Unknown, ICMPv6EchoRequest
12from scapy.layers.inet6 import ICMPv6EchoReply, IPv6ExtHdrRouting
13from scapy.layers.inet6 import IPv6ExtHdrFragment
14from pprint import pprint
15from random import randint
16from util import L4_Conn
17
18
19class Conn(L4_Conn):
20 # for now same as L4_Conn
21 pass
22
23
Paul Vinciguerradefde0f2018-12-06 07:46:13 -080024@unittest.skipUnless(running_extended_tests, "part of extended tests")
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070025class ContainerIntegrationTestCase(VppTestCase):
26 """ Container integration extended testcases """
27
28 @classmethod
Paul Vinciguerra56d68cb2018-11-27 05:53:35 -080029 def setUpClass(cls):
30 super(ContainerIntegrationTestCase, cls).setUpClass()
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070031 # create pg0 and pg1
Paul Vinciguerra56d68cb2018-11-27 05:53:35 -080032 cls.create_pg_interfaces(range(2))
33 for i in cls.pg_interfaces:
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070034 i.admin_up()
35 i.config_ip4()
36 i.config_ip6()
37 i.resolve_arp()
38 i.resolve_ndp()
39
Paul Vinciguerra8d991d92019-01-25 14:05:48 -080040 @classmethod
41 def tearDownClass(cls):
42 super(ContainerIntegrationTestCase, cls).tearDownClass()
43
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070044 def tearDown(self):
45 """Run standard test teardown and log various show commands
46 """
47 super(ContainerIntegrationTestCase, self).tearDown()
Paul Vinciguerra90cf21b2019-03-13 09:23:05 -070048
49 def show_commands_at_teardown(self):
50 self.logger.info(self.vapi.cli("show ip arp"))
51 self.logger.info(self.vapi.cli("show ip6 neighbors"))
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070052
53 def run_basic_conn_test(self, af, acl_side):
54 """ Basic connectivity test """
55 conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242)
56 conn1.send_through(0)
57 # the return packets should pass
58 conn1.send_through(1)
59
60 def run_negative_conn_test(self, af, acl_side):
61 """ Packets with local spoofed address """
62 conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242)
63 try:
64 p2 = conn1.send_through(0).command()
65 except:
66 # If we asserted while waiting, it's good.
67 # the conn should have timed out.
68 p2 = None
69 self.assert_equal(p2, None, ": packet should have been dropped")
70
71 def test_0010_basic_conn_test(self):
72 """ IPv4 basic connectivity test """
73 self.run_basic_conn_test(AF_INET, 0)
74
75 def test_0011_basic_conn_test(self):
76 """ IPv6 basic connectivity test """
77 self.run_basic_conn_test(AF_INET6, 0)
78
79 def test_0050_loopback_prepare_test(self):
80 """ Create loopbacks overlapping with remote addresses """
Klement Sekerab9ef2732018-06-24 22:49:33 +020081 self.create_loopback_interfaces(2)
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070082 for i in range(2):
83 intf = self.lo_interfaces[i]
84 intf.admin_up()
Jakub Grajciar053204a2019-03-18 13:17:53 +010085 intf.local_ip4 = self.pg_interfaces[i].remote_ip4
86 intf.local_ip4_prefix_len = 32
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070087 intf.config_ip4()
Jakub Grajciar053204a2019-03-18 13:17:53 +010088 intf.local_ip6 = self.pg_interfaces[i].remote_ip6
89 intf.local_ip6_prefix_len = 128
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070090 intf.config_ip6()
91
92 def test_0110_basic_conn_test(self):
93 """ IPv4 local-spoof connectivity test """
94 self.run_negative_conn_test(AF_INET, 0)
95
96 def test_0111_basic_conn_test(self):
97 """ IPv6 local-spoof connectivity test """
98 self.run_negative_conn_test(AF_INET, 1)
99
100 def test_0200_basic_conn_test(self):
101 """ Configure container commands """
102 for i in range(2):
103 for addr in [self.pg_interfaces[i].remote_ip4,
104 self.pg_interfaces[i].remote_ip6]:
105 self.vapi.ppcli("ip container " + addr + " " +
106 self.pg_interfaces[i].name)
107 self.vapi.ppcli("stn rule address " + addr +
108 " interface " + self.pg_interfaces[i].name)
109
110 def test_0210_basic_conn_test(self):
111 """ IPv4 test after configuring container """
112 self.run_basic_conn_test(AF_INET, 0)
113
114 def test_0211_basic_conn_test(self):
115 """ IPv6 test after configuring container """
116 self.run_basic_conn_test(AF_INET, 1)
117
118 def test_0300_unconfigure_commands(self):
119 """ Unconfigure container commands """
120 for i in range(2):
121 for addr in [self.pg_interfaces[i].remote_ip4,
122 self.pg_interfaces[i].remote_ip6]:
123 self.vapi.ppcli("ip container " + addr + " " +
124 self.pg_interfaces[i].name +
125 " del")
126 self.vapi.ppcli("stn rule address " + addr +
127 " interface " + self.pg_interfaces[i].name +
128 " del")
129
130 def test_0410_spoof_test(self):
131 """ IPv4 local-spoof after unconfig test """
132 self.run_negative_conn_test(AF_INET, 0)
133
134 def test_0411_spoof_test(self):
135 """ IPv6 local-spoof after unconfig test """
136 self.run_negative_conn_test(AF_INET, 1)