tests: keep revisions of configs

Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
Christian Hopps 2021-08-01 10:36:09 +00:00
parent 1973df1d39
commit 04464749b6
2 changed files with 23 additions and 10 deletions

View file

@ -488,6 +488,9 @@ def reset_config_on_routers(tgen, routerName=None):
logger.debug("Entering API: reset_config_on_routers") logger.debug("Entering API: reset_config_on_routers")
tgen.cfg_gen += 1
gen = tgen.cfg_gen
# Trim the router list if needed # Trim the router list if needed
router_list = tgen.routers() router_list = tgen.routers()
if routerName: if routerName:
@ -496,9 +499,10 @@ def reset_config_on_routers(tgen, routerName=None):
return True return True
router_list = { routerName: router_list[routerName] } router_list = { routerName: router_list[routerName] }
delta_fmt = tgen.logdir + "/{}/delta.conf" delta_fmt = tgen.logdir + "/{}/delta-{}.conf"
init_cfg_fmt = tgen.logdir + "/{}/frr_json_initial.conf" # FRRCFG_BKUP_FILE
run_cfg_fmt = tgen.logdir + "/{}/frr.sav" target_cfg_fmt = tgen.logdir + "/{}/frr_json_initial.conf"
run_cfg_fmt = tgen.logdir + "/{}/frr-{}.sav"
# #
# Get all running configs in parallel # Get all running configs in parallel
@ -509,7 +513,7 @@ def reset_config_on_routers(tgen, routerName=None):
procs[rname] = router_list[rname].popen( procs[rname] = router_list[rname].popen(
["/usr/bin/env", "vtysh", "-c", "show running-config no-header"], ["/usr/bin/env", "vtysh", "-c", "show running-config no-header"],
stdin=None, stdin=None,
stdout=open(run_cfg_fmt.format(rname), "w"), stdout=open(run_cfg_fmt.format(rname, gen), "w"),
stderr=subprocess.PIPE, stderr=subprocess.PIPE,
) )
for rname, p in procs.items(): for rname, p in procs.items():
@ -523,16 +527,16 @@ def reset_config_on_routers(tgen, routerName=None):
# #
procs = {} procs = {}
for rname in router_list: for rname in router_list:
logger.info("Generating delta for router %s to new configuration", rname) logger.info("Generating delta for router %s to new configuration (gen %d)", rname, gen)
procs[rname] = tgen.net.popen( procs[rname] = tgen.net.popen(
[ "/usr/lib/frr/frr-reload.py", [ "/usr/lib/frr/frr-reload.py",
"--test-reset", "--test-reset",
"--input", "--input",
run_cfg_fmt.format(rname), run_cfg_fmt.format(rname, gen),
"--test", "--test",
init_cfg_fmt.format(rname) ], target_cfg_fmt.format(rname) ],
stdin=None, stdin=None,
stdout=open(delta_fmt.format(rname), "w"), stdout=open(delta_fmt.format(rname, gen), "w"),
stderr=subprocess.PIPE, stderr=subprocess.PIPE,
) )
for rname, p in procs.items(): for rname, p in procs.items():
@ -549,14 +553,14 @@ def reset_config_on_routers(tgen, routerName=None):
logger.info("Applying delta config on router %s", rname) logger.info("Applying delta config on router %s", rname)
procs[rname] = router_list[rname].popen( procs[rname] = router_list[rname].popen(
["/usr/bin/env", "vtysh", "-f", delta_fmt.format(rname)], ["/usr/bin/env", "vtysh", "-f", delta_fmt.format(rname, gen)],
stdin=None, stdin=None,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
) )
for rname, p in procs.items(): for rname, p in procs.items():
output, _ = p.communicate() output, _ = p.communicate()
vtysh_command = "vtysh -f {}".format(delta_fmt.format(rname)) vtysh_command = "vtysh -f {}".format(delta_fmt.format(rname, gen))
if not p.returncode: if not p.returncode:
router_list[rname].logger.info( router_list[rname].logger.info(
'\nvtysh config apply => "{}"\nvtysh output <= "{}"'.format(vtysh_command, output) '\nvtysh config apply => "{}"\nvtysh output <= "{}"'.format(vtysh_command, output)
@ -615,6 +619,9 @@ def load_config_to_routers(tgen, routers, save_bkup=False):
logger.debug("Entering API: load_config_to_routers") logger.debug("Entering API: load_config_to_routers")
tgen.cfg_gen += 1
gen = tgen.cfg_gen
base_router_list = tgen.routers() base_router_list = tgen.routers()
router_list = {} router_list = {}
for router in routers: for router in routers:
@ -623,6 +630,7 @@ def load_config_to_routers(tgen, routers, save_bkup=False):
router_list[router] = base_router_list[router] router_list[router] = base_router_list[router]
frr_cfg_file_fmt = tgen.logdir + "/{}/" + FRRCFG_FILE frr_cfg_file_fmt = tgen.logdir + "/{}/" + FRRCFG_FILE
frr_cfg_save_file_fmt = tgen.logdir + "/{}/{}-" + FRRCFG_FILE
frr_cfg_bkup_fmt = tgen.logdir + "/{}/" + FRRCFG_BKUP_FILE frr_cfg_bkup_fmt = tgen.logdir + "/{}/" + FRRCFG_BKUP_FILE
procs = {} procs = {}
@ -630,6 +638,7 @@ def load_config_to_routers(tgen, routers, save_bkup=False):
router = router_list[rname] router = router_list[rname]
try: try:
frr_cfg_file = frr_cfg_file_fmt.format(rname) frr_cfg_file = frr_cfg_file_fmt.format(rname)
frr_cfg_save_file = frr_cfg_save_file_fmt.format(rname, gen)
frr_cfg_bkup = frr_cfg_bkup_fmt.format(rname) frr_cfg_bkup = frr_cfg_bkup_fmt.format(rname)
with open(frr_cfg_file, "r+") as cfg: with open(frr_cfg_file, "r+") as cfg:
data = cfg.read() data = cfg.read()
@ -637,6 +646,9 @@ def load_config_to_routers(tgen, routers, save_bkup=False):
"Applying following configuration on router %s (gen: %d):\n%s", "Applying following configuration on router %s (gen: %d):\n%s",
rname, gen, data rname, gen, data
) )
# Always save a copy of what we just did
with open(frr_cfg_save_file, "w") as bkup:
bkup.write(data)
if save_bkup: if save_bkup:
with open(frr_cfg_bkup, "w") as bkup: with open(frr_cfg_bkup, "w") as bkup:
bkup.write(data) bkup.write(data)

View file

@ -172,6 +172,7 @@ class Topogen(object):
self.exabgp_cmd = None self.exabgp_cmd = None
self._init_topo(topodef) self._init_topo(topodef)
logger.info("loading topology: {}".format(self.modname)) logger.info("loading topology: {}".format(self.modname))
# @staticmethod # @staticmethod