summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2021-01-31 12:48:15 +0100
committerChristian Poessinger <christian@poessinger.com>2021-01-31 12:48:15 +0100
commitca5d74015c862bbe936244fc32df28409968efca (patch)
tree1aae2194c87681b9f3640728ecdd341d431bc417
parent33e10ccc33e3b25dcdd3d4ee57bfdc4e2c331a6e (diff)
downloadvyos-1x-ca5d74015c862bbe936244fc32df28409968efca.tar.gz
vyos-1x-ca5d74015c862bbe936244fc32df28409968efca.zip
smoketest: vrf: add test case for static v4/v6 routes incl. leaking
-rwxr-xr-xsmoketest/scripts/cli/test_vrf.py83
1 files changed, 82 insertions, 1 deletions
diff --git a/smoketest/scripts/cli/test_vrf.py b/smoketest/scripts/cli/test_vrf.py
index 749863476..856baa070 100755
--- a/smoketest/scripts/cli/test_vrf.py
+++ b/smoketest/scripts/cli/test_vrf.py
@@ -16,19 +16,29 @@
import re
import os
+import json
import unittest
+
from netifaces import interfaces
from vyos.configsession import ConfigSession
from vyos.configsession import ConfigSessionError
from vyos.ifconfig import Interface
from vyos.ifconfig import Section
+from vyos.template import is_ipv6
+from vyos.util import cmd
from vyos.util import read_file
from vyos.validate import is_intf_addr_assigned
base_path = ['vrf']
vrfs = ['red', 'green', 'blue', 'foo-bar', 'baz_foo']
+def get_vrf_ipv4_routes(vrf):
+ return json.loads(cmd(f'ip -4 -j route show vrf {vrf}'))
+
+def get_vrf_ipv6_routes(vrf):
+ return json.loads(cmd(f'ip -6 -j route show vrf {vrf}'))
+
class VRFTest(unittest.TestCase):
_interfaces = []
@@ -156,5 +166,76 @@ class VRFTest(unittest.TestCase):
section = Section.section(interface)
self.session.delete(['interfaces', section, interface, 'vrf'])
+ def test_vrf_static_routes(self):
+ routes = {
+ '10.0.0.0/8' : {
+ 'next_hop' : '192.0.2.2',
+ 'distance' : '200',
+ 'next_hop_vrf' : 'default',
+ },
+ '172.16.0.0/12' : {
+ 'next_hop' : '192.0.2.3',
+ 'next_hop_vrf' : 'default',
+ },
+ '192.168.0.0/16' : {
+ 'next_hop' : '192.0.2.3',
+ },
+ '2001:db8:1000::/48' : {
+ 'next_hop' : '2001:db8::2',
+ },
+ }
+
+ table = '2000'
+ for vrf in vrfs:
+ base = base_path + ['name', vrf]
+ self.session.set(base + ['table', str(table)])
+
+ # required interface for leaking to default table
+ self.session.set(['interfaces', 'ethernet', 'eth0', 'address', '192.0.2.1/24'])
+
+ # we also need an interface in "UP" state to install routes
+ self.session.set(['interfaces', 'dummy', f'dum{table}', 'vrf', vrf])
+ self.session.set(['interfaces', 'dummy', f'dum{table}', 'address', '192.0.2.1/24'])
+ self.session.set(['interfaces', 'dummy', f'dum{table}', 'address', '2001:db8::1/64'])
+ table = str(int(table) + 1)
+
+ proto_base = ['protocols', 'vrf', vrf, 'static']
+ for route, route_config in routes.items():
+ route_type = 'route'
+ if is_ipv6(route):
+ route_type = 'route6'
+ self.session.set(proto_base + [route_type, route, 'next-hop', route_config['next_hop']])
+ if 'distance' in route_config:
+ self.session.set(proto_base + [route_type, route, 'next-hop', route_config['next_hop'], 'distance', route_config['distance']])
+ if 'next_hop_vrf' in route_config:
+ self.session.set(proto_base + [route_type, route, 'next-hop', route_config['next_hop'], 'next-hop-vrf', route_config['next_hop_vrf']])
+
+ # commit changes
+ self.session.commit()
+
+ # Verify routes
+ table = '2000'
+ for vrf in vrfs:
+ for route, route_config in routes.items():
+ if is_ipv6(route):
+ tmp = get_vrf_ipv6_routes(vrf)
+ else:
+ tmp = get_vrf_ipv4_routes(vrf)
+
+ found = False
+ for result in tmp:
+ if 'dst' in result and result['dst'] == route:
+ if 'gateway' in result and result['gateway'] == route_config['next_hop']:
+ found = True
+
+ self.assertTrue(found)
+
+ # Cleanup
+ self.session.delete(['protocols', 'vrf', vrf])
+ self.session.delete(['interfaces', 'dummy', f'dum{table}'])
+ self.session.delete(['interfaces', 'ethernet', 'eth0', 'address', '192.0.2.1/24'])
+
+ table = str(int(table) + 1)
+
if __name__ == '__main__':
- unittest.main(verbosity=2, failfast=True)
+ unittest.main(verbosity=2)