]> git.proxmox.com Git - mirror_frr.git/blame - tests/topotests/srv6_locator/test_srv6_locator.py
doc: Add `show ipv6 rpf X:X::X:X` command to docs
[mirror_frr.git] / tests / topotests / srv6_locator / test_srv6_locator.py
CommitLineData
96d423f7
HS
1#!/usr/bin/env python
2
3#
4# test_srv6_manager.py
5# Part of NetDEF Topology Tests
6#
7# Copyright (c) 2020 by
8# LINE Corporation, Hiroki Shirokura <slank.dev@gmail.com>
9#
10# Permission to use, copy, modify, and/or distribute this software
11# for any purpose with or without fee is hereby granted, provided
12# that the above copyright notice and this permission notice appear
13# in all copies.
14#
15# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
16# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
18# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
19# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
21# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22# OF THIS SOFTWARE.
23#
24
25"""
26test_srv6_manager.py:
27Test for SRv6 manager on zebra
28"""
29
30import os
31import sys
32import json
96d423f7
HS
33import pytest
34import functools
35
36CWD = os.path.dirname(os.path.realpath(__file__))
a53c08bc 37sys.path.append(os.path.join(CWD, "../"))
96d423f7
HS
38
39# pylint: disable=C0413
40from lib import topotest
41from lib.topogen import Topogen, TopoRouter, get_topogen
42from lib.topolog import logger
96d423f7 43
9a47e7b2
DS
44pytestmark = [pytest.mark.bgpd, pytest.mark.sharpd]
45
96d423f7
HS
46
47def open_json_file(filename):
48 try:
49 with open(filename, "r") as f:
50 return json.load(f)
51 except IOError:
52 assert False, "Could not read file {}".format(filename)
53
54
96d423f7 55def setup_module(mod):
8db751b8 56 tgen = Topogen({None: "r1"}, mod.__name__)
96d423f7 57 tgen.start_topology()
96d423f7
HS
58 for rname, router in tgen.routers().items():
59 router.run("/bin/bash {}/{}/setup.sh".format(CWD, rname))
a53c08bc
CH
60 router.load_config(
61 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
62 )
63 router.load_config(
64 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
65 )
66 router.load_config(
67 TopoRouter.RD_SHARP, os.path.join(CWD, "{}/sharpd.conf".format(rname))
68 )
96d423f7
HS
69 tgen.start_router()
70
71
72def teardown_module(mod):
73 tgen = get_topogen()
74 tgen.stop_topology()
75
76
77def test_srv6():
78 tgen = get_topogen()
79 if tgen.routers_have_failure():
80 pytest.skip(tgen.errors)
a53c08bc 81 router = tgen.gears["r1"]
96d423f7
HS
82
83 def _check_srv6_locator(router, expected_locator_file):
84 logger.info("checking zebra locator status")
85 output = json.loads(router.vtysh_cmd("show segment-routing srv6 locator json"))
86 expected = open_json_file("{}/{}".format(CWD, expected_locator_file))
87 return topotest.json_cmp(output, expected)
88
89 def _check_sharpd_chunk(router, expected_chunk_file):
90 logger.info("checking sharpd locator chunk status")
a2df1e4f 91 output = json.loads(router.vtysh_cmd("show sharp segment-routing srv6 json"))
96d423f7
HS
92 expected = open_json_file("{}/{}".format(CWD, expected_chunk_file))
93 return topotest.json_cmp(output, expected)
94
95 def check_srv6_locator(router, expected_file):
96 func = functools.partial(_check_srv6_locator, router, expected_file)
d3a6af08 97 success, result = topotest.run_and_expect(func, None, count=10, wait=0.5)
a53c08bc 98 assert result is None, "Failed"
96d423f7
HS
99
100 def check_sharpd_chunk(router, expected_file):
101 func = functools.partial(_check_sharpd_chunk, router, expected_file)
d3a6af08 102 success, result = topotest.run_and_expect(func, None, count=10, wait=0.5)
a53c08bc 103 assert result is None, "Failed"
96d423f7 104
e08c5663
HS
105 # FOR DEVELOPER:
106 # If you want to stop some specific line and start interactive shell,
107 # please use tgen.mininet_cli() to start it.
108
96d423f7
HS
109 logger.info("Test1 for Locator Configuration")
110 check_srv6_locator(router, "expected_locators1.json")
111 check_sharpd_chunk(router, "expected_chunks1.json")
112
113 logger.info("Test2 get chunk for locator loc1")
114 router.vtysh_cmd("sharp srv6-manager get-locator-chunk loc1")
115 check_srv6_locator(router, "expected_locators2.json")
116 check_sharpd_chunk(router, "expected_chunks2.json")
117
118 logger.info("Test3 release chunk for locator loc1")
119 router.vtysh_cmd("sharp srv6-manager release-locator-chunk loc1")
120 check_srv6_locator(router, "expected_locators3.json")
121 check_sharpd_chunk(router, "expected_chunks3.json")
122
e08c5663
HS
123 logger.info("Test4 additional locator loc3")
124 router.vtysh_cmd(
125 """
126 configure terminal
127 segment-routing
128 srv6
129 locators
130 locator loc3
131 prefix 2001:db8:3:3::/64
132 """
133 )
96d423f7
HS
134 check_srv6_locator(router, "expected_locators4.json")
135 check_sharpd_chunk(router, "expected_chunks4.json")
136
e08c5663 137 logger.info("Test5 delete locator and chunk is released automatically")
96d423f7
HS
138 router.vtysh_cmd(
139 """
140 configure terminal
141 segment-routing
142 srv6
143 locators
e08c5663 144 no locator loc1
96d423f7
HS
145 """
146 )
147 check_srv6_locator(router, "expected_locators5.json")
148 check_sharpd_chunk(router, "expected_chunks5.json")
149
e08c5663
HS
150 logger.info("Test6 delete srv6 all configuration")
151 router.vtysh_cmd(
152 """
153 configure terminal
154 segment-routing
155 no srv6
156 """
157 )
158 check_srv6_locator(router, "expected_locators6.json")
159 check_sharpd_chunk(router, "expected_chunks6.json")
160
96d423f7 161
a53c08bc 162if __name__ == "__main__":
96d423f7
HS
163 args = ["-s"] + sys.argv[1:]
164 sys.exit(pytest.main(args))