blob: 318a4a81f4440b9de1b90339a41fadc8b6452d97 [file] [log] [blame]
Renato Botelho do Coutoead1e532019-10-31 13:31:07 -05001#!/usr/bin/env python3
Jane546d3b2016-12-08 13:10:03 +01002"""IP4 VRF Multi-instance Test Case HLD:
3
4**NOTES:**
5 - higher number of pg-ip4 interfaces causes problems => only 15 pg-ip4 \
Dave Wallaced1706812021-08-12 18:36:02 -04006 interfaces in 5 VRFs are tested
Jane546d3b2016-12-08 13:10:03 +01007 - jumbo packets in configuration with 15 pg-ip4 interfaces leads to \
Dave Wallaced1706812021-08-12 18:36:02 -04008 problems too
Jane546d3b2016-12-08 13:10:03 +01009
10**config 1**
11 - add 15 pg-ip4 interfaces
12 - configure 5 hosts per pg-ip4 interface
13 - configure 4 VRFs
14 - add 3 pg-ip4 interfaces per VRF
15
16**test 1**
17 - send IP4 packets between all pg-ip4 interfaces in all VRF groups
18
19**verify 1**
20 - check VRF data by parsing output of ip_fib_dump API command
Dave Wallaced1706812021-08-12 18:36:02 -040021 - all packets received correctly in case of pg-ip4 interfaces in the
22 same VRF
Jane546d3b2016-12-08 13:10:03 +010023 - no packet received in case of pg-ip4 interfaces not in VRF
Jan Geletyd16ba622018-06-21 16:57:47 +020024 - no packet received in case of pg-ip4 interfaces in different VRFs
Jane546d3b2016-12-08 13:10:03 +010025
26**config 2**
Jan Gelety95c87b52017-02-27 10:46:14 +010027 - reset 2 VRFs
Jane546d3b2016-12-08 13:10:03 +010028
29**test 2**
30 - send IP4 packets between all pg-ip4 interfaces in all VRF groups
31
32**verify 2**
Dave Wallaced1706812021-08-12 18:36:02 -040033 - all packets received correctly in case of pg-ip4 interfaces in the
34 same VRF
Jane546d3b2016-12-08 13:10:03 +010035 - no packet received in case of pg-ip4 interfaces not in VRF
Jan Geletyd16ba622018-06-21 16:57:47 +020036 - no packet received in case of pg-ip4 interfaces in different VRFs
Jane546d3b2016-12-08 13:10:03 +010037
38**config 3**
Jan Gelety95c87b52017-02-27 10:46:14 +010039 - add 1 of reset VRFs and 1 new VRF
Jane546d3b2016-12-08 13:10:03 +010040
41**test 3**
42 - send IP4 packets between all pg-ip4 interfaces in all VRF groups
43
44**verify 3**
45 - check VRF data by parsing output of ip_fib_dump API command
Dave Wallaced1706812021-08-12 18:36:02 -040046 - all packets received correctly in case of pg-ip4 interfaces in the
47 same VRF
Jane546d3b2016-12-08 13:10:03 +010048 - no packet received in case of pg-ip4 interfaces not in VRF
Jan Geletyd16ba622018-06-21 16:57:47 +020049 - no packet received in case of pg-ip4 interfaces in different VRFs
Jane546d3b2016-12-08 13:10:03 +010050
51**config 4**
Jan Gelety95c87b52017-02-27 10:46:14 +010052 - reset all created VRFs
Jane546d3b2016-12-08 13:10:03 +010053
54**test 4**
55 - send IP4 packets between all pg-ip4 interfaces in all VRF groups
56
57**verify 4**
58 - check VRF data by parsing output of ip_fib_dump API command
Dave Wallaced1706812021-08-12 18:36:02 -040059 - all packets received correctly in case of pg-ip4 interfaces in the
60 same VRF
Jane546d3b2016-12-08 13:10:03 +010061 - no packet received in case of pg-ip4 interfaces not in VRF
Jan Geletyd16ba622018-06-21 16:57:47 +020062 - no packet received in case of pg-ip4 interfaces in different VRFs
Jane546d3b2016-12-08 13:10:03 +010063"""
64
65import unittest
66import random
67
68from scapy.packet import Raw
snaramre5d4b8912019-12-13 23:39:35 +000069from scapy.layers.l2 import Ether, ARP
70from scapy.layers.inet import IP, UDP
Jane546d3b2016-12-08 13:10:03 +010071
Dave Wallace8800f732023-08-31 00:47:44 -040072from framework import VppTestCase
73from asfframework import VppTestRunner
Jane546d3b2016-12-08 13:10:03 +010074from util import ppp
Jan Gelety95c87b52017-02-27 10:46:14 +010075from vrf import VRFState
Jane546d3b2016-12-08 13:10:03 +010076
77
78def is_ipv4_misc(p):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020079 """Is packet one of uninteresting IPv4 broadcasts?"""
Jane546d3b2016-12-08 13:10:03 +010080 if p.haslayer(ARP):
81 return True
82 return False
83
84
85class TestIp4VrfMultiInst(VppTestCase):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020086 """IP4 VRF Multi-instance Test Case"""
Jane546d3b2016-12-08 13:10:03 +010087
88 @classmethod
89 def setUpClass(cls):
90 """
91 Perform standard class setup (defined by class method setUpClass in
92 class VppTestCase) before running the test case, set test case related
93 variables and configure VPP.
94 """
95 super(TestIp4VrfMultiInst, cls).setUpClass()
96
97 # Test variables
98 cls.hosts_per_pg = 5
99 cls.nr_of_vrfs = 5
100 cls.pg_ifs_per_vrf = 3
101
102 try:
103 # Create pg interfaces
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200104 cls.create_pg_interfaces(range(cls.nr_of_vrfs * cls.pg_ifs_per_vrf))
Jane546d3b2016-12-08 13:10:03 +0100105
106 # Packet flows mapping pg0 -> pg1, pg2 etc.
107 cls.flows = dict()
108 for i in range(len(cls.pg_interfaces)):
Ole Troan19757332019-10-18 14:54:30 +0200109 multiplicand = i // cls.pg_ifs_per_vrf
Jane546d3b2016-12-08 13:10:03 +0100110 pg_list = [
111 cls.pg_interfaces[multiplicand * cls.pg_ifs_per_vrf + j]
112 for j in range(cls.pg_ifs_per_vrf)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200113 if (multiplicand * cls.pg_ifs_per_vrf + j) != i
114 ]
Jane546d3b2016-12-08 13:10:03 +0100115 cls.flows[cls.pg_interfaces[i]] = pg_list
116
117 # Packet sizes - jumbo packet (9018 bytes) skipped
118 cls.pg_if_packet_sizes = [64, 512, 1518]
119
120 # Set up all interfaces
121 for pg_if in cls.pg_interfaces:
122 pg_if.admin_up()
123 pg_if.generate_remote_hosts(cls.hosts_per_pg)
124
125 # Create list of VRFs
126 cls.vrf_list = list()
127
Jan Gelety95c87b52017-02-27 10:46:14 +0100128 # Create list of reset VRFs
129 cls.vrf_reset_list = list()
Jane546d3b2016-12-08 13:10:03 +0100130
131 # Create list of pg_interfaces in VRFs
132 cls.pg_in_vrf = list()
133
Jan Geletyd16ba622018-06-21 16:57:47 +0200134 # Create list of pg_interfaces not in VRFs
Jane546d3b2016-12-08 13:10:03 +0100135 cls.pg_not_in_vrf = [pg_if for pg_if in cls.pg_interfaces]
136
137 # Create mapping of pg_interfaces to VRF IDs
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200138 cls.pg_if_sets = dict()
Jane546d3b2016-12-08 13:10:03 +0100139 for i in range(cls.nr_of_vrfs):
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200140 set_id = i + 1
Jane546d3b2016-12-08 13:10:03 +0100141 pg_list = [
142 cls.pg_interfaces[i * cls.pg_ifs_per_vrf + j]
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200143 for j in range(cls.pg_ifs_per_vrf)
144 ]
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200145 cls.pg_if_sets[set_id] = pg_list
Jane546d3b2016-12-08 13:10:03 +0100146
147 except Exception:
148 super(TestIp4VrfMultiInst, cls).tearDownClass()
149 raise
150
Paul Vinciguerra7f9b7f92019-03-12 19:23:27 -0700151 @classmethod
152 def tearDownClass(cls):
153 super(TestIp4VrfMultiInst, cls).tearDownClass()
154
Jane546d3b2016-12-08 13:10:03 +0100155 def setUp(self):
Jan Gelety3900fe52017-01-26 15:46:19 +0100156 """
Jane546d3b2016-12-08 13:10:03 +0100157 Clear trace and packet infos before running each test.
158 """
159 super(TestIp4VrfMultiInst, self).setUp()
160 self.reset_packet_infos()
161
162 def tearDown(self):
163 """
164 Show various debug prints after each test.
165 """
166 super(TestIp4VrfMultiInst, self).tearDown()
Paul Vinciguerra90cf21b2019-03-13 09:23:05 -0700167
168 def show_commands_at_teardown(self):
169 self.logger.info(self.vapi.ppcli("show ip fib"))
Neale Rannscbe25aa2019-09-30 10:53:31 +0000170 self.logger.info(self.vapi.ppcli("show ip4 neighbors"))
Jane546d3b2016-12-08 13:10:03 +0100171
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200172 def _assign_interfaces(self, vrf_id, if_set_id):
173 for i in range(self.pg_ifs_per_vrf):
174 pg_if = self.pg_if_sets[if_set_id][i]
175 pg_if.set_table_ip4(vrf_id)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200176 self.logger.info(
177 "pg-interface %s added to IPv4 VRF ID %d" % (pg_if.name, vrf_id)
178 )
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200179 if pg_if not in self.pg_in_vrf:
180 self.pg_in_vrf.append(pg_if)
181 if pg_if in self.pg_not_in_vrf:
182 self.pg_not_in_vrf.remove(pg_if)
183 pg_if.config_ip4()
184 pg_if.configure_ipv4_neighbors()
185
Jane546d3b2016-12-08 13:10:03 +0100186 def create_vrf_and_assign_interfaces(self, count, start=1):
Jan Gelety3900fe52017-01-26 15:46:19 +0100187 """
Jan Geletyd16ba622018-06-21 16:57:47 +0200188 Create required number of FIB tables / VRFs, put 3 pg-ip4 interfaces
Jane546d3b2016-12-08 13:10:03 +0100189 to every FIB table / VRF.
190
191 :param int count: Number of FIB tables / VRFs to be created.
192 :param int start: Starting number of the FIB table / VRF ID. \
193 (Default value = 1)
194 """
195
196 for i in range(count):
197 vrf_id = i + start
Benoît Ganneff570d32024-04-16 09:36:05 +0200198 self.vapi.ip_table_add_del_v2(is_add=1, table={"table_id": vrf_id})
Jane546d3b2016-12-08 13:10:03 +0100199 self.logger.info("IPv4 VRF ID %d created" % vrf_id)
200 if vrf_id not in self.vrf_list:
201 self.vrf_list.append(vrf_id)
Jan Gelety95c87b52017-02-27 10:46:14 +0100202 if vrf_id in self.vrf_reset_list:
203 self.vrf_reset_list.remove(vrf_id)
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200204 self._assign_interfaces(vrf_id, vrf_id)
Jane546d3b2016-12-08 13:10:03 +0100205 self.logger.debug(self.vapi.ppcli("show ip fib"))
Neale Rannscbe25aa2019-09-30 10:53:31 +0000206 self.logger.debug(self.vapi.ppcli("show ip4 neighbors"))
Jane546d3b2016-12-08 13:10:03 +0100207
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200208 def create_vrf_by_id_and_assign_interfaces(self, set_id, vrf_id=0xFFFFFFFF):
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200209 """
210 Create a FIB table / VRF by vrf_id, put 3 pg-ip4 interfaces
211 to FIB table / VRF.
212
213 :param int vrf_id: Required table ID / VRF ID. \
214 (Default value = 0xffffffff, ID will be selected automatically)
215 """
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200216 ret = self.vapi.ip_table_allocate(table={"table_id": vrf_id})
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200217 vrf_id = ret.table.table_id
218 self.logger.info("IPv4 VRF ID %d created" % vrf_id)
219 if vrf_id not in self.vrf_list:
220 self.vrf_list.append(vrf_id)
221 if vrf_id in self.vrf_reset_list:
222 self.vrf_reset_list.remove(vrf_id)
223 self._assign_interfaces(vrf_id, set_id)
224 self.logger.debug(self.vapi.ppcli("show ip fib"))
225 self.logger.debug(self.vapi.ppcli("show ip4 neighbors"))
226
227 return vrf_id
228
229 def reset_vrf_and_remove_from_vrf_list(self, vrf_id, if_set_id=None):
Jan Gelety3900fe52017-01-26 15:46:19 +0100230 """
Jan Gelety95c87b52017-02-27 10:46:14 +0100231 Reset required FIB table / VRF and remove it from VRF list.
Jane546d3b2016-12-08 13:10:03 +0100232
Jan Gelety95c87b52017-02-27 10:46:14 +0100233 :param int vrf_id: The FIB table / VRF ID to be reset.
Jane546d3b2016-12-08 13:10:03 +0100234 """
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200235 if if_set_id is None:
236 if_set_id = vrf_id
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200237 self.vapi.ip_table_flush(table={"table_id": vrf_id})
Jane546d3b2016-12-08 13:10:03 +0100238 if vrf_id in self.vrf_list:
239 self.vrf_list.remove(vrf_id)
Jan Gelety95c87b52017-02-27 10:46:14 +0100240 if vrf_id not in self.vrf_reset_list:
241 self.vrf_reset_list.append(vrf_id)
Jane546d3b2016-12-08 13:10:03 +0100242 for j in range(self.pg_ifs_per_vrf):
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200243 pg_if = self.pg_if_sets[if_set_id][j]
Neale Ranns4008ac92017-02-13 23:20:04 -0800244 pg_if.unconfig_ip4()
Jane546d3b2016-12-08 13:10:03 +0100245 if pg_if in self.pg_in_vrf:
246 self.pg_in_vrf.remove(pg_if)
247 if pg_if not in self.pg_not_in_vrf:
248 self.pg_not_in_vrf.append(pg_if)
Jan Gelety95c87b52017-02-27 10:46:14 +0100249 self.logger.info("IPv4 VRF ID %d reset finished" % vrf_id)
Jane546d3b2016-12-08 13:10:03 +0100250 self.logger.debug(self.vapi.ppcli("show ip fib"))
Neale Rannscbe25aa2019-09-30 10:53:31 +0000251 self.logger.debug(self.vapi.ppcli("show ip neighbors"))
Benoît Ganneff570d32024-04-16 09:36:05 +0200252 self.vapi.ip_table_add_del_v2(is_add=0, table={"table_id": vrf_id})
Jane546d3b2016-12-08 13:10:03 +0100253
254 def create_stream(self, src_if, packet_sizes):
255 """
256 Create input packet stream for defined interface using hosts list.
257
258 :param object src_if: Interface to create packet stream for.
259 :param list packet_sizes: List of required packet sizes.
260 :return: Stream of packets.
261 """
262 pkts = []
263 src_hosts = src_if.remote_hosts
264 for dst_if in self.flows[src_if]:
265 for dst_host in dst_if.remote_hosts:
266 src_host = random.choice(src_hosts)
267 pkt_info = self.create_packet_info(src_if, dst_if)
268 payload = self.info_to_payload(pkt_info)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200269 p = (
270 Ether(dst=src_if.local_mac, src=src_host.mac)
271 / IP(src=src_host.ip4, dst=dst_host.ip4)
272 / UDP(sport=1234, dport=1234)
273 / Raw(payload)
274 )
Jane546d3b2016-12-08 13:10:03 +0100275 pkt_info.data = p.copy()
276 size = random.choice(packet_sizes)
277 self.extend_packet(p, size)
278 pkts.append(p)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200279 self.logger.debug(
280 "Input stream created for port %s. Length: %u pkt(s)"
281 % (src_if.name, len(pkts))
282 )
Jane546d3b2016-12-08 13:10:03 +0100283 return pkts
284
Jan Geletyd16ba622018-06-21 16:57:47 +0200285 def create_stream_crosswise_vrf(self, src_if, vrf_id, packet_sizes):
286 """
287 Create input packet stream for negative test for leaking across
288 different VRFs for defined interface using hosts list.
289
290 :param object src_if: Interface to create packet stream for.
291 :param int vrf_id: The FIB table / VRF ID where src_if is assigned.
292 :param list packet_sizes: List of required packet sizes.
293 :return: Stream of packets.
294 """
295 pkts = []
296 src_hosts = src_if.remote_hosts
297 vrf_lst = list(self.vrf_list)
298 vrf_lst.remove(vrf_id)
299 for vrf in vrf_lst:
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200300 for dst_if in self.pg_if_sets[vrf]:
Jan Geletyd16ba622018-06-21 16:57:47 +0200301 for dst_host in dst_if.remote_hosts:
302 src_host = random.choice(src_hosts)
303 pkt_info = self.create_packet_info(src_if, dst_if)
304 payload = self.info_to_payload(pkt_info)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200305 p = (
306 Ether(dst=src_if.local_mac, src=src_host.mac)
307 / IP(src=src_host.ip4, dst=dst_host.ip4)
308 / UDP(sport=1234, dport=1234)
309 / Raw(payload)
310 )
Jan Geletyd16ba622018-06-21 16:57:47 +0200311 pkt_info.data = p.copy()
312 size = random.choice(packet_sizes)
313 self.extend_packet(p, size)
314 pkts.append(p)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200315 self.logger.debug(
316 "Input stream created for port %s. Length: %u pkt(s)"
317 % (src_if.name, len(pkts))
318 )
Jan Geletyd16ba622018-06-21 16:57:47 +0200319 return pkts
320
Jane546d3b2016-12-08 13:10:03 +0100321 def verify_capture(self, pg_if, capture):
322 """
323 Verify captured input packet stream for defined interface.
324
325 :param object pg_if: Interface to verify captured packet stream for.
326 :param list capture: Captured packet stream.
327 """
328 last_info = dict()
329 for i in self.pg_interfaces:
330 last_info[i.sw_if_index] = None
331 dst_sw_if_index = pg_if.sw_if_index
332 for packet in capture:
333 try:
334 ip = packet[IP]
335 udp = packet[UDP]
Paul Vinciguerraeaea4212019-03-06 11:58:06 -0800336 payload_info = self.payload_to_info(packet[Raw])
Jane546d3b2016-12-08 13:10:03 +0100337 packet_index = payload_info.index
338 self.assertEqual(payload_info.dst, dst_sw_if_index)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200339 self.logger.debug(
340 "Got packet on port %s: src=%u (id=%u)"
341 % (pg_if.name, payload_info.src, packet_index)
342 )
Jane546d3b2016-12-08 13:10:03 +0100343 next_info = self.get_next_packet_info_for_interface2(
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200344 payload_info.src, dst_sw_if_index, last_info[payload_info.src]
345 )
Jane546d3b2016-12-08 13:10:03 +0100346 last_info[payload_info.src] = next_info
347 self.assertIsNotNone(next_info)
348 self.assertEqual(packet_index, next_info.index)
349 saved_packet = next_info.data
350 # Check standard fields
351 self.assertEqual(ip.src, saved_packet[IP].src)
352 self.assertEqual(ip.dst, saved_packet[IP].dst)
353 self.assertEqual(udp.sport, saved_packet[UDP].sport)
354 self.assertEqual(udp.dport, saved_packet[UDP].dport)
355 except:
356 self.logger.error(ppp("Unexpected or invalid packet:", packet))
357 raise
358 for i in self.pg_interfaces:
359 remaining_packet = self.get_next_packet_info_for_interface2(
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200360 i, dst_sw_if_index, last_info[i.sw_if_index]
361 )
Jane546d3b2016-12-08 13:10:03 +0100362 self.assertIsNone(
363 remaining_packet,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200364 "Port %u: Packet expected from source %u didn't arrive"
365 % (dst_sw_if_index, i.sw_if_index),
366 )
Jane546d3b2016-12-08 13:10:03 +0100367
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200368 def verify_vrf(self, vrf_id, if_set_id=None):
Jane546d3b2016-12-08 13:10:03 +0100369 """
370 Check if the FIB table / VRF ID is configured.
371
372 :param int vrf_id: The FIB table / VRF ID to be verified.
373 :return: 1 if the FIB table / VRF ID is configured, otherwise return 0.
374 """
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200375 if if_set_id is None:
376 if_set_id = vrf_id
Neale Ranns097fa662018-05-01 05:17:55 -0700377 ip_fib_dump = self.vapi.ip_route_dump(vrf_id)
378 vrf_exist = len(ip_fib_dump)
Jane546d3b2016-12-08 13:10:03 +0100379 vrf_count = 0
380 for ip_fib_details in ip_fib_dump:
Neale Ranns097fa662018-05-01 05:17:55 -0700381 addr = ip_fib_details.route.prefix.network_address
382 found = False
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200383 for pg_if in self.pg_if_sets[if_set_id]:
Neale Ranns097fa662018-05-01 05:17:55 -0700384 if found:
385 break
386 for host in pg_if.remote_hosts:
387 if str(addr) == host.ip4:
388 vrf_count += 1
389 found = True
Jan Gelety95c87b52017-02-27 10:46:14 +0100390 break
Jan Gelety95c87b52017-02-27 10:46:14 +0100391 if not vrf_exist and vrf_count == 0:
Jane546d3b2016-12-08 13:10:03 +0100392 self.logger.info("IPv4 VRF ID %d is not configured" % vrf_id)
Jan Gelety95c87b52017-02-27 10:46:14 +0100393 return VRFState.not_configured
394 elif vrf_exist and vrf_count == 0:
395 self.logger.info("IPv4 VRF ID %d has been reset" % vrf_id)
396 return VRFState.reset
Jane546d3b2016-12-08 13:10:03 +0100397 else:
398 self.logger.info("IPv4 VRF ID %d is configured" % vrf_id)
Jan Gelety95c87b52017-02-27 10:46:14 +0100399 return VRFState.configured
Jane546d3b2016-12-08 13:10:03 +0100400
401 def run_verify_test(self):
402 """
Jan Geletyd16ba622018-06-21 16:57:47 +0200403 Create packet streams for all configured pg interfaces, send all \
Jane546d3b2016-12-08 13:10:03 +0100404 prepared packet streams and verify that:
Jan Geletyd16ba622018-06-21 16:57:47 +0200405 - all packets received correctly on all pg-ip4 interfaces assigned
406 to VRFs
407 - no packet received on all pg-ip4 interfaces not assigned to VRFs
Jane546d3b2016-12-08 13:10:03 +0100408
Jan Geletyd16ba622018-06-21 16:57:47 +0200409 :raise RuntimeError: If no packet captured on pg-ip4 interface assigned
410 to VRF or if any packet is captured on pg-ip4 interface not
411 assigned to VRF.
Jane546d3b2016-12-08 13:10:03 +0100412 """
413 # Test
414 # Create incoming packet streams for packet-generator interfaces
415 for pg_if in self.pg_interfaces:
416 pkts = self.create_stream(pg_if, self.pg_if_packet_sizes)
417 pg_if.add_stream(pkts)
418
419 # Enable packet capture and start packet sending
420 self.pg_enable_capture(self.pg_interfaces)
421 self.pg_start()
422
423 # Verify
424 # Verify outgoing packet streams per packet-generator interface
425 for pg_if in self.pg_interfaces:
426 if pg_if in self.pg_in_vrf:
427 capture = pg_if.get_capture(remark="interface is in VRF")
428 self.verify_capture(pg_if, capture)
429 elif pg_if in self.pg_not_in_vrf:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200430 pg_if.assert_nothing_captured(
431 remark="interface is not in VRF", filter_out_fn=is_ipv4_misc
432 )
Jane546d3b2016-12-08 13:10:03 +0100433 self.logger.debug("No capture for interface %s" % pg_if.name)
434 else:
435 raise Exception("Unknown interface: %s" % pg_if.name)
436
Jan Geletyd16ba622018-06-21 16:57:47 +0200437 def run_crosswise_vrf_test(self):
438 """
439 Create packet streams for every pg-ip4 interface in VRF towards all
Dave Wallaced1706812021-08-12 18:36:02 -0400440 pg-ip4 interfaces in other VRFs, send all prepared packet streams and
Jan Geletyd16ba622018-06-21 16:57:47 +0200441 verify that:
Dave Wallaced1706812021-08-12 18:36:02 -0400442
443 - no packet received on all configured pg-ip4 interfaces
Jan Geletyd16ba622018-06-21 16:57:47 +0200444
445 :raise RuntimeError: If any packet is captured on any pg-ip4 interface.
446 """
447 # Test
448 # Create incoming packet streams for packet-generator interfaces
449 for vrf_id in self.vrf_list:
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200450 for pg_if in self.pg_if_sets[vrf_id]:
Jan Geletyd16ba622018-06-21 16:57:47 +0200451 pkts = self.create_stream_crosswise_vrf(
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200452 pg_if, vrf_id, self.pg_if_packet_sizes
453 )
Jan Geletyd16ba622018-06-21 16:57:47 +0200454 pg_if.add_stream(pkts)
455
456 # Enable packet capture and start packet sending
457 self.pg_enable_capture(self.pg_interfaces)
458 self.pg_start()
459
460 # Verify
461 # Verify outgoing packet streams per packet-generator interface
462 for pg_if in self.pg_interfaces:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200463 pg_if.assert_nothing_captured(
464 remark="interface is in other VRF", filter_out_fn=is_ipv4_misc
465 )
Jan Geletyd16ba622018-06-21 16:57:47 +0200466 self.logger.debug("No capture for interface %s" % pg_if.name)
467
Jane546d3b2016-12-08 13:10:03 +0100468 def test_ip4_vrf_01(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200469 """IP4 VRF Multi-instance test 1 - create 4 VRFs"""
Jane546d3b2016-12-08 13:10:03 +0100470 # Config 1
471 # Create 4 VRFs
472 self.create_vrf_and_assign_interfaces(4)
473
474 # Verify 1
475 for vrf_id in self.vrf_list:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200476 self.assert_equal(self.verify_vrf(vrf_id), VRFState.configured, VRFState)
Jane546d3b2016-12-08 13:10:03 +0100477
478 # Test 1
479 self.run_verify_test()
Jan Geletyd16ba622018-06-21 16:57:47 +0200480 self.run_crosswise_vrf_test()
Jane546d3b2016-12-08 13:10:03 +0100481
482 def test_ip4_vrf_02(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200483 """IP4 VRF Multi-instance test 2 - reset 2 VRFs"""
Jane546d3b2016-12-08 13:10:03 +0100484 # Config 2
Jan Gelety95c87b52017-02-27 10:46:14 +0100485 # Reset 2 VRFs
486 self.reset_vrf_and_remove_from_vrf_list(1)
487 self.reset_vrf_and_remove_from_vrf_list(2)
Jane546d3b2016-12-08 13:10:03 +0100488
489 # Verify 2
Jan Gelety95c87b52017-02-27 10:46:14 +0100490 for vrf_id in self.vrf_reset_list:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200491 self.assert_equal(self.verify_vrf(vrf_id), VRFState.reset, VRFState)
Jane546d3b2016-12-08 13:10:03 +0100492 for vrf_id in self.vrf_list:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200493 self.assert_equal(self.verify_vrf(vrf_id), VRFState.configured, VRFState)
Jane546d3b2016-12-08 13:10:03 +0100494
495 # Test 2
496 self.run_verify_test()
Jan Geletyd16ba622018-06-21 16:57:47 +0200497 self.run_crosswise_vrf_test()
Jane546d3b2016-12-08 13:10:03 +0100498
499 def test_ip4_vrf_03(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200500 """IP4 VRF Multi-instance 3 - add 2 VRFs"""
Jane546d3b2016-12-08 13:10:03 +0100501 # Config 3
Jan Gelety95c87b52017-02-27 10:46:14 +0100502 # Add 1 of reset VRFs and 1 new VRF
Jane546d3b2016-12-08 13:10:03 +0100503 self.create_vrf_and_assign_interfaces(1)
504 self.create_vrf_and_assign_interfaces(1, start=5)
505
506 # Verify 3
Jan Gelety95c87b52017-02-27 10:46:14 +0100507 for vrf_id in self.vrf_reset_list:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200508 self.assert_equal(self.verify_vrf(vrf_id), VRFState.reset, VRFState)
Jane546d3b2016-12-08 13:10:03 +0100509 for vrf_id in self.vrf_list:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200510 self.assert_equal(self.verify_vrf(vrf_id), VRFState.configured, VRFState)
Jane546d3b2016-12-08 13:10:03 +0100511
512 # Test 3
513 self.run_verify_test()
Jan Geletyd16ba622018-06-21 16:57:47 +0200514 self.run_crosswise_vrf_test()
Jane546d3b2016-12-08 13:10:03 +0100515
516 def test_ip4_vrf_04(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200517 """IP4 VRF Multi-instance test 4 - reset 4 VRFs"""
Jane546d3b2016-12-08 13:10:03 +0100518 # Config 4
Jan Gelety95c87b52017-02-27 10:46:14 +0100519 # Reset all VRFs (i.e. no VRF except VRF=0 configured)
Jane546d3b2016-12-08 13:10:03 +0100520 for i in range(len(self.vrf_list)):
Jan Gelety95c87b52017-02-27 10:46:14 +0100521 self.reset_vrf_and_remove_from_vrf_list(self.vrf_list[0])
Jane546d3b2016-12-08 13:10:03 +0100522
523 # Verify 4
Jan Gelety95c87b52017-02-27 10:46:14 +0100524 for vrf_id in self.vrf_reset_list:
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200525 self.assert_equal(self.verify_vrf(vrf_id), VRFState.reset, VRFState)
Jan Gelety95c87b52017-02-27 10:46:14 +0100526 vrf_list_length = len(self.vrf_list)
527 self.assertEqual(
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200528 vrf_list_length,
529 0,
530 "List of configured VRFs is not empty: %s != 0" % vrf_list_length,
531 )
Jane546d3b2016-12-08 13:10:03 +0100532
533 # Test 4
534 self.run_verify_test()
Jan Geletyd16ba622018-06-21 16:57:47 +0200535 self.run_crosswise_vrf_test()
Jane546d3b2016-12-08 13:10:03 +0100536
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200537 def test_ip4_vrf_05(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200538 """IP4 VRF Multi-instance test 5 - id allocation"""
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200539 # Config 5
540 # Create several VRFs
541 # Set vrf_id manually first
542 self.create_vrf_by_id_and_assign_interfaces(1, 1)
543 # Set vrf_id automatically a few times
544 auto_vrf_id = [
545 self.create_vrf_by_id_and_assign_interfaces(i) for i in range(2, 5)
546 ]
547
548 # Verify 5
549 self.assert_equal(self.verify_vrf(1, 1), VRFState.configured, VRFState)
550 for i, vrf in enumerate(auto_vrf_id):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200551 self.assert_equal(
552 self.verify_vrf(vrf, i + 2), VRFState.configured, VRFState
553 )
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200554
555 # Test 5
556 self.run_verify_test()
557
558 # Config 5.1
559 # Reset VRFs
560 self.reset_vrf_and_remove_from_vrf_list(1)
561 for i, vrf in enumerate(auto_vrf_id):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200562 self.reset_vrf_and_remove_from_vrf_list(vrf, i + 2)
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200563
564 # Verify 5.1
565 self.assert_equal(self.verify_vrf(1, 1), VRFState.reset, VRFState)
566 for i, vrf in enumerate(auto_vrf_id):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200567 self.assert_equal(self.verify_vrf(vrf, i + 2), VRFState.reset, VRFState)
Aloys Augustin6e4cfb52021-09-16 20:53:14 +0200568
569 vrf_list_length = len(self.vrf_list)
570 self.assertEqual(
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200571 vrf_list_length,
572 0,
573 "List of configured VRFs is not empty: %s != 0" % vrf_list_length,
574 )
Jane546d3b2016-12-08 13:10:03 +0100575
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200576
577if __name__ == "__main__":
Jane546d3b2016-12-08 13:10:03 +0100578 unittest.main(testRunner=VppTestRunner)