diff options
Diffstat (limited to 'tests/topotests/static_simple/test_static_simple.py')
| -rw-r--r-- | tests/topotests/static_simple/test_static_simple.py | 72 | 
1 files changed, 51 insertions, 21 deletions
diff --git a/tests/topotests/static_simple/test_static_simple.py b/tests/topotests/static_simple/test_static_simple.py index bb3580a1d8..afde58fbf7 100644 --- a/tests/topotests/static_simple/test_static_simple.py +++ b/tests/topotests/static_simple/test_static_simple.py @@ -61,6 +61,15 @@ def get_ip_networks(super_prefix, count):      return tuple(network.subnets(count_log2))[0:count] +def get_src_networks(src_prefix, count, default=""): +    if src_prefix is not None: +        for net in get_ip_networks(src_prefix, count): +            yield " from {}".format(net) +    else: +        for i in range(0, count): +            yield default + +  def enable_debug(router):      router.vtysh_cmd("debug northbound callbacks configuration") @@ -70,7 +79,7 @@ def disable_debug(router):  @retry(retry_timeout=30, initial_wait=0.1) -def check_kernel(r1, super_prefix, count, add, is_blackhole, vrf, matchvia): +def check_kernel(r1, super_prefix, src_prefix, count, add, is_blackhole, vrf, matchvia):      network = ipaddress.ip_network(super_prefix)      vrfstr = f" vrf {vrf}" if vrf else ""      if network.version == 6: @@ -79,26 +88,30 @@ def check_kernel(r1, super_prefix, count, add, is_blackhole, vrf, matchvia):          kernel = r1.run(f"ip -4 route show{vrfstr}")      logger.debug("checking kernel routing table%s:\n%s", vrfstr, kernel) -    for _, net in enumerate(get_ip_networks(super_prefix, count)): +    for net, srcnet in zip( +        get_ip_networks(super_prefix, count), get_src_networks(src_prefix, count) +    ): +        netfull = str(net) + srcnet          if not add: -            assert str(net) not in kernel +            assert netfull + " nhid" not in kernel +            assert netfull + " via" not in kernel              continue          if is_blackhole: -            route = f"blackhole {str(net)} proto (static|196) metric 20" +            route = f"blackhole {netfull}(?: dev lo)? proto (static|196) metric 20"          else:              route = ( -                f"{str(net)}(?: nhid [0-9]+)? {matchvia} " -                "proto (static|196) metric 20" +                f"{netfull}(?: nhid [0-9]+)? {matchvia} proto (static|196) metric 20"              )          assert re.search(route, kernel), f"Failed to find \n'{route}'\n in \n'{kernel}'" -def do_config( +def do_config_inner(      r1,      count,      add=True,      do_ipv6=False, +    do_sadr=False,      via=None,      vrf=None,      use_cli=False, @@ -109,11 +122,18 @@ def do_config(      #      # Set the route details      # - -    if vrf: -        super_prefix = "2002::/48" if do_ipv6 else "20.0.0.0/8" +    src_prefs = [None, None] +    if do_ipv6 and do_sadr: +        # intentionally using overlapping prefix +        super_prefs = ["2001::/48", "2002::/48"] +        src_prefs = ["2001:db8:1111::/48", "2001:db8:2222::/48"] +    elif do_ipv6: +        super_prefs = ["2001::/48", "2002::/48"]      else: -        super_prefix = "2001::/48" if do_ipv6 else "10.0.0.0/8" +        super_prefs = ["10.0.0.0/8", "20.0.0.0/8"] + +    super_prefix = super_prefs[1 if vrf else 0] +    src_prefix = src_prefs[1 if vrf else 0]      matchvia = ""      if via == "blackhole": @@ -144,11 +164,13 @@ def do_config(          if vrf:              f.write("vrf {}\n".format(vrf)) -        for _, net in enumerate(get_ip_networks(super_prefix, count)): +        for net, srcnet in zip( +            get_ip_networks(super_prefix, count), get_src_networks(src_prefix, count) +        ):              if add: -                f.write("ip route {} {}\n".format(net, via)) +                f.write("ip route {}{} {}\n".format(net, srcnet, via))              else: -                f.write("no ip route {} {}\n".format(net, via)) +                f.write("no ip route {}{} {}\n".format(net, srcnet, via))      #      # Load config file. @@ -165,7 +187,9 @@ def do_config(      #      # Verify the results are in the kernel      # -    check_kernel(r1, super_prefix, count, add, via == "blackhole", vrf, matchvia) +    check_kernel( +        r1, super_prefix, src_prefix, count, add, via == "blackhole", vrf, matchvia +    )      optyped = "added" if add else "removed"      logger.debug( @@ -175,6 +199,12 @@ def do_config(      ) +def do_config(*args, **kwargs): +    do_config_inner(*args, do_ipv6=False, do_sadr=False, **kwargs) +    do_config_inner(*args, do_ipv6=True, do_sadr=False, **kwargs) +    do_config_inner(*args, do_ipv6=True, do_sadr=True, **kwargs) + +  def guts(tgen, vrf, use_cli):      if tgen.routers_have_failure():          pytest.skip(tgen.errors) @@ -183,20 +213,20 @@ def guts(tgen, vrf, use_cli):      count = 10      step(f"add {count} via gateway", reset=True) -    do_config(r1, count, True, False, vrf=vrf, use_cli=use_cli) +    do_config(r1, count, True, vrf=vrf, use_cli=use_cli)      step(f"remove {count} via gateway") -    do_config(r1, count, False, False, vrf=vrf, use_cli=use_cli) +    do_config(r1, count, False, vrf=vrf, use_cli=use_cli)      via = f"lo-{vrf}" if vrf else "lo"      step("add via loopback") -    do_config(r1, 1, True, False, via=via, vrf=vrf, use_cli=use_cli) +    do_config(r1, 1, True, via=via, vrf=vrf, use_cli=use_cli)      step("remove via loopback") -    do_config(r1, 1, False, False, via=via, vrf=vrf, use_cli=use_cli) +    do_config(r1, 1, False, via=via, vrf=vrf, use_cli=use_cli)      step("add via blackhole") -    do_config(r1, 1, True, False, via="blackhole", vrf=vrf, use_cli=use_cli) +    do_config(r1, 1, True, via="blackhole", vrf=vrf, use_cli=use_cli)      step("remove via blackhole") -    do_config(r1, 1, False, False, via="blackhole", vrf=vrf, use_cli=use_cli) +    do_config(r1, 1, False, via="blackhole", vrf=vrf, use_cli=use_cli)  def test_static_cli(tgen):  | 
