topotests: stabilize ospf-sr-topo1 run

Use `json_cmp` instead of raw text comparison. It should fix some of the
ordering problems we are seeing in CI runs.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
This commit is contained in:
Rafael Zalamena 2020-06-08 16:14:41 -03:00
parent c2088e52fc
commit 19d4fe6566
9 changed files with 91 additions and 103 deletions

View File

@ -113,32 +113,32 @@
"extendedLink":[ "extendedLink":[
{ {
"prefix":"10.0.0.1\/32", "prefix":"10.0.0.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r1-eth0", "interface":"r1-eth0",
"nexthop":"10.0.0.2" "nexthop":"10.0.0.2"
}, },
{ {
"prefix":"10.0.0.1\/32", "prefix":"10.0.0.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r1-eth0", "interface":"r1-eth0",
"nexthop":"10.0.0.2" "nexthop":"10.0.0.2"
}, },
{ {
"prefix":"10.0.1.1\/32", "prefix":"10.0.1.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r1-eth1", "interface":"r1-eth1",
"nexthop":"10.0.1.2" "nexthop":"10.0.1.2"
}, },
{ {
"prefix":"10.0.1.1\/32", "prefix":"10.0.1.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r1-eth1", "interface":"r1-eth1",
"nexthop":"10.0.1.2" "nexthop":"10.0.1.2"

View File

@ -71,8 +71,8 @@
} }
] ]
}, },
"XX":{ "label-1":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -84,8 +84,8 @@
} }
] ]
}, },
"XX":{ "label-2":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -97,8 +97,8 @@
} }
] ]
}, },
"XX":{ "label-3":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -110,8 +110,8 @@
} }
] ]
}, },
"XX":{ "label-4":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {

View File

@ -27,64 +27,64 @@
"extendedLink":[ "extendedLink":[
{ {
"prefix":"10.0.4.2\/32", "prefix":"10.0.4.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth3", "interface":"r2-eth3",
"nexthop":"10.0.4.1" "nexthop":"10.0.4.1"
}, },
{ {
"prefix":"10.0.4.2\/32", "prefix":"10.0.4.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth3", "interface":"r2-eth3",
"nexthop":"10.0.4.1" "nexthop":"10.0.4.1"
}, },
{ {
"prefix":"10.0.0.2\/32", "prefix":"10.0.0.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth0", "interface":"r2-eth0",
"nexthop":"10.0.0.1" "nexthop":"10.0.0.1"
}, },
{ {
"prefix":"10.0.0.2\/32", "prefix":"10.0.0.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth0", "interface":"r2-eth0",
"nexthop":"10.0.0.1" "nexthop":"10.0.0.1"
}, },
{ {
"prefix":"10.0.1.2\/32", "prefix":"10.0.1.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth1", "interface":"r2-eth1",
"nexthop":"10.0.1.1" "nexthop":"10.0.1.1"
}, },
{ {
"prefix":"10.0.1.2\/32", "prefix":"10.0.1.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth1", "interface":"r2-eth1",
"nexthop":"10.0.1.1" "nexthop":"10.0.1.1"
}, },
{ {
"prefix":"10.0.3.2\/32", "prefix":"10.0.3.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth2", "interface":"r2-eth2",
"nexthop":"10.0.3.1" "nexthop":"10.0.3.1"
}, },
{ {
"prefix":"10.0.3.2\/32", "prefix":"10.0.3.2\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r2-eth2", "interface":"r2-eth2",
"nexthop":"10.0.3.1" "nexthop":"10.0.3.1"

View File

@ -45,8 +45,8 @@
} }
] ]
}, },
"XX":{ "label-1":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -58,8 +58,8 @@
} }
] ]
}, },
"XX":{ "label-2":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -71,8 +71,8 @@
} }
] ]
}, },
"XX":{ "label-3":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -84,8 +84,8 @@
} }
] ]
}, },
"XX":{ "label-4":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -97,8 +97,8 @@
} }
] ]
}, },
"XX":{ "label-5":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -110,8 +110,8 @@
} }
] ]
}, },
"XX":{ "label-6":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -123,8 +123,8 @@
} }
] ]
}, },
"XX":{ "label-7":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -136,8 +136,8 @@
} }
] ]
}, },
"XX":{ "label-8":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {

View File

@ -77,16 +77,16 @@
"extendedLink":[ "extendedLink":[
{ {
"prefix":"10.0.3.1\/32", "prefix":"10.0.3.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r3-eth0", "interface":"r3-eth0",
"nexthop":"10.0.3.2" "nexthop":"10.0.3.2"
}, },
{ {
"prefix":"10.0.3.1\/32", "prefix":"10.0.3.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r3-eth0", "interface":"r3-eth0",
"nexthop":"10.0.3.2" "nexthop":"10.0.3.2"

View File

@ -38,8 +38,8 @@
} }
] ]
}, },
"XX":{ "label-1":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -51,8 +51,8 @@
} }
] ]
}, },
"XX":{ "label-2":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {

View File

@ -49,16 +49,16 @@
"extendedLink":[ "extendedLink":[
{ {
"prefix":"10.0.4.1\/32", "prefix":"10.0.4.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r4-eth0", "interface":"r4-eth0",
"nexthop":"10.0.4.2" "nexthop":"10.0.4.2"
}, },
{ {
"prefix":"10.0.4.1\/32", "prefix":"10.0.4.1\/32",
"sid":"XX", "sid":"*",
"inputLabel":"XX", "inputLabel":"*",
"outputLabel":3, "outputLabel":3,
"interface":"r4-eth0", "interface":"r4-eth0",
"nexthop":"10.0.4.2" "nexthop":"10.0.4.2"

View File

@ -50,8 +50,8 @@
} }
] ]
}, },
"XX":{ "label-1":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {
@ -63,8 +63,8 @@
} }
] ]
}, },
"XX":{ "label-2":{
"inLabel":"XX", "inLabel":"*",
"installed":true, "installed":true,
"nexthops":[ "nexthops":[
{ {

View File

@ -29,6 +29,7 @@ test_ospf_sr_topo1.py: Test the FRR OSPF routing daemon with Segment Routing.
import os import os
import re import re
import sys import sys
import json
from functools import partial from functools import partial
# Save the Current Working Directory to find configuration files. # Save the Current Working Directory to find configuration files.
@ -113,37 +114,6 @@ def teardown_module(mod):
logger.info("\n\n---- OSPF Segment Routing tests End ----\n") logger.info("\n\n---- OSPF Segment Routing tests End ----\n")
# Shared test function to validate expected output.
def compare_ospf_srdb(rname, expected):
"""
Calls 'show ip ospf database segment-routing json' for router `rname`
and compare the obtained result with the expected output.
"""
tgen = get_topogen()
current = tgen.gears[rname].vtysh_cmd("show ip ospf database segment-routing json")
# Filter Adjacency SID allocation
current = re.sub(r'"sid":5000[0-9],', '"sid":"XX",', current)
current = re.sub(r'"inputLabel":5000[0-9],', '"inputLabel":"XX",', current)
return topotest.difflines(
current, expected, title1="Current output", title2="Expected output"
)
def compare_mpls_table(rname, expected):
"""
Calls 'show mpls table json' for router `rname` and compare the obtained
result with the expected output.
"""
tgen = get_topogen()
current = tgen.gears[rname].vtysh_cmd("show mpls table json")
# Filter Adjacency SID allocation
current = re.sub(r'"5000[0-9]":', '"XX":', current)
current = re.sub(r'"inLabel":5000[0-9],', '"inLabel":"XX",', current)
return topotest.difflines(
current, expected, title1="Current output", title2="Expected output"
)
def test_ospf_sr(): def test_ospf_sr():
"Test OSPF daemon Segment Routing" "Test OSPF daemon Segment Routing"
tgen = get_topogen() tgen = get_topogen()
@ -159,12 +129,15 @@ def test_ospf_sr():
# Load expected results from the command # Load expected results from the command
reffile = os.path.join(CWD, "{}/ospf_srdb.json".format(router)) reffile = os.path.join(CWD, "{}/ospf_srdb.json".format(router))
expected = open(reffile).read() expected = json.loads(open(reffile).read())
# Run test function until we get an result. Wait at most 60 seconds. # Run test function until we get an result. Wait at most 60 seconds.
test_func = partial(compare_ospf_srdb, router, expected) rt = tgen.gears[router]
result, diff = topotest.run_and_expect(test_func, "", count=25, wait=3) test_func = partial(
assert result, ("OSPF did not start Segment Routing on {}:\n{}").format( topotest.router_json_cmp, rt, 'show ip ospf database segment-routing json', expected
)
rv, diff = topotest.run_and_expect(test_func, None, count=25, wait=3)
assert rv, "OSPF did not start Segment Routing on {}:\n{}".format(
router, diff router, diff
) )
@ -177,6 +150,20 @@ def test_ospf_kernel_route():
logger.info("--- test OSPF Segment Routing MPLS tables ---") logger.info("--- test OSPF Segment Routing MPLS tables ---")
def show_mpls_table_json_cmp(rt, expected):
"Removes random label and use `label-X` instead."
text = rt.vtysh_cmd('show mpls table json')
# Substitue random labels with fixed label value.
for label in range(1, 10):
text = re.sub(r'"5000[0-9]"', '"label-{}"'.format(label), text,
count=1)
print '\n{}\n'.format(text)
output = json.loads(text)
return topotest.json_cmp(output, expected)
for rnum in range(1, 5): for rnum in range(1, 5):
router = "r{}".format(rnum) router = "r{}".format(rnum)
@ -184,12 +171,13 @@ def test_ospf_kernel_route():
# Load expected results from the command # Load expected results from the command
reffile = os.path.join(CWD, "{}/zebra_mpls.json".format(router)) reffile = os.path.join(CWD, "{}/zebra_mpls.json".format(router))
expected = open(reffile).read() expected = json.loads(open(reffile).read())
# Run test function until we get an result. Wait at most 60 seconds. # Run test function until we get an result. Wait at most 60 seconds.
test_func = partial(compare_mpls_table, router, expected) rt = tgen.gears[router]
result, diff = topotest.run_and_expect(test_func, "", count=25, wait=3) test_func = partial(show_mpls_table_json_cmp, rt, expected)
assert result, ("OSPF did not properly instal MPLS table on {}:\n{}").format( rv, diff = topotest.run_and_expect(test_func, None, count=25, wait=3)
assert rv, "OSPF did not properly instal MPLS table on {}:\n{}".format(
router, diff router, diff
) )