Commit 5270a0e3 authored by Nam Cao's avatar Nam Cao Committed by Steven Rostedt (Google)
Browse files

verification/dot2k: Replace is_container() hack with subparsers

dot2k is used for both generating deterministic automaton (DA) monitor and
generating container monitor.

Generating DA monitor and generating container requires different
parameters. This is implemented by peeking at sys.argv and check whether
"--container" is specified, and use that information to make some
parameters optional or required.

This works, but is quite hacky and ugly.

Replace this hack with Python's built-in subparsers.

The old commands:

  python3 dot2/dot2k -d wip.dot -t per_cpu
  python3 dot2/dot2k -n sched --container

are equivalent to the new commands:

  python3 dot2/dot2k monitor -d wip.dot -t per_cpu
  python3 dot2/dot2k container -n sched

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://lore.kernel.org/23c4e3c6e10c39e86d8e6a289208dde407efc4a8.1751634289.git.namcao@linutronix.de


Reviewed-by: default avatarGabriele Monaco <gmonaco@redhat.com>
Signed-off-by: default avatarNam Cao <namcao@linutronix.de>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 612934e9
Loading
Loading
Loading
Loading
+20 −17
Original line number Diff line number Diff line
@@ -13,30 +13,33 @@ if __name__ == '__main__':
    import argparse
    import sys

    def is_container():
        """Should work even before parsing the arguments"""
        return "-c" in sys.argv or "--container" in sys.argv

    parser = argparse.ArgumentParser(description='transform .dot file into kernel rv monitor')
    parser.add_argument('-d', "--dot", dest="dot_file", required=not is_container())
    parser.add_argument('-t', "--monitor_type", dest="monitor_type", required=not is_container(),
                        help=f"Available options: {', '.join(dot2k.monitor_types.keys())}")
    parser.add_argument('-n', "--model_name", dest="model_name", required=is_container())
    parser.add_argument("-D", "--description", dest="description", required=False)
    parser.add_argument("-a", "--auto_patch", dest="auto_patch",
                        action="store_true", required=False,
                        help="Patch the kernel in place")
    parser.add_argument("-p", "--parent", dest="parent",

    subparsers = parser.add_subparsers(dest="subcmd", required=True)

    monitor_parser = subparsers.add_parser("monitor")
    monitor_parser.add_argument('-n', "--model_name", dest="model_name")
    monitor_parser.add_argument("-p", "--parent", dest="parent",
                                required=False, help="Create a monitor nested to parent")
    parser.add_argument("-c", "--container", dest="container",
                        action="store_true", required=False,
                        help="Create an empty monitor to be used as a container")
    monitor_parser.add_argument('-d', "--dot", dest="dot_file")
    monitor_parser.add_argument('-t', "--monitor_type", dest="monitor_type",
                                help=f"Available options: {', '.join(dot2k.monitor_types.keys())}")

    container_parser = subparsers.add_parser("container")
    container_parser.add_argument('-n', "--model_name", dest="model_name", required=True)

    params = parser.parse_args()

    if not is_container():
        print("Opening and parsing the dot file %s" % params.dot_file)
    try:
        if params.subcmd == "monitor":
            print("Opening and parsing the dot file %s" % params.dot_file)
            monitor = dot2k(params.dot_file, params.monitor_type, vars(params))
        else:
            monitor = dot2k(None, None, vars(params))
    except Exception as e:
        print('Error: '+ str(e))
        print("Sorry : :-(")
@@ -45,7 +48,7 @@ if __name__ == '__main__':
    print("Writing the monitor into the directory %s" % monitor.name)
    monitor.print_files()
    print("Almost done, checklist")
    if not is_container():
    if params.subcmd == "monitor":
        print("  - Edit the %s/%s.c to add the instrumentation" % (monitor.name, monitor.name))
        print(monitor.fill_tracepoint_tooltip())
    print(monitor.fill_makefile_tooltip())
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ class dot2k(Dot2c):
    monitor_type = "per_cpu"

    def __init__(self, file_path, MonitorType, extra_params={}):
        self.container = extra_params.get("container")
        self.container = extra_params.get("subcmd") == "container"
        self.parent = extra_params.get("parent")
        self.__fill_rv_templates_dir()