Skip to content

Commit ce75e16

Browse files
authored
[pytest]: add get_ip_route_info in SonicHost (#1618)
get_ip_route_info returns ip route info in the kernel for a given destination ip refactor test_default_route to use the new method Signed-off-by: Guohan Lu <[email protected]>
1 parent e7dab70 commit ce75e16

File tree

2 files changed

+82
-73
lines changed

2 files changed

+82
-73
lines changed

tests/common/devices.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import logging
1212
import os
1313
import re
14+
import ipaddress
1415
from multiprocessing.pool import ThreadPool
1516
from datetime import datetime
1617

@@ -358,6 +359,7 @@ def get_syncd_docker_names(self):
358359
for npu in range(0,num_npus):
359360
syncd_docker_names.append("syncd{}".format(npu))
360361
return syncd_docker_names
362+
361363
def get_swss_docker_names(self):
362364
swss_docker_names = []
363365
if self.facts["num_npu"] == 1:
@@ -430,6 +432,69 @@ def no_shutdown(self, ifname):
430432
"""
431433
return self.command("sudo config interface startup {}".format(ifname))
432434

435+
def get_ip_route_info(self, dstip):
436+
"""
437+
@summary: return route information for a destionation IP
438+
439+
@param dstip: destination IP (either ipv4 or ipv6)
440+
441+
============ 4.19 kernel ==============
442+
admin@vlab-01:~$ ip route list match 0.0.0.0
443+
default proto bgp src 10.1.0.32 metric 20
444+
nexthop via 10.0.0.57 dev PortChannel0001 weight 1
445+
nexthop via 10.0.0.59 dev PortChannel0002 weight 1
446+
nexthop via 10.0.0.61 dev PortChannel0003 weight 1
447+
nexthop via 10.0.0.63 dev PortChannel0004 weight 1
448+
449+
admin@vlab-01:~$ ip -6 route list match ::
450+
default proto bgp src fc00:1::32 metric 20
451+
nexthop via fc00::72 dev PortChannel0001 weight 1
452+
nexthop via fc00::76 dev PortChannel0002 weight 1
453+
nexthop via fc00::7a dev PortChannel0003 weight 1
454+
nexthop via fc00::7e dev PortChannel0004 weight 1 pref medium
455+
456+
============ 4.9 kernel ===============
457+
admin@vlab-01:~$ ip route list match 0.0.0.0
458+
default proto 186 src 10.1.0.32 metric 20
459+
nexthop via 10.0.0.57 dev PortChannel0001 weight 1
460+
nexthop via 10.0.0.59 dev PortChannel0002 weight 1
461+
nexthop via 10.0.0.61 dev PortChannel0003 weight 1
462+
nexthop via 10.0.0.63 dev PortChannel0004 weight 1
463+
464+
admin@vlab-01:~$ ip -6 route list match ::
465+
default via fc00::72 dev PortChannel0001 proto 186 src fc00:1::32 metric 20 pref medium
466+
default via fc00::76 dev PortChannel0002 proto 186 src fc00:1::32 metric 20 pref medium
467+
default via fc00::7a dev PortChannel0003 proto 186 src fc00:1::32 metric 20 pref medium
468+
default via fc00::7e dev PortChannel0004 proto 186 src fc00:1::32 metric 20 pref medium
469+
470+
"""
471+
472+
if dstip.version == 4:
473+
rt = self.command("ip route list match {}".format(dstip))['stdout_lines']
474+
else:
475+
rt = self.command("ip -6 route list match {}".format(dstip))['stdout_lines']
476+
477+
logging.info("route raw info for {}: {}".format(dstip, rt))
478+
479+
rtinfo = {'set_src': None, 'nexthops': [] }
480+
481+
# parse set_src
482+
m = re.match(r"^default proto (bgp|186) src (\S+)", rt[0])
483+
m1 = re.match(r"^default via (\S+) dev (\S+) proto 186 src (\S+)", rt[0])
484+
if m:
485+
rtinfo['set_src'] = ipaddress.ip_address(m.group(2))
486+
elif m1:
487+
rtinfo['set_src'] = ipaddress.ip_address(m.group(3))
488+
489+
# parse nexthops
490+
for l in rt:
491+
m = re.search(r"(default|nexthop) via (\S+) dev (\S+)", l)
492+
if m:
493+
rtinfo['nexthops'].append((ipaddress.ip_address(m.group(2)), m.group(3)))
494+
495+
logging.info("route parsed info for {}: {}".format(dstip, rtinfo))
496+
497+
return rtinfo
433498

434499
class EosHost(AnsibleHostBase):
435500
"""

tests/route/test_default_route.py

Lines changed: 17 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,13 @@
11
import ipaddress
2-
import re
3-
import pytest
42
import logging
53
from common.helpers.assertions import pytest_assert
64

75
logger = logging.getLogger(__name__)
86

97
def test_default_route_set_src(duthost):
10-
"""check if ipv4 and ipv6 default src address match Loopback0 address
11-
12-
admin@vlab-01:~$ ip route list match 0.0.0.0
13-
default proto bgp src 10.1.0.32 metric 20
14-
nexthop via 10.0.0.57 dev PortChannel0001 weight 1
15-
nexthop via 10.0.0.59 dev PortChannel0002 weight 1
16-
nexthop via 10.0.0.61 dev PortChannel0003 weight 1
17-
nexthop via 10.0.0.63 dev PortChannel0004 weight 1
18-
19-
admin@vlab-01:~$ ip -6 route list match ::
20-
default proto bgp src fc00:1::32 metric 20
21-
nexthop via fc00::72 dev PortChannel0001 weight 1
22-
nexthop via fc00::76 dev PortChannel0002 weight 1
23-
nexthop via fc00::7a dev PortChannel0003 weight 1
24-
nexthop via fc00::7e dev PortChannel0004 weight 1 pref medium
8+
"""
9+
check if ipv4 and ipv6 default src address match Loopback0 address
2510
26-
============ 4.9 kernel ===============
27-
admin@vlab-01:~$ ip route list match 0.0.0.0
28-
default proto 186 src 10.1.0.32 metric 20
29-
nexthop via 10.0.0.57 dev PortChannel0001 weight 1
30-
nexthop via 10.0.0.59 dev PortChannel0002 weight 1
31-
nexthop via 10.0.0.61 dev PortChannel0003 weight 1
32-
nexthop via 10.0.0.63 dev PortChannel0004 weight 1
33-
admin@vlab-01:~$ ip -6 route list match ::
34-
default via fc00::72 dev PortChannel0001 proto 186 src fc00:1::32 metric 20 pref medium
35-
default via fc00::76 dev PortChannel0002 proto 186 src fc00:1::32 metric 20 pref medium
36-
default via fc00::7a dev PortChannel0003 proto 186 src fc00:1::32 metric 20 pref medium
37-
default via fc00::7e dev PortChannel0004 proto 186 src fc00:1::32 metric 20 pref medium
3811
"""
3912

4013
config_facts = duthost.config_facts(host=duthost.hostname, source="running")['ansible_facts']
@@ -55,53 +28,24 @@ def test_default_route_set_src(duthost):
5528
pytest_assert(lo_ipv4, "cannot find ipv4 Loopback0 address")
5629
pytest_assert(lo_ipv6, "cannot find ipv6 Loopback0 address")
5730

58-
rt = duthost.command("ip route list match 0.0.0.0")['stdout_lines']
59-
m = re.match(r"^default proto (bgp|186) src (\S+)", rt[0])
60-
if m:
61-
pytest_assert(ipaddress.ip_address(m.group(2)) == lo_ipv4.ip, \
62-
"default route set src to wrong IP {} != {}".format(m.group(1), lo_ipv4.ip))
63-
else:
64-
pytest.fail("default route do not have set src. {}".format(rt))
31+
rtinfo = duthost.get_ip_route_info(ipaddress.ip_address(u"0.0.0.0"))
32+
pytest_assert(rtinfo['set_src'], "default route do not have set src. {}".format(rtinfo))
33+
pytest_assert(rtinfo['set_src'] == lo_ipv4.ip, \
34+
"default route set src to wrong IP {} != {}".format(rtinfo['set_src'], lo_ipv4.ip))
6535

66-
rt = duthost.command("ip -6 route list match ::")['stdout_lines']
67-
m = re.match(r"^default proto bgp src (\S+)", rt[0])
68-
m1 = re.match(r"default via (\S+) dev (\S+) proto 186 src (\S+)", rt[0])
69-
if m:
70-
pytest_assert(ipaddress.ip_address(m.group(1)) == lo_ipv6.ip, \
71-
"default route set src to wrong IP {} != {}".format(m.group(1), lo_ipv6.ip))
72-
elif m1:
73-
pytest_assert(ipaddress.ip_address(m1.group(3)) == lo_ipv6.ip, \
74-
"default route set src to wrong IP {} != {}".format(m1.group(3), lo_ipv6.ip))
75-
else:
76-
pytest.fail("default route do not have set src. {}".format(rt))
36+
rtinfo = duthost.get_ip_route_info(ipaddress.ip_address(u"::"))
37+
pytest_assert(rtinfo['set_src'], "default v6 route do not have set src. {}".format(rtinfo))
38+
pytest_assert(rtinfo['set_src'] == lo_ipv6.ip, \
39+
"default v6 route set src to wrong IP {} != {}".format(rtinfo['set_src'], lo_ipv6.ip))
7740

7841
def test_default_ipv6_route_next_hop_global_address(duthost):
79-
"""check if ipv6 default route nexthop address uses global address
80-
81-
admin@vlab-01:~$ ip -6 route list match ::
82-
default proto bgp src fc00:1::32 metric 20
83-
nexthop via fc00::72 dev PortChannel0001 weight 1
84-
nexthop via fc00::76 dev PortChannel0002 weight 1
85-
nexthop via fc00::7a dev PortChannel0003 weight 1
86-
nexthop via fc00::7e dev PortChannel0004 weight 1 pref medium
87-
88-
============ 4.9 kernel ===============
89-
admin@vlab-01:~$ ip -6 route list match ::
90-
default via fc00::72 dev PortChannel0001 proto 186 src fc00:1::32 metric 20 pref medium
91-
default via fc00::76 dev PortChannel0002 proto 186 src fc00:1::32 metric 20 pref medium
92-
default via fc00::7a dev PortChannel0003 proto 186 src fc00:1::32 metric 20 pref medium
93-
default via fc00::7e dev PortChannel0004 proto 186 src fc00:1::32 metric 20 pref medium
94-
9542
"""
43+
check if ipv6 default route nexthop address uses global address
9644
97-
rt = duthost.command("ip -6 route list match ::")['stdout_lines']
98-
logger.info("default ipv6 route {}".format(rt))
99-
found_nexthop_via = False
100-
for l in rt:
101-
m = re.search(r"(default|nexthop) via (\S+)", l)
102-
if m:
103-
found_nexthop_via = True
104-
pytest_assert(not ipaddress.ip_address(m.group(2)).is_link_local, \
105-
"use link local address {} for nexthop".format(m.group(2)))
45+
"""
10646

107-
pytest_assert(found_nexthop_via, "cannot find ipv6 nexthop for default route {}".format(rt))
47+
rtinfo = duthost.get_ip_route_info(ipaddress.ip_address(u"::"))
48+
pytest_assert(rtinfo['nexthops'] > 0, "cannot find ipv6 nexthop for default route")
49+
for nh in rtinfo['nexthops']:
50+
pytest_assert(not nh[0].is_link_local, \
51+
"use link local address {} for nexthop".format(nh[0]))

0 commit comments

Comments
 (0)