summaryrefslogtreecommitdiff
path: root/tests/topotests/lib/topogen.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/topotests/lib/topogen.py')
-rw-r--r--tests/topotests/lib/topogen.py136
1 files changed, 107 insertions, 29 deletions
diff --git a/tests/topotests/lib/topogen.py b/tests/topotests/lib/topogen.py
index 3583ce17ed..f49e30ea5f 100644
--- a/tests/topotests/lib/topogen.py
+++ b/tests/topotests/lib/topogen.py
@@ -81,20 +81,22 @@ def is_string(value):
def get_exabgp_cmd(commander=None):
- """Return the command to use for ExaBGP version < 4."""
+ """Return the command to use for ExaBGP version >= 4.2.11"""
if commander is None:
- commander = Commander("topogen")
+ commander = Commander("exabgp", logger=logging.getLogger("exabgp"))
def exacmd_version_ok(exacmd):
- logger.debug("checking %s for exabgp < version 4", exacmd)
+ logger.debug("checking %s for exabgp version >= 4.2.11", 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)
+ if topotest.version_cmp(version, "4.2.11") < 0:
+ logging.debug(
+ "found exabgp version < 4.2.11 in %s will keep looking", exacmd
+ )
return False
logger.info("Using ExaBGP version %s in %s", version, exacmd)
return True
@@ -102,14 +104,14 @@ def get_exabgp_cmd(commander=None):
exacmd = commander.get_exec_path("exabgp")
if exacmd and exacmd_version_ok(exacmd):
return exacmd
- py2_path = commander.get_exec_path("python2")
- if py2_path:
- exacmd = py2_path + " -m exabgp"
+ py3_path = commander.get_exec_path("python3")
+ if py3_path:
+ exacmd = py3_path + " -m exabgp"
if exacmd_version_ok(exacmd):
return exacmd
- py2_path = commander.get_exec_path("python")
- if py2_path:
- exacmd = py2_path + " -m exabgp"
+ py3_path = commander.get_exec_path("python")
+ if py3_path:
+ exacmd = py3_path + " -m exabgp"
if exacmd_version_ok(exacmd):
return exacmd
return None
@@ -209,7 +211,11 @@ class Topogen(object):
# Mininet(Micronet) to build the actual topology.
assert not inspect.isclass(topodef)
- self.net = Mininet(rundir=self.logdir, pytestconfig=topotest.g_pytest_config)
+ self.net = Mininet(
+ rundir=self.logdir,
+ pytestconfig=topotest.g_pytest_config,
+ logger=topolog.get_logger("mu", log_level="debug"),
+ )
# Adjust the parent namespace
topotest.fix_netns_limits(self.net)
@@ -236,7 +242,6 @@ class Topogen(object):
self.add_topology_from_dict(topodef)
def add_topology_from_dict(self, topodef):
-
keylist = (
topodef.keys()
if isinstance(topodef, OrderedDict)
@@ -360,6 +365,15 @@ class Topogen(object):
self.peern += 1
return self.gears[name]
+ def add_bmp_server(self, name, ip, defaultRoute, port=1789):
+ """Add the bmp collector gear"""
+ if name in self.gears:
+ raise KeyError("The bmp server already exists")
+
+ self.gears[name] = TopoBMPCollector(
+ self, name, ip=ip, defaultRoute=defaultRoute, port=port
+ )
+
def add_link(self, node1, node2, ifname1=None, ifname2=None):
"""
Creates a connection between node1 and node2. The nodes can be the
@@ -422,6 +436,13 @@ class Topogen(object):
"""
return self.get_gears(TopoExaBGP)
+ def get_bmp_servers(self):
+ """
+ Retruns the bmp servers dictionnary (the key is the bmp server the
+ value is the bmp server object itself).
+ """
+ return self.get_gears(TopoBMPCollector)
+
def start_topology(self):
"""Starts the topology class."""
logger.info("starting topology: {}".format(self.modname))
@@ -700,6 +721,7 @@ class TopoRouter(TopoGear):
"/etc/frr",
"/etc/snmp",
"/var/run/frr",
+ "/var/lib/frr",
"/var/log",
]
@@ -725,6 +747,8 @@ class TopoRouter(TopoGear):
RD_SNMP = 18
RD_PIM6 = 19
RD_MGMTD = 20
+ RD_TRAP = 21
+ RD_FPM_LISTENER = 22
RD = {
RD_FRR: "frr",
RD_ZEBRA: "zebra",
@@ -747,6 +771,8 @@ class TopoRouter(TopoGear):
RD_PATH: "pathd",
RD_SNMP: "snmpd",
RD_MGMTD: "mgmtd",
+ RD_TRAP: "snmptrapd",
+ RD_FPM_LISTENER: "fpm_listener",
}
def __init__(self, tgen, cls, name, **params):
@@ -799,23 +825,23 @@ class TopoRouter(TopoGear):
Start the daemons in the list
If daemons is None, try to infer daemons from the config file
"""
- self.load_config(self.RD_FRR, source)
+ source_path = self.load_config(self.RD_FRR, source)
if not daemons:
# Always add zebra
- self.load_config(self.RD_ZEBRA)
+ self.load_config(self.RD_ZEBRA, "")
for daemon in self.RD:
# This will not work for all daemons
daemonstr = self.RD.get(daemon).rstrip("d")
if daemonstr == "pim":
- grep_cmd = "grep 'ip {}' {}".format(daemonstr, source)
+ grep_cmd = "grep 'ip {}' {}".format(daemonstr, source_path)
else:
- grep_cmd = "grep 'router {}' {}".format(daemonstr, source)
+ grep_cmd = "grep 'router {}' {}".format(daemonstr, source_path)
result = self.run(grep_cmd, warn=False).strip()
if result:
- self.load_config(daemon)
+ self.load_config(daemon, "")
else:
for daemon in daemons:
- self.load_config(daemon)
+ self.load_config(daemon, "")
def load_config(self, daemon, source=None, param=None):
"""Loads daemon configuration from the specified source
@@ -823,7 +849,8 @@ class TopoRouter(TopoGear):
TopoRouter.RD_RIPNG, TopoRouter.RD_OSPF, TopoRouter.RD_OSPF6,
TopoRouter.RD_ISIS, TopoRouter.RD_BGP, TopoRouter.RD_LDP,
TopoRouter.RD_PIM, TopoRouter.RD_PIM6, TopoRouter.RD_PBR,
- TopoRouter.RD_SNMP, TopoRouter.RD_MGMTD.
+ TopoRouter.RD_SNMP, TopoRouter.RD_MGMTD, TopoRouter.RD_TRAP,
+ TopoRouter.RD_FPM_LISTENER.
Possible `source` values are `None` for an empty config file, a path name which is
used directly, or a file name with no path components which is first looked for
@@ -834,7 +861,7 @@ class TopoRouter(TopoGear):
"""
daemonstr = self.RD.get(daemon)
self.logger.debug('loading "{}" configuration: {}'.format(daemonstr, source))
- self.net.loadConf(daemonstr, source, param)
+ return self.net.loadConf(daemonstr, source, param)
def check_router_running(self):
"""
@@ -861,7 +888,12 @@ class TopoRouter(TopoGear):
# Enable all daemon command logging, logging files
# and set them to the start dir.
for daemon, enabled in nrouter.daemons.items():
- if enabled and daemon != "snmpd":
+ if (
+ enabled
+ and daemon != "snmpd"
+ and daemon != "snmptrapd"
+ and daemon != "fpm_listener"
+ ):
self.vtysh_cmd(
"\n".join(
[
@@ -869,7 +901,7 @@ class TopoRouter(TopoGear):
"conf t",
"log file {}.log debug".format(daemon),
"log commands",
- "log timestamp precision 3",
+ "log timestamp precision 6",
]
),
daemon=daemon,
@@ -911,7 +943,7 @@ class TopoRouter(TopoGear):
# and set them to the start dir.
for daemon in daemons:
enabled = nrouter.daemons[daemon]
- if enabled and daemon != "snmpd":
+ if enabled and daemon != "snmpd" and daemon != "fpm_listener":
self.vtysh_cmd(
"\n".join(
[
@@ -919,7 +951,7 @@ class TopoRouter(TopoGear):
"conf t",
"log file {}.log debug".format(daemon),
"log commands",
- "log timestamp precision 3",
+ "log timestamp precision 6",
]
),
daemon=daemon,
@@ -1091,8 +1123,9 @@ class TopoSwitch(TopoGear):
# pylint: disable=too-few-public-methods
def __init__(self, tgen, name, **params):
+ logger = topolog.get_logger(name, log_level="debug")
super(TopoSwitch, self).__init__(tgen, name, **params)
- tgen.net.add_switch(name)
+ tgen.net.add_switch(name, logger=logger)
def __str__(self):
gear = super(TopoSwitch, self).__str__()
@@ -1176,7 +1209,7 @@ class TopoExaBGP(TopoHost):
* Run ExaBGP with env file `env_file` and configuration peer*/exabgp.cfg
"""
exacmd = self.tgen.get_exabgp_cmd()
- assert exacmd, "Can't find a usabel ExaBGP (must be < version 4)"
+ assert exacmd, "Can't find a usable ExaBGP (must be version >= 4.2.11)"
self.run("mkdir -p /etc/exabgp")
self.run("chmod 755 /etc/exabgp")
@@ -1187,8 +1220,22 @@ class TopoExaBGP(TopoHost):
self.run("chmod 644 /etc/exabgp/*")
self.run("chmod a+x /etc/exabgp/*.py")
self.run("chown -R exabgp:exabgp /etc/exabgp")
+ self.run("[ -p /var/run/exabgp.in ] || mkfifo /var/run/exabgp.in")
+ self.run("[ -p /var/run/exabgp.out ] || mkfifo /var/run/exabgp.out")
+ self.run("chown exabgp:exabgp /var/run/exabgp.{in,out}")
+ self.run("chmod 600 /var/run/exabgp.{in,out}")
+
+ log_dir = os.path.join(self.logdir, self.name)
+ self.run("chmod 777 {}".format(log_dir))
+
+ log_file = os.path.join(log_dir, "exabgp.log")
- output = self.run(exacmd + " -e /etc/exabgp/exabgp.env /etc/exabgp/exabgp.cfg")
+ env_cmd = "env exabgp.log.level=INFO "
+ env_cmd += "exabgp.log.destination={} ".format(log_file)
+
+ output = self.run(
+ env_cmd + exacmd + " -e /etc/exabgp/exabgp.env /etc/exabgp/exabgp.cfg "
+ )
if output is None or len(output) == 0:
output = "<none>"
@@ -1200,10 +1247,41 @@ class TopoExaBGP(TopoHost):
return ""
+class TopoBMPCollector(TopoHost):
+ PRIVATE_DIRS = [
+ "/var/log",
+ ]
+
+ def __init__(self, tgen, name, **params):
+ params["private_mounts"] = self.PRIVATE_DIRS
+ self.port = params["port"]
+ self.ip = params["ip"]
+ super(TopoBMPCollector, self).__init__(tgen, name, **params)
+
+ def __str__(self):
+ gear = super(TopoBMPCollector, self).__str__()
+ gear += " TopoBMPCollector<>".format()
+ return gear
+
+ def start(self, log_file=None):
+ log_arg = "-l {}".format(log_file) if log_file else ""
+ self.run(
+ "{}/bmp_collector/bmpserver -a {} -p {} {}&".format(
+ CWD, self.ip, self.port, log_arg
+ ),
+ stdout=None,
+ )
+
+ def stop(self):
+ self.run("pkill -9 -f bmpserver")
+ return ""
+
+
#
# Diagnostic function
#
+
# Disable linter branch warning. It is expected to have these here.
# pylint: disable=R0912
def diagnose_env_linux(rundir):
@@ -1321,7 +1399,7 @@ def diagnose_env_linux(rundir):
logger.info("LDPd tests will not run (missing mpls-iptunnel kernel module)")
if not get_exabgp_cmd():
- logger.warning("Failed to find exabgp < 4")
+ logger.warning("Failed to find exabgp >= 4.2.11")
logger.removeHandler(fhandler)
fhandler.close()