blob: d79e5c3c67dda661ad9f796f23d2f1f2427010da [file] [log] [blame]
Renato Botelho do Coutoead1e532019-10-31 13:31:07 -05001#!/usr/bin/env python3
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -07002""" Container integration tests """
3
4import unittest
Klement Sekerab23ffd72021-05-31 16:08:53 +02005from config import config
6from framework import VppTestCase, VppTestRunner
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -07007from scapy.layers.l2 import Ether
8from scapy.packet import Raw
9from scapy.layers.inet import IP, UDP, TCP
10from scapy.packet import Packet
11from socket import inet_pton, AF_INET, AF_INET6
12from scapy.layers.inet6 import IPv6, ICMPv6Unknown, ICMPv6EchoRequest
13from scapy.layers.inet6 import ICMPv6EchoReply, IPv6ExtHdrRouting
14from scapy.layers.inet6 import IPv6ExtHdrFragment
15from pprint import pprint
16from random import randint
17from util import L4_Conn
18
19
20class Conn(L4_Conn):
21 # for now same as L4_Conn
22 pass
23
24
Klement Sekerab23ffd72021-05-31 16:08:53 +020025@unittest.skipUnless(config.extended, "part of extended tests")
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070026class ContainerIntegrationTestCase(VppTestCase):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020027 """Container integration extended testcases"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070028
29 @classmethod
Paul Vinciguerra56d68cb2018-11-27 05:53:35 -080030 def setUpClass(cls):
31 super(ContainerIntegrationTestCase, cls).setUpClass()
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070032 # create pg0 and pg1
Paul Vinciguerra56d68cb2018-11-27 05:53:35 -080033 cls.create_pg_interfaces(range(2))
34 for i in cls.pg_interfaces:
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070035 i.admin_up()
36 i.config_ip4()
37 i.config_ip6()
38 i.resolve_arp()
39 i.resolve_ndp()
40
Paul Vinciguerra8d991d92019-01-25 14:05:48 -080041 @classmethod
42 def tearDownClass(cls):
43 super(ContainerIntegrationTestCase, cls).tearDownClass()
44
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070045 def tearDown(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020046 """Run standard test teardown and log various show commands"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070047 super(ContainerIntegrationTestCase, self).tearDown()
Paul Vinciguerra90cf21b2019-03-13 09:23:05 -070048
49 def show_commands_at_teardown(self):
Neale Rannscbe25aa2019-09-30 10:53:31 +000050 self.logger.info(self.vapi.cli("show ip neighbors"))
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070051
52 def run_basic_conn_test(self, af, acl_side):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020053 """Basic connectivity test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070054 conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242)
55 conn1.send_through(0)
56 # the return packets should pass
57 conn1.send_through(1)
58
59 def run_negative_conn_test(self, af, acl_side):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020060 """Packets with local spoofed address"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070061 conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242)
62 try:
63 p2 = conn1.send_through(0).command()
64 except:
65 # If we asserted while waiting, it's good.
66 # the conn should have timed out.
67 p2 = None
68 self.assert_equal(p2, None, ": packet should have been dropped")
69
70 def test_0010_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020071 """IPv4 basic connectivity test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070072 self.run_basic_conn_test(AF_INET, 0)
73
74 def test_0011_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020075 """IPv6 basic connectivity test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070076 self.run_basic_conn_test(AF_INET6, 0)
77
78 def test_0050_loopback_prepare_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020079 """Create loopbacks overlapping with remote addresses"""
Klement Sekerab9ef2732018-06-24 22:49:33 +020080 self.create_loopback_interfaces(2)
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070081 for i in range(2):
82 intf = self.lo_interfaces[i]
83 intf.admin_up()
Jakub Grajciar053204a2019-03-18 13:17:53 +010084 intf.local_ip4 = self.pg_interfaces[i].remote_ip4
85 intf.local_ip4_prefix_len = 32
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070086 intf.config_ip4()
Jakub Grajciar053204a2019-03-18 13:17:53 +010087 intf.local_ip6 = self.pg_interfaces[i].remote_ip6
88 intf.local_ip6_prefix_len = 128
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070089 intf.config_ip6()
90
91 def test_0110_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020092 """IPv4 local-spoof connectivity test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070093 self.run_negative_conn_test(AF_INET, 0)
94
95 def test_0111_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020096 """IPv6 local-spoof connectivity test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -070097 self.run_negative_conn_test(AF_INET, 1)
98
99 def test_0200_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200100 """Configure container commands"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700101 for i in range(2):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200102 for addr in [
103 self.pg_interfaces[i].remote_ip4,
104 self.pg_interfaces[i].remote_ip6,
105 ]:
106 self.vapi.ppcli(
107 "ip container " + addr + " " + self.pg_interfaces[i].name
108 )
109 self.vapi.ppcli(
110 "stn rule address "
111 + addr
112 + " interface "
113 + self.pg_interfaces[i].name
114 )
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700115
116 def test_0210_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200117 """IPv4 test after configuring container"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700118 self.run_basic_conn_test(AF_INET, 0)
119
120 def test_0211_basic_conn_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200121 """IPv6 test after configuring container"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700122 self.run_basic_conn_test(AF_INET, 1)
123
124 def test_0300_unconfigure_commands(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200125 """Unconfigure container commands"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700126 for i in range(2):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200127 for addr in [
128 self.pg_interfaces[i].remote_ip4,
129 self.pg_interfaces[i].remote_ip6,
130 ]:
131 self.vapi.ppcli(
132 "ip container " + addr + " " + self.pg_interfaces[i].name + " del"
133 )
134 self.vapi.ppcli(
135 "stn rule address "
136 + addr
137 + " interface "
138 + self.pg_interfaces[i].name
139 + " del"
140 )
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700141
142 def test_0410_spoof_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200143 """IPv4 local-spoof after unconfig test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700144 self.run_negative_conn_test(AF_INET, 0)
145
146 def test_0411_spoof_test(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200147 """IPv6 local-spoof after unconfig test"""
Andrew Yourtchenko5f3fcb92017-10-25 05:50:37 -0700148 self.run_negative_conn_test(AF_INET, 1)