f5944d9f94fb0e24898384f2a8452b2584559f2a
[nitsi.git] / nitsi.in
1 #!/usr/bin/python3
2
3 import argparse
4 import logging
5 import os
6
7 from nitsi.logger import init_logging, Log_Formatter
8 from nitsi.recipe import RecipeExeption
9 import nitsi.test
10 from nitsi.settings import settings_parse_copy_from, NitsiSettings
11
12 logger = logging.getLogger("nitsi")
13
14 # create console handler
15 ch = logging.StreamHandler()
16 formatter = Log_Formatter()
17 ch.setFormatter(formatter)
18 # add the handler to the logger
19 logger.addHandler(ch)
20
21 def main():
22     parser = argparse.ArgumentParser()
23
24     parser.add_argument( "--log-level", choices=[ "debug", "error", "info", "warning" ], dest="log_level", default="info")
25
26     parser.add_argument("-v", "--version", help="Display version and exit",
27                     action="store_true", dest="version")
28
29     # Subparser for different commands
30     subparsers = parser.add_subparsers(dest="subparsers_name")
31
32     parser_run_test = subparsers.add_parser('run-test', help='run-test help')
33     parser_run_test.add_argument("-d", "--directory", dest="dir", default=None)
34     parser_run_test.add_argument("-r", "--recipe", dest="recipe", default=None)
35     parser_run_test.add_argument("-s", "--settings", dest="settings", default=None)
36     parser_run_test.add_argument("--default-settings", dest="default_settings", default=None)
37     parser_run_test.add_argument("--name", dest="name", default=None)
38     parser_run_test.add_argument("--description", dest="desc", default=None)
39     parser_run_test.add_argument("--copy-to", dest="copy_to", default=None)
40     parser_run_test.add_argument("--copy-from", dest="copy_from", default=None, nargs='+')
41     parser_run_test.add_argument("--virtual-environment", dest="virtual_environ_path", default=None)
42     parser_run_test.add_argument("--interactive-error-handling", dest="interactive_error_handling", default=False, action="store_true")
43
44     args = parser.parse_args()
45
46   # We just log the version and exit
47     if args.version:
48         logger.info("nitsi version: {}".format("@PACKAGE_VERSION@"))
49         return 0
50
51
52     # Set the log level
53     # We are doing this after we logged the version
54     # to avoid that the version is not shown because of the log level
55     if args.log_level == "info":
56         logger.setLevel(logging.INFO)
57     elif args.log_level == "debug":
58         logger.setLevel(logging.DEBUG)
59     elif args.log_level == "warning":
60         logger.setLevel(logging.WARNING)
61     elif args.log_level == "error":
62         logger.setLevel(logging.ERROR)
63
64     # Here we are going to run a test
65     if args.subparsers_name == "run-test":
66         if not (args.dir or args.recipe):
67             logger.error("You need to provide at least a director of a test '-d' or a recipe file '-r'")
68             return 4
69
70         if (args.dir and args.recipe) or (args.dir and args.settings):
71             logger.error("You cannot use the options '-d' and '-r' or '-d' and '-s' at the same time")
72             return 4
73
74         # For all other stuff we need logging to a file
75         if args.dir:
76             log_dir = init_logging(args.dir)
77         elif args.recipe:
78             log_dir = init_logging(args.recipe)
79
80         # We now going to log everything to log_dir/genaral.log
81         fh = logging.FileHandler("{}/general.log".format(log_dir))
82         logger.addHandler(fh)
83         logger.debug("We now logging everything to {}/general.log".format(log_dir))
84
85         # Build up settings
86         settings = nitsi.settings.NitsiSettings(priority_list=["cmd", "settings-file", "default-settings-file", "nitsi-default"])
87
88         if args.name:
89             settings.set_config_value("name", args.name, type="cmd")
90         if args.desc:
91             settings.set_config_value("description", args.desc, type="cmd")
92         if args.copy_to:
93             settings.set_config_value("copy_to", args.copy_to, type="cmd")
94         if args.copy_from:
95             settings.set_config_value("copy_from", nitsi.settings.settings_parse_copy_from(args.copy_from), type="cmd")
96         if args.virtual_environ_path:
97             path = args.virtual_environ_path
98             if not os.path.isabs(path):
99                 path = os.path.abspath(path)
100             settings.set_config_value("virtual_environ_path", path, type="cmd")
101         if args.interactive_error_handling:
102             settings.set_config_value("interactive_error_handling", True, type="cmd")
103
104         # here we run a test
105         try:
106             currenttest = nitsi.test.Test(
107                 log_dir,
108                 dir=args.dir,
109                 recipe_file=args.recipe,
110                 settings_file=args.settings,
111                 settings=settings,
112                 default_settings_file=args.default_settings)
113             currenttest.virtual_environ_setup_stage_1()
114             currenttest.load_recipe()
115             currenttest.virtual_environ_setup_stage_2()
116         except RecipeExeption as e:
117             logger.exception(e)
118             return 2
119
120         try:
121             currenttest.virtual_environ_start()
122             currenttest.run_recipe()
123         except nitsi.test.TestException as e:
124             logger.exception(e)
125             return 1
126         except BaseException as e:
127             logger.exception(e)
128             return 3
129         finally:
130             currenttest.virtual_environ_stop()
131
132         return 0
133
134 if __name__ == "__main__":
135    return_value = main()
136    logger.debug("Return value of main is: {}".format(return_value))
137    exit(return_value)