]> git.proxmox.com Git - mirror_frr.git/commitdiff
tools: improve frr-reload.py delta file creation
authorChristian Hopps <chopps@labn.net>
Wed, 14 Jul 2021 11:05:29 +0000 (07:05 -0400)
committerChristian Hopps <chopps@labn.net>
Fri, 16 Jul 2021 02:12:01 +0000 (22:12 -0400)
- Remove incorrect requirement for `service integrated-vtysh-config`
  when producing a delta.
- Add `--test-reset` option which suppresses non-parseable lines from the
  produced delta
- Use new features in common_config.py

Signed-off-by: Christian Hopps <chopps@labn.net>
tests/topotests/lib/common_config.py
tools/frr-reload.py

index 9e60e523d3878498152d33b4d76680e8404afe45..72f2b5b5c270ae6f8ac44f38000a7b26e327184d 100644 (file)
@@ -497,7 +497,7 @@ def reset_config_on_routers(tgen, routerName=None):
         f.close()
         run_cfg_file = "{}/{}/frr.sav".format(TMPDIR, rname)
         init_cfg_file = "{}/{}/frr_json_initial.conf".format(TMPDIR, rname)
-        command = "/usr/lib/frr/frr-reload.py  --input {} --test {} > {}".format(
+        command = "/usr/lib/frr/frr-reload.py --test --test-reset --input {} {} > {}".format(
             run_cfg_file, init_cfg_file, dname
         )
         result = call(command, shell=True, stderr=SUB_STDOUT, stdout=SUB_PIPE)
@@ -527,37 +527,9 @@ def reset_config_on_routers(tgen, routerName=None):
                         raise InvalidCLIError(out_data)
             raise InvalidCLIError("Unknown error in %s", output)
 
-        f = open(dname, "r")
         delta = StringIO()
-        delta.write("configure terminal\n")
-        t_delta = f.read()
-
-        # Don't disable debugs
-        check_debug = True
-
-        for line in t_delta.split("\n"):
-            line = line.strip()
-            if line == "Lines To Delete" or line == "===============" or not line:
-                continue
-
-            if line == "Lines To Add":
-                check_debug = False
-                continue
-
-            if line == "============" or not line:
-                continue
-
-            # Leave debugs and log output alone
-            if check_debug:
-                if "debug" in line or "log file" in line:
-                    continue
-
-            delta.write(line)
-            delta.write("\n")
-
-        f.close()
-
-        delta.write("end\n")
+        with open(dname, "r") as f:
+            delta.write(f.read())
 
         output = router.vtysh_multicmd(delta.getvalue(), pretty_output=False)
 
index eb8753fd088b36f732b520e6f96263bcc3018b32..9d41305ec30ce540ed163616ed3e9c520862dd9a 100755 (executable)
@@ -2012,6 +2012,11 @@ if __name__ == "__main__":
     parser.add_argument(
         "--daemon", help="daemon for which want to replace the config", default=""
     )
+    parser.add_argument(
+        "--test-reset",
+        action="store_true",
+        help="Used by topotest to not delete debug or log file commands",
+    )
 
     args = parser.parse_args()
 
@@ -2125,7 +2130,7 @@ if __name__ == "__main__":
                     service_integrated_vtysh_config = False
                     break
 
-    if not service_integrated_vtysh_config and not args.daemon:
+    if not args.test and not service_integrated_vtysh_config and not args.daemon:
         log.error(
             "'service integrated-vtysh-config' is not configured, this is required for 'service frr reload'"
         )
@@ -2153,35 +2158,56 @@ if __name__ == "__main__":
             running.load_from_show_running(args.daemon)
 
         (lines_to_add, lines_to_del) = compare_context_objects(newconf, running)
-        lines_to_configure = []
 
         if lines_to_del:
-            print("\nLines To Delete")
-            print("===============")
+            if not args.test_reset:
+                print("\nLines To Delete")
+                print("===============")
 
             for (ctx_keys, line) in lines_to_del:
 
                 if line == "!":
                     continue
 
-                cmd = "\n".join(lines_to_config(ctx_keys, line, True))
-                lines_to_configure.append(cmd)
+                nolines = lines_to_config(ctx_keys, line, True)
+
+                if args.test_reset:
+                    # For topotests the original code stripped the lines, and ommitted blank lines
+                    # after, do that here
+                    nolines = [x.strip() for x in nolines]
+                    # For topotests leave these lines in (don't delete them)
+                    # [chopps: why is "log file" more special than other "log" commands?]
+                    nolines = [x for x in nolines if "debug" not in x and "log file" not in x]
+                    if not nolines:
+                        continue
+
+                cmd = "\n".join(nolines)
                 print(cmd)
 
         if lines_to_add:
-            print("\nLines To Add")
-            print("============")
+            if not args.test_reset:
+                print("\nLines To Add")
+                print("============")
 
             for (ctx_keys, line) in lines_to_add:
 
                 if line == "!":
                     continue
 
-                cmd = "\n".join(lines_to_config(ctx_keys, line, False))
-                lines_to_configure.append(cmd)
+                lines = lines_to_config(ctx_keys, line, False)
+
+                if args.test_reset:
+                    # For topotests the original code stripped the lines, and ommitted blank lines
+                    # after, do that here
+                    lines = [x.strip() for x in lines if x.strip()]
+                    if not lines:
+                        continue
+
+                cmd = "\n".join(lines)
                 print(cmd)
 
     elif args.reload:
+        lines_to_configure = []
 
         # We will not be able to do anything, go ahead and exit(1)
         if not vtysh.is_config_available():