def ltemplateVersionCheck(
    vstr, rname="r1", compstr="<", cli=False, kernel="4.9", iproute2=None, mpls=True
):
    tgen = get_topogen()
    router = tgen.gears[rname]

    if cli:
        logger.info("calling mininet CLI")
        tgen.mininet_cli()
        logger.info("exited mininet CLI")

    if _lt == None:
        ret = "Template not initialized"
        return ret

    if _lt.prestarthooksuccess != True:
        ret = "ltemplatePreRouterStartHook failed"
        return ret

    if _lt.poststarthooksuccess != True:
        ret = "ltemplatePostRouterStartHook failed"
        return ret

    if mpls == True and tgen.hasmpls != True:
        ret = "MPLS not initialized"
        return ret

    if kernel != None:
        krel = platform.release()
        if topotest.version_cmp(krel, kernel) < 0:
            ret = "Skipping tests, old kernel ({} < {})".format(krel, kernel)
            return ret

    if iproute2 != None:
        if _lt.iproute2Ver == None:
            # collect/log info on iproute2
            cc = ltemplateRtrCmd()
            found = cc.doCmd(
                tgen, rname, "apt-cache policy iproute2", r"Installed: ([\d\.]*)"
            )
            if found != None:
                iproute2Ver = found.group(1)
            else:
                iproute2Ver = "0-unknown"
            logger.info("Have iproute2 version=" + iproute2Ver)

        if topotest.version_cmp(iproute2Ver, iproute2) < 0:
            ret = "Skipping tests, old iproute2 ({} < {})".format(iproute2Ver, iproute2)
            return ret

    ret = True
    try:
        if router.has_version(compstr, vstr):
            ret = "Skipping tests, old FRR version {} {}".format(compstr, vstr)
            return ret
    except:
        ret = True

    return ret
def setup_module(mod):
    "Sets up the pytest environment"
    tgen = Topogen(ISISTopo1, mod.__name__)
    tgen.start_topology()

    logger.info("Testing with VRF Lite support")
    krel = platform.release()

    # May need to adjust handling of vrf traffic depending on kernel version
    l3mdev_accept = 0
    if (topotest.version_cmp(krel, "4.15") >= 0
            and topotest.version_cmp(krel, "4.18") <= 0):
        l3mdev_accept = 1

    if topotest.version_cmp(krel, "5.0") >= 0:
        l3mdev_accept = 1

    logger.info("krel '{0}' setting net.ipv4.tcp_l3mdev_accept={1}".format(
        krel, l3mdev_accept))

    cmds = [
        "ip link add {0}-cust1 type vrf table 1001",
        "ip link add loop1 type dummy",
        "ip link set {0}-eth0 master {0}-cust1",
        "ip link set {0}-eth1 master {0}-cust1",
    ]

    # For all registered routers, load the zebra configuration file
    for rname, router in tgen.routers().items():
        # create VRF rx-cust1 and link rx-eth0 to rx-cust1
        for cmd in cmds:
            output = tgen.net[rname].cmd(cmd.format(rname))
        output = tgen.net[rname].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept")
        logger.info("router {0}: existing tcp_l3mdev_accept was {1}".format(
            rname, output))

        if l3mdev_accept:
            output = tgen.net[rname].cmd(
                "sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(
                    l3mdev_accept))

    for rname, router in tgen.routers().items():
        router.load_config(TopoRouter.RD_ZEBRA,
                           os.path.join(CWD, "{}/zebra.conf".format(rname)))
        router.load_config(TopoRouter.RD_ISIS,
                           os.path.join(CWD, "{}/isisd.conf".format(rname)))
    # After loading the configurations, this function loads configured daemons.
    tgen.start_router()

    has_version_20 = False
    for router in tgen.routers().values():
        if router.has_version("<", "4"):
            has_version_20 = True

    if has_version_20:
        logger.info("Skipping ISIS vrf tests for FRR 2.0")
        tgen.set_error("ISIS has convergence problems with IPv6")
Exemple #3
0
def setup_module(mod):
    "Sets up the pytest environment"
    tgen = Topogen(BGPIPV6RTADVVRFTopo, mod.__name__)
    tgen.start_topology()

    router_list = tgen.routers()

    logger.info("Testing with VRF Lite support")
    krel = platform.release()

    # May need to adjust handling of vrf traffic depending on kernel version
    l3mdev_accept = 0
    if (
        topotest.version_cmp(krel, "4.15") >= 0
        and topotest.version_cmp(krel, "4.18") <= 0
    ):
        l3mdev_accept = 1

    if topotest.version_cmp(krel, "5.0") >= 0:
        l3mdev_accept = 1

    logger.info(
        "krel '{0}' setting net.ipv4.tcp_l3mdev_accept={1}".format(krel, l3mdev_accept)
    )

    cmds = [
        "ip link add {0}-cust1 type vrf table 1001",
        "ip link add loop1 type dummy",
        "ip link set loop1 master {0}-cust1",
        "ip link set {0}-eth0 master {0}-cust1",
    ]

    for rname, router in router_list.items():
        for cmd in cmds:
            output = tgen.net[rname].cmd(cmd.format(rname))

        output = tgen.net[rname].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept")
        logger.info(
            "router {0}: existing tcp_l3mdev_accept was {1}".format(rname, output)
        )

        if l3mdev_accept:
            output = tgen.net[rname].cmd(
                "sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept)
            )

    for rname, router in router_list.items():
        router.load_config(
            TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
        )
        router.load_config(
            TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
        )

    # Initialize all routers.
    tgen.start_router()
Exemple #4
0
def test_invalid_versions():
    "Test invalid version strings"

    curver = '3.0'
    badver1 = '.1'
    badver2 = '-1.0'
    badver3 = '.'
    badver4 = '3.-0.3'

    with pytest.raises(ValueError):
        assert version_cmp(curver, badver1)
        assert version_cmp(curver, badver2)
        assert version_cmp(curver, badver3)
        assert version_cmp(curver, badver4)
Exemple #5
0
def test_invalid_versions():
    "Test invalid version strings"

    curver = '3.0'
    badver1 = '.1'
    badver2 = '-1.0'
    badver3 = '.'
    badver4 = '3.-0.3'

    with pytest.raises(ValueError):
        assert version_cmp(curver, badver1)
        assert version_cmp(curver, badver2)
        assert version_cmp(curver, badver3)
        assert version_cmp(curver, badver4)
def test_invalid_versions():
    "Test invalid version strings"

    curver = "3.0"
    badver1 = ".1"
    badver2 = "-1.0"
    badver3 = "."
    badver4 = "3.-0.3"

    with pytest.raises(ValueError):
        assert version_cmp(curver, badver1)
        assert version_cmp(curver, badver2)
        assert version_cmp(curver, badver3)
        assert version_cmp(curver, badver4)
Exemple #7
0
def setup_module(module):
    "Setup topology"
    tgen = Topogen(NetworkTopo, module.__name__)
    tgen.start_topology()

    krel = platform.release()
    if topotest.version_cmp(krel, "4.10") < 0:
        tgen.errors = "Newer kernel than 4.9 needed for pbr tests"
        pytest.skip(tgen.errors)

    router_list = tgen.routers()
    for rname, router in router_list.items():
        # Install vrf into the kernel and slave eth3
        router.run("ip link add vrf-chiyoda type vrf table 1000")
        router.run("ip link set dev {}-eth3 master vrf-chiyoda".format(rname))
        router.run("ip link set vrf-chiyoda up")

        router.load_config(
            TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
        )
        router.load_config(
            TopoRouter.RD_PBRD, os.path.join(CWD, "{}/pbrd.conf".format(rname))
        )

    tgen.start_router()
Exemple #8
0
    def has_version(self, cmpop, version):
        """
        Compares router version using operation `cmpop` with `version`.
        Valid `cmpop` values:
        * `>=`: has the same version or greater
        * '>': has greater version
        * '=': has the same version
        * '<': has a lesser version
        * '<=': has the same version or lesser

        Usage example: router.has_version('>', '1.0')
        """
        rversion = self.version_info()['version']
        if rversion is None:
            return False

        result = topotest.version_cmp(rversion, version)
        if cmpop == '>=':
            return result >= 0
        if cmpop == '>':
            return result > 0
        if cmpop == '=':
            return result == 0
        if cmpop == '<':
            return result < 0
        if cmpop == '<':
            return result < 0
        if cmpop == '<=':
            return result <= 0
def test_evpn_gateway_ip_basic_topo(request):
    """
    Tets EVPN overlay index gateway IP functionality. VErify show O/Ps on PE1 and PE2
    """

    tgen = get_topogen()
    tc_name = request.node.name
    write_test_header(tc_name)

    kernelv = platform.release()
    if topotest.version_cmp(kernelv, "4.15") < 0:
        logger.info("For EVPN, kernel version should be minimum 4.15")
        write_test_footer(tc_name)
        return

    if tgen.routers_have_failure():
        pytest.skip(tgen.errors)

    step(
        "Check O/Ps for EVPN gateway IP overlay Index functionality at PE1 and PE2"
    )

    result, assertmsg = evpn_gateway_ip_show_op_check("base")

    if result is not None:
        generate_support_bundle()
    assert result is None, assertmsg

    write_test_footer(tc_name)
Exemple #10
0
def setup_module(module):
    "Setup topology"
    tgen = Topogen(NetworkTopo, module.__name__)
    tgen.start_topology()

    krel = platform.release()
    if topotest.version_cmp(krel, "4.19") < 0:
        tgen.errors = "kernel 4.19 needed for multihoming tests"
        pytest.skip(tgen.errors)

    tors = []
    tors.append("torm11")
    tors.append("torm12")
    tors.append("torm21")
    tors.append("torm22")
    config_tors(tgen, tors)

    hosts = []
    hosts.append("hostd11")
    hosts.append("hostd12")
    hosts.append("hostd21")
    hosts.append("hostd22")
    config_hosts(tgen, hosts)

    # tgen.mininet_cli()
    # This is a sample of configuration loading.
    router_list = tgen.routers()
    for rname, router in router_list.items():
        router.load_config(TopoRouter.RD_ZEBRA,
                           os.path.join(CWD, "{}/zebra.conf".format(rname)))
        router.load_config(TopoRouter.RD_PIM,
                           os.path.join(CWD, "{}/pim.conf".format(rname)))
        router.load_config(TopoRouter.RD_BGP,
                           os.path.join(CWD, "{}/evpn.conf".format(rname)))
    tgen.start_router()
def test_vrf_prefix_peer_established(tgen):
    "default vrf 3 peers same password with VRF prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    reset_with_new_configs(tgen, "bgpd_vrf_prefix.conf", "ospfd_vrf.conf")
    check_all_peers_established("blue")
Exemple #12
0
def test_prefix_peer_remove_passwords():
    "selectively remove passwords checking state with prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return
    configure("bgpd_prefix.conf")
    check_vrf_peer_remove_passwords(prefix="yes")
    clear_bgp()
def test_vrf_prefix_peer_change_passwords(tgen):
    "selectively change passwords checking state with VRF prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    reset_with_new_configs(tgen, "bgpd_vrf_prefix.conf", "ospfd_vrf.conf")
    check_vrf_peer_change_passwords(vrf="blue", prefix="yes")
Exemple #14
0
def test_prefix_peer_change_passwords():
    "selecively change passwords checkig state with prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    configure_bgp("bgpd_prefix.conf")
    configure_ospf("ospfd.conf")
    check_vrf_peer_change_passwords(prefix="yes")
Exemple #15
0
def test_vrf_prefix_peer_established():
    "default vrf 3 peers same password with VRF prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    configure_bgp("bgpd_vrf_prefix.conf")
    configure_ospf("ospfd_vrf.conf")
    check_all_peers_established("blue")
Exemple #16
0
def test_vrf_prefix_peer_remove_passwords():
    "selectively remove passwords checking state with VRF prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    configure_bgp("bgpd_vrf_prefix.conf")
    configure_ospf("ospfd_vrf.conf")
    check_vrf_peer_remove_passwords(vrf="blue", prefix="yes")
Exemple #17
0
def config_macvlan(tgen, r_str, device, macvlan):
    "Creates specified macvlan interace on physical device"

    if topotest.version_cmp(krel, "5.1") < 0:
        return

    router = tgen.gears[r_str]
    router.run("ip link add {} link {} type macvlan mode bridge".format(
        macvlan, device))
    router.run("ip link set {} up".format(macvlan))
Exemple #18
0
def test_default_prefix_peer_established():
    "default vrf 3 peers same password with prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    configure("bgpd_prefix.conf")
    check_all_peers_established()
    clear_bgp()
def test_evpn_gateway_ip_flap_rt5(request):
    """
    Withdraw EVPN type-5 routes and check O/Ps at PE1 and PE2
    """
    tgen = get_topogen()
    tc_name = request.node.name
    write_test_header(tc_name)

    kernelv = platform.release()
    if topotest.version_cmp(kernelv, "4.15") < 0:
        logger.info("For EVPN, kernel version should be minimum 4.15")
        write_test_footer(tc_name)
        return

    if tgen.routers_have_failure():
        pytest.skip(tgen.errors)

    h1 = tgen.gears['host1']

    step("Withdraw type-5 routes")

    h1.run('vtysh  -c "config t" \
                   -c "router bgp 111" \
                   -c "address-family ipv4" \
                   -c "no network 100.0.0.21/32"')
    h1.run('vtysh  -c "config t" \
                   -c "router bgp 111" \
                   -c "address-family ipv6" \
                   -c "no network 100::21/128"')

    result, assertmsg = evpn_gateway_ip_show_op_check("no_rt5")
    if result is not None:
        generate_support_bundle()
    assert result is None, assertmsg

    step("Advertise type-5 routes again")

    h1.run('vtysh  -c "config t" \
                   -c "router bgp 111" \
                   -c "address-family ipv4" \
                   -c "network 100.0.0.21/32"')
    h1.run('vtysh  -c "config t" \
                   -c "router bgp 111" \
                   -c "address-family ipv6" \
                   -c "network 100::21/128"')

    result, assertmsg = evpn_gateway_ip_show_op_check("base")
    if result is not None:
        generate_support_bundle()

    assert result is None, assertmsg

    write_test_footer(tc_name)
def test_multiple_vrf_prefix_peer_remove_passwords(tgen):
    "selectively remove passwords checking state with multiple vrfs and prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    reset_with_new_configs(tgen, "bgpd_multi_vrf_prefix.conf", "ospfd_multi_vrf.conf")
    check_vrf_peer_remove_passwords(vrf="blue", prefix="yes")
    check_all_peers_established("red")
    check_vrf_peer_remove_passwords(vrf="red", prefix="yes")
    check_all_peers_established("blue")
Exemple #21
0
def test_multiple_vrf_prefix_peer_established():
    "default vrf 3 peers same password with multilpe VRFs and prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    configure("bgpd_multi_vrf.conf")
    configure("ospfd_multi_vrf.conf")
    check_all_peers_established("blue")
    check_all_peers_established("red")
    clear_bgp("blue")
    clear_bgp("red")
Exemple #22
0
def test_multiple_vrf_prefix_peer_change_passwords():
    "selectively change passwords checking state with multiple vrfs and prefix config"

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        return

    configure_bgp("bgpd_multi_vrf_prefix.conf")
    configure_ospf("ospfd_multi_vrf.conf")
    check_vrf_peer_change_passwords(vrf="blue", prefix="yes")
    check_all_peers_established("red")
    check_vrf_peer_change_passwords(vrf="red", prefix="yes")
    check_all_peers_established("blue")
Exemple #23
0
 def exacmd_version_ok(exacmd):
     logger.debug("checking %s for exabgp < version 4", exacmd)
     _, stdout, _ = commander.cmd_status(exacmd + " -v", warn=False)
     m = re.search(r"ExaBGP\s*:\s*((\d+)\.(\d+)(?:\.(\d+))?)", stdout)
     if not m:
         return False
     version = m.group(1)
     if topotest.version_cmp(version, "4") >= 0:
         logging.debug("found exabgp version >= 4 in %s will keep looking",
                       exacmd)
         return False
     logger.info("Using ExaBGP version %s in %s", version, exacmd)
     return True
Exemple #24
0
    def build(self, *_args, **_opts):
        "Build function"
        tgen = get_topogen(self)

        # This function only purpose is to define allocation and relationship
        # between routers, switches and hosts.
        #
        # Create P/PE routers
        #check for mpls
        tgen.add_router('r1')
        if tgen.hasmpls != True:
            logger.info('MPLS not available, tests will be skipped')
            return
        mach = platform.machine()
        krel = platform.release()
        if mach[:1] == 'a' and topotest.version_cmp(krel, '4.11') < 0:
            logger.info('Need Kernel version 4.11 to run on arm processor')
            return
        for routern in range(2, 5):
            tgen.add_router('r{}'.format(routern))
        # Create CE routers
        for routern in range(1, 5):
            tgen.add_router('ce{}'.format(routern))

        #CE/PE links
        tgen.add_link(tgen.gears['ce1'], tgen.gears['r1'], 'ce1-eth0',
                      'r1-eth4')
        tgen.add_link(tgen.gears['ce2'], tgen.gears['r3'], 'ce2-eth0',
                      'r3-eth4')
        tgen.add_link(tgen.gears['ce3'], tgen.gears['r4'], 'ce3-eth0',
                      'r4-eth4')
        tgen.add_link(tgen.gears['ce4'], tgen.gears['r4'], 'ce4-eth0',
                      'r4-eth5')

        # Create a switch with just one router connected to it to simulate a
        # empty network.
        switch = {}
        switch[0] = tgen.add_switch('sw0')
        switch[0].add_link(tgen.gears['r1'], nodeif='r1-eth0')
        switch[0].add_link(tgen.gears['r2'], nodeif='r2-eth0')

        switch[1] = tgen.add_switch('sw1')
        switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth1')
        switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth0')
        switch[1].add_link(tgen.gears['r4'], nodeif='r4-eth0')

        switch[1] = tgen.add_switch('sw2')
        switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth2')
        switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth1')
Exemple #25
0
    def build(self, *_args, **_opts):
        "Build function"
        tgen = get_topogen(self)

        # This function only purpose is to define allocation and relationship
        # between routers, switches and hosts.
        #
        # Create P/PE routers
        # check for mpls
        tgen.add_router("r1")
        if tgen.hasmpls != True:
            logger.info("MPLS not available, tests will be skipped")
            return
        mach = platform.machine()
        krel = platform.release()
        if mach[:1] == "a" and topotest.version_cmp(krel, "4.11") < 0:
            logger.info("Need Kernel version 4.11 to run on arm processor")
            return
        for routern in range(2, 5):
            tgen.add_router("r{}".format(routern))
        # Create CE routers
        for routern in range(1, 5):
            tgen.add_router("ce{}".format(routern))

        # CE/PE links
        tgen.add_link(tgen.gears["ce1"], tgen.gears["r1"], "ce1-eth0",
                      "r1-eth4")
        tgen.add_link(tgen.gears["ce2"], tgen.gears["r3"], "ce2-eth0",
                      "r3-eth4")
        tgen.add_link(tgen.gears["ce3"], tgen.gears["r4"], "ce3-eth0",
                      "r4-eth4")
        tgen.add_link(tgen.gears["ce4"], tgen.gears["r4"], "ce4-eth0",
                      "r4-eth5")

        # Create a switch with just one router connected to it to simulate a
        # empty network.
        switch = {}
        switch[0] = tgen.add_switch("sw0")
        switch[0].add_link(tgen.gears["r1"], nodeif="r1-eth0")
        switch[0].add_link(tgen.gears["r2"], nodeif="r2-eth0")

        switch[1] = tgen.add_switch("sw1")
        switch[1].add_link(tgen.gears["r2"], nodeif="r2-eth1")
        switch[1].add_link(tgen.gears["r3"], nodeif="r3-eth0")
        switch[1].add_link(tgen.gears["r4"], nodeif="r4-eth0")

        switch[1] = tgen.add_switch("sw2")
        switch[1].add_link(tgen.gears["r2"], nodeif="r2-eth2")
        switch[1].add_link(tgen.gears["r3"], nodeif="r3-eth1")
Exemple #26
0
def setup_module(mod):
    """

    Set up the pytest environment.

    * `mod`: module name
    """
    testsuite_run_time = time.asctime(time.localtime(time.time()))
    logger.info("Testsuite start time: {}".format(testsuite_run_time))
    logger.info("=" * 40)

    logger.info("Running setup_module to create topology")

    # This function initiates the topology build with Topogen...
    json_file = "{}/static_routes_topo3_ibgp.json".format(CWD)
    tgen = Topogen(json_file, mod.__name__)
    global topo
    topo = tgen.json_topo
    # ... and here it calls Mininet initialization functions.

    # Starting topology, create tmp files which are loaded to routers
    #  to start deamons and then start routers
    start_topology(tgen)

    # Creating configuration from JSON
    build_config_from_json(tgen, topo)

    if version_cmp(platform.release(), "4.19") < 0:
        error_msg = (
            'These tests will not run. (have kernel "{}", '
            "requires kernel >= 4.19)".format(platform.release())
        )
        pytest.skip(error_msg)

    # Checking BGP convergence
    global BGP_CONVERGENCE
    global ADDR_TYPES

    # Don't run this test if we have any failure.
    if tgen.routers_have_failure():
        pytest.skip(tgen.errors)
    # Api call verify whether BGP is converged
    BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
    assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format(
        BGP_CONVERGENCE
    )

    logger.info("Running setup_module() done")
Exemple #27
0
def setup_module(mod):
    """
    Sets up the pytest environment

    * `mod`: module name
    """

    testsuite_run_time = time.asctime(time.localtime(time.time()))
    logger.info("Testsuite start time: {}".format(testsuite_run_time))
    logger.info("=" * 40)

    logger.info("Running setup_module to create topology")

    # This function initiates the topology build with Topogen...
    json_file = "{}/evpn_type5_chaos_topo1.json".format(CWD)
    tgen = Topogen(json_file, mod.__name__)
    global topo
    topo = tgen.json_topo
    # ... and here it calls Mininet initialization functions.

    # Starting topology, create tmp files which are loaded to routers
    #  to start deamons and then start routers
    start_topology(tgen)

    # Creating configuration from JSON
    build_config_from_json(tgen, topo)

    if version_cmp(platform.release(), "4.19") < 0:
        error_msg = (
            'EVPN tests will not run (have kernel "{}", '
            "but it requires >= 4.19)".format(platform.release())
        )
        pytest.skip(error_msg)

    global BGP_CONVERGENCE
    global ADDR_TYPES
    ADDR_TYPES = check_address_types()

    BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
    assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format(
        BGP_CONVERGENCE
    )

    logger.info("Pre-requisite config for testsuite")
    prerequisite_config_for_test_suite(tgen)

    logger.info("Running setup_module() done")
Exemple #28
0
def test_vrf_prefix_peer_change_passwords():
    "selectively change passwords checking state with VRF prefix config"

    tgen = get_topogen()
    r1 = tgen.gears["R1"]
    r2 = tgen.gears["R2"]
    r3 = tgen.gears["R3"]

    # only supported in kernel > 5.3
    if topotest.version_cmp(platform.release(), "5.3") < 0:
        clear_ospf("blue")
        return

    configure("bgpd_vrf_prefix.conf")
    check_vrf_peer_change_passwords(vrf="blue", prefix="yes")
    clear_bgp("blue")
    clear_ospf("blue")
Exemple #29
0
    def build(self, *_args, **_opts):
        "Build function"
        tgen = get_topogen(self)

        # This function only purpose is to define allocation and relationship
        # between routers, switches and hosts.
        #
        # Create P/PE routers
        #check for mpls
        tgen.add_router('r1')
        if tgen.hasmpls != True:
            logger.info('MPLS not available, tests will be skipped')
            return
        mach = platform.machine()
        krel = platform.release()
        if mach[:1] == 'a' and topotest.version_cmp(krel, '4.11') < 0:
            logger.info('Need Kernel version 4.11 to run on arm processor')
            return
        for routern in range(2, 5):
            tgen.add_router('r{}'.format(routern))
        # Create CE routers
        for routern in range(1, 5):
            tgen.add_router('ce{}'.format(routern))

        #CE/PE links
        tgen.add_link(tgen.gears['ce1'], tgen.gears['r1'], 'ce1-eth0', 'r1-eth4')
        tgen.add_link(tgen.gears['ce2'], tgen.gears['r3'], 'ce2-eth0', 'r3-eth4')
        tgen.add_link(tgen.gears['ce3'], tgen.gears['r4'], 'ce3-eth0', 'r4-eth4')
        tgen.add_link(tgen.gears['ce4'], tgen.gears['r4'], 'ce4-eth0', 'r4-eth5')

        # Create a switch with just one router connected to it to simulate a
        # empty network.
        switch = {}
        switch[0] = tgen.add_switch('sw0')
        switch[0].add_link(tgen.gears['r1'], nodeif='r1-eth0')
        switch[0].add_link(tgen.gears['r2'], nodeif='r2-eth0')

        switch[1] = tgen.add_switch('sw1')
        switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth1')
        switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth0')
        switch[1].add_link(tgen.gears['r4'], nodeif='r4-eth0')

        switch[1] = tgen.add_switch('sw2')
        switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth2')
        switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth1')
def setup_module(mod):
    """
    Sets up the pytest environment

    * `mod`: module name
    """

    global topo
    testsuite_run_time = time.asctime(time.localtime(time.time()))
    logger.info("Testsuite start time: {}".format(testsuite_run_time))
    logger.info("=" * 40)

    logger.info("Running setup_module to create topology")

    # This function initiates the topology build with Topogen...
    tgen = Topogen(build_topo, mod.__name__)
    # ... and here it calls Mininet initialization functions.

    # Starting topology, create tmp files which are loaded to routers
    #  to start deamons and then start routers
    start_topology(tgen)

    # Run these tests for kernel version 4.19 or above
    if version_cmp(platform.release(), "4.19") < 0:
        error_msg = (
            "BGP vrf dynamic route leak tests will not run "
            '(have kernel "{}", but it requires >= 4.19)'.format(platform.release())
        )
        pytest.skip(error_msg)

    # Creating configuration from JSON
    build_config_from_json(tgen, topo)

    global BGP_CONVERGENCE
    global ADDR_TYPES
    ADDR_TYPES = check_address_types()

    BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
    assert BGP_CONVERGENCE is True, "setup_module : Failed \n Error: {}".format(
        BGP_CONVERGENCE
    )

    logger.info("Running setup_module() done")
def test_evpn_gateway_ip_flap_rt2(request):
    """
     Withdraw EVPN type-2 routes and check O/Ps at PE1 and PE2
     """
    tgen = get_topogen()
    tc_name = request.node.name
    write_test_header(tc_name)

    kernelv = platform.release()
    if topotest.version_cmp(kernelv, "4.15") < 0:
        logger.info("For EVPN, kernel version should be minimum 4.15")
        write_test_footer(tc_name)
        return

    if tgen.routers_have_failure():
        pytest.skip(tgen.errors)

    step(
        "Shut down VxLAN interface at PE1 which results in withdraw of type-2 routes"
    )

    pe1 = tgen.gears['PE1']

    pe1.run('ip link set dev vxlan100 down')

    result, assertmsg = evpn_gateway_ip_show_op_check("no_rt2")
    if result is not None:
        generate_support_bundle()
    assert result is None, assertmsg

    step("Bring up VxLAN interface at PE1 and advertise type-2 routes again")

    pe1.run('ip link set dev vxlan100 up')

    result, assertmsg = evpn_gateway_ip_show_op_check("base")
    if result is not None:
        generate_support_bundle()
    assert result is None, assertmsg

    write_test_footer(tc_name)
Exemple #32
0
def test_protodown():
    "Run protodown basic functionality test and report results."
    pdown = False
    count = 0
    tgen = get_topogen()
    if topotest.version_cmp(krel, "5.1") < 0:
        tgen.errors = "kernel 5.1 needed for protodown tests"
        pytest.skip(tgen.errors)

    r1 = tgen.gears["r1"]

    # Set interface protodown on
    r1.vtysh_cmd("sharp interface r1-eth0-macvlan protodown")

    # Timeout to wait for dplane to handle it
    while count < 10:
        count += 1
        output = r1.vtysh_cmd("show interface r1-eth0-macvlan")
        if re.search(r"protodown reasons:.*sharp", output):
            pdown = True
            break
        sleep(1)

    assert pdown is True, "Interface r1-eth0-macvlan not set protodown"

    # Set interface protodown off
    r1.vtysh_cmd("no sharp interface r1-eth0-macvlan protodown")

    # Timeout to wait for dplane to handle it
    while count < 10:
        count += 1
        output = r1.vtysh_cmd("show interface r1-eth0-macvlan")
        if not re.search(r"protodown reasons:.*sharp", output):
            pdown = False
            break
        sleep(1)

    assert pdown is False, "Interface r1-eth0-macvlan not set protodown off"
Exemple #33
0
def ltemplatePreRouterStartHook():
    global l3mdev_accept
    cc = ltemplateRtrCmd()
    krel = platform.release()
    tgen = get_topogen()
    logger.info('pre router-start hook, kernel=' + krel)
    if topotest.version_cmp(krel, '4.15') == 0:
        l3mdev_accept = 1
    else:
        l3mdev_accept = 0
    logger.info('setting net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept))
    #check for mpls
    if tgen.hasmpls != True:
        logger.info('MPLS not available, skipping setup')
        return False
    #check for normal init
    if len(tgen.net) == 1:
        logger.info('Topology not configured, skipping setup')
        return False
    #trace errors/unexpected output
    cc.resetCounts()
    #configure r2 mpls interfaces
    intfs = ['lo', 'r2-eth0', 'r2-eth1', 'r2-eth2']
    for intf in intfs:
        cc.doCmd(tgen, 'r2', 'echo 1 > /proc/sys/net/mpls/conf/{}/input'.format(intf))

    #configure cust1 VRFs & MPLS
    rtrs = ['r1', 'r3', 'r4']
    cmds = ['ip link add {0}-cust1 type vrf table 10',
            'ip ru add oif {0}-cust1 table 10',
            'ip ru add iif {0}-cust1 table 10',
            'ip link set dev {0}-cust1 up',
            'sysctl -w net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept)]
    for rtr in rtrs:
        router = tgen.gears[rtr]
        for cmd in cmds:
            cc.doCmd(tgen, rtr, cmd.format(rtr))
        cc.doCmd(tgen, rtr, 'ip link set dev {0}-eth4 master {0}-cust1'.format(rtr))
        intfs = [rtr+'-cust1', 'lo', rtr+'-eth0', rtr+'-eth4']
        for intf in intfs:
            cc.doCmd(tgen, rtr, 'echo 1 > /proc/sys/net/mpls/conf/{}/input'.format(intf))
        logger.info('setup {0} vrf {0}-cust1, {0}-eth4. enabled mpls input.'.format(rtr))
    #configure cust2 VRFs & MPLS
    rtrs = ['r4']
    cmds = ['ip link add {0}-cust2 type vrf table 20',
            'ip ru add oif {0}-cust2 table 20',
            'ip ru add iif {0}-cust2 table 20',
            'ip link set dev {0}-cust2 up']
    for rtr in rtrs:
        for cmd in cmds:
            cc.doCmd(tgen, rtr, cmd.format(rtr))
        cc.doCmd(tgen, rtr, 'ip link set dev {0}-eth5 master {0}-cust2'.format(rtr))
        intfs = [rtr+'-cust2', rtr+'-eth5']
        for intf in intfs:
            cc.doCmd(tgen, rtr, 'echo 1 > /proc/sys/net/mpls/conf/{}/input'.format(intf))
        logger.info('setup {0} vrf {0}-cust2, {0}-eth5. enabled mpls input.'.format(rtr))
    #put ce4-eth0 into a VRF (no default instance!)
    rtrs = ['ce4']
    cmds = ['ip link add {0}-cust2 type vrf table 20',
            'ip ru add oif {0}-cust2 table 20',
            'ip ru add iif {0}-cust2 table 20',
            'ip link set dev {0}-cust2 up',
            'sysctl -w net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept)]
    for rtr in rtrs:
        for cmd in cmds:
            cc.doCmd(tgen, rtr, cmd.format(rtr))
        cc.doCmd(tgen, rtr, 'ip link set dev {0}-eth0 master {0}-cust2'.format(rtr))
    if cc.getOutput() != 4:
        InitSuccess = False
        logger.info('Unexpected output seen ({} times, tests will be skipped'.format(cc.getOutput()))
    else:
        InitSuccess = True
        logger.info('VRF config successful!')
    return InitSuccess
Exemple #34
0
def diagnose_env_linux():
    """
    Run diagnostics in the running environment. Returns `True` when everything
    is ok, otherwise `False`.
    """
    ret = True

    # Test log path exists before installing handler.
    if not os.path.isdir('/tmp'):
        logger.warning('could not find /tmp for logs')
    else:
        os.system('mkdir /tmp/topotests')
        # Log diagnostics to file so it can be examined later.
        fhandler = logging.FileHandler(filename='/tmp/topotests/diagnostics.txt')
        fhandler.setLevel(logging.DEBUG)
        fhandler.setFormatter(
            logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s')
        )
        logger.addHandler(fhandler)

    logger.info('Running environment diagnostics')

    # Load configuration
    config = configparser.ConfigParser(tgen_defaults)
    pytestini_path = os.path.join(CWD, '../pytest.ini')
    config.read(pytestini_path)

    # Assert that we are running as root
    if os.getuid() != 0:
        logger.error('you must run topotest as root')
        ret = False

    # Assert that we have mininet
    if os.system('which mn >/dev/null 2>/dev/null') != 0:
        logger.error('could not find mininet binary (mininet is not installed)')
        ret = False

    # Assert that we have iproute installed
    if os.system('which ip >/dev/null 2>/dev/null') != 0:
        logger.error('could not find ip binary (iproute is not installed)')
        ret = False

    # Assert that we have gdb installed
    if os.system('which gdb >/dev/null 2>/dev/null') != 0:
        logger.error('could not find gdb binary (gdb is not installed)')
        ret = False

    # Assert that FRR utilities exist
    frrdir = config.get('topogen', 'frrdir')
    hasfrr = False
    if not os.path.isdir(frrdir):
        logger.error('could not find {} directory'.format(frrdir))
        ret = False
    else:
        hasfrr = True
        try:
            pwd.getpwnam('frr')[2]
        except KeyError:
            logger.warning('could not find "frr" user')

        try:
            grp.getgrnam('frr')[2]
        except KeyError:
            logger.warning('could not find "frr" group')

        try:
            if 'frr' not in grp.getgrnam('frrvty').gr_mem:
                logger.error('"frr" user and group exist, but user is not under "frrvty"')
        except KeyError:
            logger.warning('could not find "frrvty" group')

        for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd',
                      'isisd', 'pimd', 'ldpd']:
            path = os.path.join(frrdir, fname)
            if not os.path.isfile(path):
                # LDPd is an exception
                if fname == 'ldpd':
                    logger.info('could not find {} in {}'.format(fname, frrdir) +
                                '(LDPd tests will not run)')
                    continue

                logger.warning('could not find {} in {}'.format(fname, frrdir))
                ret = False
            else:
                if fname != 'zebra':
                    continue

                os.system(
                    '{} -v 2>&1 >/tmp/topotests/frr_zebra.txt'.format(path)
                )

    # Assert that Quagga utilities exist
    quaggadir = config.get('topogen', 'quaggadir')
    if hasfrr:
        # if we have frr, don't check for quagga
        pass
    elif not os.path.isdir(quaggadir):
        logger.info('could not find {} directory (quagga tests will not run)'.format(quaggadir))
    else:
        ret = True
        try:
            pwd.getpwnam('quagga')[2]
        except KeyError:
            logger.info('could not find "quagga" user')

        try:
            grp.getgrnam('quagga')[2]
        except KeyError:
            logger.info('could not find "quagga" group')

        try:
            if 'quagga' not in grp.getgrnam('quaggavty').gr_mem:
                logger.error('"quagga" user and group exist, but user is not under "quaggavty"')
        except KeyError:
            logger.warning('could not find "quaggavty" group')

        for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd',
                      'isisd', 'pimd']:
            path = os.path.join(quaggadir, fname)
            if not os.path.isfile(path):
                logger.warning('could not find {} in {}'.format(fname, quaggadir))
                ret = False
            else:
                if fname != 'zebra':
                    continue

                os.system(
                    '{} -v 2>&1 >/tmp/topotests/quagga_zebra.txt'.format(path)
                )

    # Test MPLS availability
    krel = platform.release()
    if topotest.version_cmp(krel, '4.5') < 0:
        logger.info('LDPd tests will not run (have kernel "{}", but it requires 4.5)'.format(krel))

    # Test for MPLS Kernel modules available
    if not topotest.module_present('mpls-router', load=False) != 0:
        logger.info('LDPd tests will not run (missing mpls-router kernel module)')
    if not topotest.module_present('mpls-iptunnel', load=False) != 0:
        logger.info('LDPd tests will not run (missing mpls-iptunnel kernel module)')

    # TODO remove me when we start supporting exabgp >= 4
    try:
        output = subprocess.check_output(['exabgp', '-v'])
        line = output.split('\n')[0]
        version = line.split(' ')[2]
        if topotest.version_cmp(version, '4') >= 0:
            logger.warning('BGP topologies are still using exabgp version 3, expect failures')

    # We want to catch all exceptions
    # pylint: disable=W0702
    except:
        logger.warning('failed to find exabgp or returned error')

    # After we logged the output to file, remove the handler.
    logger.removeHandler(fhandler)

    return ret
Exemple #35
0
def test_regression_1():
    """
    Test regression on the following type of comparison: '3.0.2' > '3'
    Expected result is 1.
    """
    assert version_cmp('3.0.2', '3') == 1
Exemple #36
0
def test_valid_versions():
    "Test valid version compare results"

    curver = '3.0'
    samever = '3'
    oldver = '2.0'
    newver = '3.0.1'
    newerver = '3.0.11'
    vercustom = '3.0-dev'
    verysmallinc = '3.0.0.0.0.0.0.1'

    assert version_cmp(curver, oldver) == 1
    assert version_cmp(curver, newver) == -1
    assert version_cmp(curver, curver) == 0
    assert version_cmp(curver, newerver) == -1
    assert version_cmp(newver, newerver) == -1
    assert version_cmp(curver, samever) == 0
    assert version_cmp(curver, vercustom) == 0
    assert version_cmp(vercustom, vercustom) == 0
    assert version_cmp(vercustom, oldver) == 1
    assert version_cmp(vercustom, newver) == -1
    assert version_cmp(vercustom, samever) == 0
    assert version_cmp(curver, verysmallinc) == -1
    assert version_cmp(newver, verysmallinc) == 1
    assert version_cmp(verysmallinc, verysmallinc) == 0
    assert version_cmp(vercustom, verysmallinc) == -1