diff options
Diffstat (limited to 'tests/topotests/lib/topotest.py')
| -rw-r--r-- | tests/topotests/lib/topotest.py | 127 |
1 files changed, 83 insertions, 44 deletions
diff --git a/tests/topotests/lib/topotest.py b/tests/topotests/lib/topotest.py index 76a9430fa5..39b01203e9 100644 --- a/tests/topotests/lib/topotest.py +++ b/tests/topotests/lib/topotest.py @@ -54,6 +54,7 @@ from lib.micronet_compat import Node g_extra_config = {} + def get_logs_path(rundir): logspath = topolog.get_test_logdir() return os.path.join(rundir, logspath) @@ -1084,7 +1085,7 @@ def _sysctl_atleast(commander, variable, min_value): else: valstr = str(min_value) logger.info("Increasing sysctl %s from %s to %s", variable, cur_val, valstr) - commander.cmd_raises("sysctl -w {}=\"{}\"\n".format(variable, valstr)) + commander.cmd_raises('sysctl -w {}="{}"\n'.format(variable, valstr)) def _sysctl_assure(commander, variable, value): @@ -1115,7 +1116,7 @@ def _sysctl_assure(commander, variable, value): else: valstr = str(value) logger.info("Changing sysctl %s from %s to %s", variable, cur_val, valstr) - commander.cmd_raises("sysctl -w {}=\"{}\"\n".format(variable, valstr)) + commander.cmd_raises('sysctl -w {}="{}"\n'.format(variable, valstr)) def sysctl_atleast(commander, variable, min_value, raises=False): @@ -1126,7 +1127,9 @@ def sysctl_atleast(commander, variable, min_value, raises=False): except subprocess.CalledProcessError as error: logger.warning( "%s: Failed to assure sysctl min value %s = %s", - commander, variable, min_value + commander, + variable, + min_value, ) if raises: raise @@ -1140,7 +1143,10 @@ def sysctl_assure(commander, variable, value, raises=False): except subprocess.CalledProcessError as error: logger.warning( "%s: Failed to assure sysctl value %s = %s", - commander, variable, value, exc_info=True + commander, + variable, + value, + exc_info=True, ) if raises: raise @@ -1156,8 +1162,7 @@ def rlimit_atleast(rname, min_value, raises=False): resource.setrlimit(rname, nval) except subprocess.CalledProcessError as error: logger.warning( - "Failed to assure rlimit [%s] = %s", - rname, min_value, exc_info=True + "Failed to assure rlimit [%s] = %s", rname, min_value, exc_info=True ) if raises: raise @@ -1166,8 +1171,8 @@ def rlimit_atleast(rname, min_value, raises=False): def fix_netns_limits(ns): # Maximum read and write socket buffer sizes - sysctl_atleast(ns, "net.ipv4.tcp_rmem", [10*1024, 87380, 16*2**20]) - sysctl_atleast(ns, "net.ipv4.tcp_wmem", [10*1024, 87380, 16*2**20]) + sysctl_atleast(ns, "net.ipv4.tcp_rmem", [10 * 1024, 87380, 16 * 2 ** 20]) + sysctl_atleast(ns, "net.ipv4.tcp_wmem", [10 * 1024, 87380, 16 * 2 ** 20]) sysctl_assure(ns, "net.ipv4.conf.all.rp_filter", 0) sysctl_assure(ns, "net.ipv4.conf.default.rp_filter", 0) @@ -1210,10 +1215,10 @@ def fix_netns_limits(ns): def fix_host_limits(): """Increase system limits.""" - rlimit_atleast(resource.RLIMIT_NPROC, 8*1024) - rlimit_atleast(resource.RLIMIT_NOFILE, 16*1024) - sysctl_atleast(None, "fs.file-max", 16*1024) - sysctl_atleast(None, "kernel.pty.max", 16*1024) + rlimit_atleast(resource.RLIMIT_NPROC, 8 * 1024) + rlimit_atleast(resource.RLIMIT_NOFILE, 16 * 1024) + sysctl_atleast(None, "fs.file-max", 16 * 1024) + sysctl_atleast(None, "kernel.pty.max", 16 * 1024) # Enable coredumps # Original on ubuntu 17.x, but apport won't save as in namespace @@ -1223,20 +1228,20 @@ def fix_host_limits(): sysctl_assure(None, "fs.suid_dumpable", 1) # Maximum connection backlog - sysctl_atleast(None, "net.core.netdev_max_backlog", 4*1024) + sysctl_atleast(None, "net.core.netdev_max_backlog", 4 * 1024) # Maximum read and write socket buffer sizes - sysctl_atleast(None, "net.core.rmem_max", 16 * 2**20) - sysctl_atleast(None, "net.core.wmem_max", 16 * 2**20) + sysctl_atleast(None, "net.core.rmem_max", 16 * 2 ** 20) + sysctl_atleast(None, "net.core.wmem_max", 16 * 2 ** 20) # Garbage Collection Settings for ARP and Neighbors - sysctl_atleast(None, "net.ipv4.neigh.default.gc_thresh2", 4*1024) - sysctl_atleast(None, "net.ipv4.neigh.default.gc_thresh3", 8*1024) - sysctl_atleast(None, "net.ipv6.neigh.default.gc_thresh2", 4*1024) - sysctl_atleast(None, "net.ipv6.neigh.default.gc_thresh3", 8*1024) + sysctl_atleast(None, "net.ipv4.neigh.default.gc_thresh2", 4 * 1024) + sysctl_atleast(None, "net.ipv4.neigh.default.gc_thresh3", 8 * 1024) + sysctl_atleast(None, "net.ipv6.neigh.default.gc_thresh2", 4 * 1024) + sysctl_atleast(None, "net.ipv6.neigh.default.gc_thresh3", 8 * 1024) # Hold entries for 10 minutes - sysctl_assure(None, "net.ipv4.neigh.default.base_reachable_time_ms", 10 * 60 * 1000) - sysctl_assure(None, "net.ipv6.neigh.default.base_reachable_time_ms", 10 * 60 * 1000) + sysctl_assure(None, "net.ipv4.neigh.default.base_reachable_time_ms", 10 * 60 * 1000) + sysctl_assure(None, "net.ipv6.neigh.default.base_reachable_time_ms", 10 * 60 * 1000) # igmp sysctl_assure(None, "net.ipv4.neigh.default.mcast_solicit", 10) @@ -1245,22 +1250,21 @@ def fix_host_limits(): sysctl_atleast(None, "net.ipv6.mld_max_msf", 512) # Increase routing table size to 128K - sysctl_atleast(None, "net.ipv4.route.max_size", 128*1024) - sysctl_atleast(None, "net.ipv6.route.max_size", 128*1024) + sysctl_atleast(None, "net.ipv4.route.max_size", 128 * 1024) + sysctl_atleast(None, "net.ipv6.route.max_size", 128 * 1024) def setup_node_tmpdir(logdir, name): # Cleanup old log, valgrind, and core files. subprocess.check_call( - "rm -rf {0}/{1}.valgrind.* {1}.*.asan {0}/{1}/".format( - logdir, name - ), - shell=True + "rm -rf {0}/{1}.valgrind.* {1}.*.asan {0}/{1}/".format(logdir, name), shell=True ) # Setup the per node directory. nodelogdir = "{}/{}".format(logdir, name) - subprocess.check_call("mkdir -p {0} && chmod 1777 {0}".format(nodelogdir), shell=True) + subprocess.check_call( + "mkdir -p {0} && chmod 1777 {0}".format(nodelogdir), shell=True + ) logfile = "{0}/{1}.log".format(logdir, name) return logfile @@ -1382,7 +1386,9 @@ class Router(Node): # Return count of running daemons def listDaemons(self): ret = [] - rc, stdout, _ = self.cmd_status("ls -1 /var/run/%s/*.pid" % self.routertype, warn=False) + rc, stdout, _ = self.cmd_status( + "ls -1 /var/run/%s/*.pid" % self.routertype, warn=False + ) if rc: return ret for d in stdout.strip().split("\n"): @@ -1394,7 +1400,13 @@ class Router(Node): # probably not compatible with bsd. rc, _, _ = self.cmd_status("test -d /proc/{}".format(pid), warn=False) if rc: - logger.warning("%s: %s exited leaving pidfile %s (%s)", self.name, name, pidfile, pid) + logger.warning( + "%s: %s exited leaving pidfile %s (%s)", + self.name, + name, + pidfile, + pid, + ) self.cmd("rm -- " + pidfile) else: ret.append((name, pid)) @@ -1414,7 +1426,9 @@ class Router(Node): try: os.kill(pid, signal.SIGTERM) except OSError as err: - logger.info("%s: could not kill %s (%s): %s", self.name, name, pid, str(err)) + logger.info( + "%s: could not kill %s (%s): %s", self.name, name, pid, str(err) + ) running = self.listDaemons() if running: @@ -1432,14 +1446,18 @@ class Router(Node): if not running: return "" - logger.warning("%s: sending SIGBUS to: %s", self.name, ", ".join([x[0] for x in running])) + logger.warning( + "%s: sending SIGBUS to: %s", self.name, ", ".join([x[0] for x in running]) + ) for name, pid in running: pidfile = "/var/run/{}/{}.pid".format(self.routertype, name) logger.info("%s: killing %s", self.name, name) self.cmd("kill -SIGBUS %d" % pid) self.cmd("rm -- " + pidfile) - sleep(0.5, "%s: waiting for daemons to exit/core after initial SIGBUS" % self.name) + sleep( + 0.5, "%s: waiting for daemons to exit/core after initial SIGBUS" % self.name + ) errors = self.checkRouterCores(reportOnce=True) if self.checkRouterVersion("<", minErrorVersion): @@ -1657,16 +1675,28 @@ class Router(Node): cmdenv = "ASAN_OPTIONS=" if asan_abort: cmdenv = "abort_on_error=1:" - cmdenv += "log_path={0}/{1}.{2}.asan ".format(self.logdir, self.name, daemon) + cmdenv += "log_path={0}/{1}.{2}.asan ".format( + self.logdir, self.name, daemon + ) if valgrind_memleaks: - this_dir = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) - supp_file = os.path.abspath(os.path.join(this_dir, "../../../tools/valgrind.supp")) - cmdenv += " /usr/bin/valgrind --num-callers=50 --log-file={1}/{2}.valgrind.{0}.%p --leak-check=full --suppressions={3}".format(daemon, self.logdir, self.name, supp_file) + this_dir = os.path.dirname( + os.path.abspath(os.path.realpath(__file__)) + ) + supp_file = os.path.abspath( + os.path.join(this_dir, "../../../tools/valgrind.supp") + ) + cmdenv += " /usr/bin/valgrind --num-callers=50 --log-file={1}/{2}.valgrind.{0}.%p --leak-check=full --suppressions={3}".format( + daemon, self.logdir, self.name, supp_file + ) if valgrind_extra: - cmdenv += "--gen-suppressions=all --expensive-definedness-checks=yes" + cmdenv += ( + "--gen-suppressions=all --expensive-definedness-checks=yes" + ) elif daemon in strace_daemons or "all" in strace_daemons: - cmdenv = "strace -f -D -o {1}/{2}.strace.{0} ".format(daemon, self.logdir, self.name) + cmdenv = "strace -f -D -o {1}/{2}.strace.{0} ".format( + daemon, self.logdir, self.name + ) cmdopt = "{} --log file:{}.log --log-level debug".format( daemon_opts, daemon @@ -1694,7 +1724,9 @@ class Router(Node): self.run_in_window(gdbcmd, daemon) - logger.info("%s: %s %s launched in gdb window", self, self.routertype, daemon) + logger.info( + "%s: %s %s launched in gdb window", self, self.routertype, daemon + ) else: if daemon != "snmpd": cmdopt += " -d " @@ -1705,9 +1737,16 @@ class Router(Node): except subprocess.CalledProcessError as error: self.logger.error( '%s: Failed to launch "%s" daemon (%d) using: %s%s%s:', - self, daemon, error.returncode, error.cmd, - '\n:stdout: "{}"'.format(error.stdout.strip()) if error.stdout else "", - '\n:stderr: "{}"'.format(error.stderr.strip()) if error.stderr else "", + self, + daemon, + error.returncode, + error.cmd, + '\n:stdout: "{}"'.format(error.stdout.strip()) + if error.stdout + else "", + '\n:stderr: "{}"'.format(error.stderr.strip()) + if error.stderr + else "", ) else: logger.info("%s: %s %s started", self, self.routertype, daemon) @@ -1738,7 +1777,7 @@ class Router(Node): # Somehow (on Mininet only), Zebra removes the IPv6 Link-Local addresses on start. Fix this _, output, _ = self.cmd_status( "for i in `ls /sys/class/net/` ; do mac=`cat /sys/class/net/$i/address`; echo $i: $mac; [ -z \"$mac\" ] && continue; IFS=':'; set $mac; unset IFS; ip address add dev $i scope link fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6/64; done", - stderr=subprocess.STDOUT + stderr=subprocess.STDOUT, ) logger.debug("Set MACs:\n%s", output) |
