Renato Botelho do Couto | ead1e53 | 2019-10-31 13:31:07 -0500 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 2 | """ Container integration tests """ |
| 3 | |
| 4 | import unittest |
Klement Sekera | b23ffd7 | 2021-05-31 16:08:53 +0200 | [diff] [blame] | 5 | from config import config |
Dave Wallace | 8800f73 | 2023-08-31 00:47:44 -0400 | [diff] [blame] | 6 | from framework import VppTestCase |
| 7 | from asfframework import VppTestRunner |
| 8 | from scapy.layers.inet import UDP |
| 9 | from socket import AF_INET, AF_INET6 |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 10 | from util import L4_Conn |
| 11 | |
| 12 | |
| 13 | class Conn(L4_Conn): |
| 14 | # for now same as L4_Conn |
| 15 | pass |
| 16 | |
| 17 | |
Klement Sekera | b23ffd7 | 2021-05-31 16:08:53 +0200 | [diff] [blame] | 18 | @unittest.skipUnless(config.extended, "part of extended tests") |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 19 | class ContainerIntegrationTestCase(VppTestCase): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 20 | """Container integration extended testcases""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 21 | |
| 22 | @classmethod |
Paul Vinciguerra | 56d68cb | 2018-11-27 05:53:35 -0800 | [diff] [blame] | 23 | def setUpClass(cls): |
| 24 | super(ContainerIntegrationTestCase, cls).setUpClass() |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 25 | # create pg0 and pg1 |
Paul Vinciguerra | 56d68cb | 2018-11-27 05:53:35 -0800 | [diff] [blame] | 26 | cls.create_pg_interfaces(range(2)) |
| 27 | for i in cls.pg_interfaces: |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 28 | i.admin_up() |
| 29 | i.config_ip4() |
| 30 | i.config_ip6() |
| 31 | i.resolve_arp() |
| 32 | i.resolve_ndp() |
| 33 | |
Paul Vinciguerra | 8d991d9 | 2019-01-25 14:05:48 -0800 | [diff] [blame] | 34 | @classmethod |
| 35 | def tearDownClass(cls): |
| 36 | super(ContainerIntegrationTestCase, cls).tearDownClass() |
| 37 | |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 38 | def tearDown(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 39 | """Run standard test teardown and log various show commands""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 40 | super(ContainerIntegrationTestCase, self).tearDown() |
Paul Vinciguerra | 90cf21b | 2019-03-13 09:23:05 -0700 | [diff] [blame] | 41 | |
| 42 | def show_commands_at_teardown(self): |
Neale Ranns | cbe25aa | 2019-09-30 10:53:31 +0000 | [diff] [blame] | 43 | self.logger.info(self.vapi.cli("show ip neighbors")) |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 44 | |
| 45 | def run_basic_conn_test(self, af, acl_side): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 46 | """Basic connectivity test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 47 | conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242) |
| 48 | conn1.send_through(0) |
| 49 | # the return packets should pass |
| 50 | conn1.send_through(1) |
| 51 | |
| 52 | def run_negative_conn_test(self, af, acl_side): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 53 | """Packets with local spoofed address""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 54 | conn1 = Conn(self, self.pg0, self.pg1, af, UDP, 42001, 4242) |
| 55 | try: |
| 56 | p2 = conn1.send_through(0).command() |
| 57 | except: |
| 58 | # If we asserted while waiting, it's good. |
| 59 | # the conn should have timed out. |
| 60 | p2 = None |
| 61 | self.assert_equal(p2, None, ": packet should have been dropped") |
| 62 | |
| 63 | def test_0010_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 64 | """IPv4 basic connectivity test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 65 | self.run_basic_conn_test(AF_INET, 0) |
| 66 | |
| 67 | def test_0011_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 68 | """IPv6 basic connectivity test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 69 | self.run_basic_conn_test(AF_INET6, 0) |
| 70 | |
| 71 | def test_0050_loopback_prepare_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 72 | """Create loopbacks overlapping with remote addresses""" |
Klement Sekera | b9ef273 | 2018-06-24 22:49:33 +0200 | [diff] [blame] | 73 | self.create_loopback_interfaces(2) |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 74 | for i in range(2): |
| 75 | intf = self.lo_interfaces[i] |
| 76 | intf.admin_up() |
Jakub Grajciar | 053204a | 2019-03-18 13:17:53 +0100 | [diff] [blame] | 77 | intf.local_ip4 = self.pg_interfaces[i].remote_ip4 |
| 78 | intf.local_ip4_prefix_len = 32 |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 79 | intf.config_ip4() |
Jakub Grajciar | 053204a | 2019-03-18 13:17:53 +0100 | [diff] [blame] | 80 | intf.local_ip6 = self.pg_interfaces[i].remote_ip6 |
| 81 | intf.local_ip6_prefix_len = 128 |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 82 | intf.config_ip6() |
| 83 | |
| 84 | def test_0110_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 85 | """IPv4 local-spoof connectivity test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 86 | self.run_negative_conn_test(AF_INET, 0) |
| 87 | |
| 88 | def test_0111_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 89 | """IPv6 local-spoof connectivity test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 90 | self.run_negative_conn_test(AF_INET, 1) |
| 91 | |
| 92 | def test_0200_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 93 | """Configure container commands""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 94 | for i in range(2): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 95 | for addr in [ |
| 96 | self.pg_interfaces[i].remote_ip4, |
| 97 | self.pg_interfaces[i].remote_ip6, |
| 98 | ]: |
| 99 | self.vapi.ppcli( |
| 100 | "ip container " + addr + " " + self.pg_interfaces[i].name |
| 101 | ) |
| 102 | self.vapi.ppcli( |
| 103 | "stn rule address " |
| 104 | + addr |
| 105 | + " interface " |
| 106 | + self.pg_interfaces[i].name |
| 107 | ) |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 108 | |
| 109 | def test_0210_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 110 | """IPv4 test after configuring container""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 111 | self.run_basic_conn_test(AF_INET, 0) |
| 112 | |
| 113 | def test_0211_basic_conn_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 114 | """IPv6 test after configuring container""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 115 | self.run_basic_conn_test(AF_INET, 1) |
| 116 | |
| 117 | def test_0300_unconfigure_commands(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 118 | """Unconfigure container commands""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 119 | for i in range(2): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 120 | for addr in [ |
| 121 | self.pg_interfaces[i].remote_ip4, |
| 122 | self.pg_interfaces[i].remote_ip6, |
| 123 | ]: |
| 124 | self.vapi.ppcli( |
| 125 | "ip container " + addr + " " + self.pg_interfaces[i].name + " del" |
| 126 | ) |
| 127 | self.vapi.ppcli( |
| 128 | "stn rule address " |
| 129 | + addr |
| 130 | + " interface " |
| 131 | + self.pg_interfaces[i].name |
| 132 | + " del" |
| 133 | ) |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 134 | |
| 135 | def test_0410_spoof_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 136 | """IPv4 local-spoof after unconfig test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 137 | self.run_negative_conn_test(AF_INET, 0) |
| 138 | |
| 139 | def test_0411_spoof_test(self): |
Klement Sekera | d9b0c6f | 2022-04-26 19:02:15 +0200 | [diff] [blame] | 140 | """IPv6 local-spoof after unconfig test""" |
Andrew Yourtchenko | 5f3fcb9 | 2017-10-25 05:50:37 -0700 | [diff] [blame] | 141 | self.run_negative_conn_test(AF_INET, 1) |