#!/usr/bin/python3
-from nitsi.test import test
+import argparse
import logging
+import os
+
+from nitsi.logger import init_logging, Log_Formatter
+from nitsi.recipe import RecipeExeption
+import nitsi.test
+from nitsi.settings import settings_parse_copy_from, NitsiSettings
logger = logging.getLogger("nitsi")
-logger.setLevel(logging.DEBUG)
-# create file handler which logs even debug messages
-fh = logging.FileHandler('nitsi.log')
-fh.setLevel(logging.DEBUG)
-# create console handler with a higher log level
-ch = logging.StreamHandler()
-ch.setLevel(logging.DEBUG)
-formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-fh.setFormatter(formatter)
+# create console handler
+ch = logging.StreamHandler()
+formatter = Log_Formatter()
ch.setFormatter(formatter)
-# add the handlers to the logger
-logger.addHandler(fh)
+# add the handler to the logger
logger.addHandler(ch)
-if __name__ == "__main__":
- import argparse
-
+def main():
parser = argparse.ArgumentParser()
- parser.add_argument("-d", "--directory", dest="dir")
+ parser.add_argument( "--log-level", choices=[ "debug", "error", "info", "warning" ], dest="log_level", default="info")
- parser.add_argument("-v" "--version", help="Display version and exit",
+ parser.add_argument("-v", "--version", help="Display version and exit",
action="store_true", dest="version")
+ # Subparser for different commands
+ subparsers = parser.add_subparsers(dest="subparsers_name")
+
+ parser_run_test = subparsers.add_parser('run-test', help='run-test help')
+ parser_run_test.add_argument("-d", "--directory", dest="dir", default=None)
+ parser_run_test.add_argument("-r", "--recipe", dest="recipe", default=None)
+ parser_run_test.add_argument("-s", "--settings", dest="settings", default=None)
+ parser_run_test.add_argument("--default-settings", dest="default_settings", default=None)
+ parser_run_test.add_argument("--name", dest="name", default=None)
+ parser_run_test.add_argument("--description", dest="desc", default=None)
+ parser_run_test.add_argument("--copy-to", dest="copy_to", default=None)
+ parser_run_test.add_argument("--copy-from", dest="copy_from", default=None, nargs='+')
+ parser_run_test.add_argument("--virtual-environment", dest="virtual_environ_path", default=None)
+ parser_run_test.add_argument("--interactive-error-handling", dest="interactive_error_handling", default=False, action="store_true")
+
args = parser.parse_args()
+ # We just log the version and exit
if args.version:
logger.info("nitsi version: {}".format("@PACKAGE_VERSION@"))
- else:
- currenttest = test(args.dir)
- currenttest.read_settings()
- currenttest.virtual_environ_setup()
- currenttest.load_recipe()
+ return 0
+
+
+ # Set the log level
+ # We are doing this after we logged the version
+ # to avoid that the version is not shown because of the log level
+ if args.log_level == "info":
+ logger.setLevel(logging.INFO)
+ elif args.log_level == "debug":
+ logger.setLevel(logging.DEBUG)
+ elif args.log_level == "warning":
+ logger.setLevel(logging.WARNING)
+ elif args.log_level == "error":
+ logger.setLevel(logging.ERROR)
+
+ # Here we are going to run a test
+ if args.subparsers_name == "run-test":
+ if not (args.dir or args.recipe):
+ logger.error("You need to provide at least a director of a test '-d' or a recipe file '-r'")
+ return 4
+
+ if (args.dir and args.recipe) or (args.dir and args.settings):
+ logger.error("You cannot use the options '-d' and '-r' or '-d' and '-s' at the same time")
+ return 4
+
+ # For all other stuff we need logging to a file
+ if args.dir:
+ log_dir = init_logging(args.dir)
+ elif args.recipe:
+ log_dir = init_logging(args.recipe)
+
+ # We now going to log everything to log_dir/genaral.log
+ fh = logging.FileHandler("{}/general.log".format(log_dir))
+ logger.addHandler(fh)
+ logger.debug("We now logging everything to {}/general.log".format(log_dir))
+
+ # Build up settings
+ settings = nitsi.settings.NitsiSettings(priority_list=["cmd", "settings-file", "default-settings-file", "nitsi-default"])
+
+ if args.name:
+ settings.set_config_value("name", args.name, type="cmd")
+ if args.desc:
+ settings.set_config_value("description", args.desc, type="cmd")
+ if args.copy_to:
+ settings.set_config_value("copy_to", args.copy_to, type="cmd")
+ if args.copy_from:
+ settings.set_config_value("copy_from", nitsi.settings.settings_parse_copy_from(args.copy_from), type="cmd")
+ if args.virtual_environ_path:
+ path = args.virtual_environ_path
+ if not os.path.isabs(path):
+ path = os.path.abspath(path)
+ settings.set_config_value("virtual_environ_path", path, type="cmd")
+ if args.interactive_error_handling:
+ settings.set_config_value("interactive_error_handling", True, type="cmd")
+
+ # here we run a test
+ try:
+ currenttest = nitsi.test.Test(
+ log_dir,
+ dir=args.dir,
+ recipe_file=args.recipe,
+ settings_file=args.settings,
+ settings=settings,
+ default_settings_file=args.default_settings)
+ currenttest.virtual_environ_setup_stage_1()
+ currenttest.load_recipe()
+ currenttest.virtual_environ_setup_stage_2()
+ except RecipeExeption as e:
+ logger.exception(e)
+ return 2
+
try:
currenttest.virtual_environ_start()
currenttest.run_recipe()
+ except nitsi.test.TestException as e:
+ logger.exception(e)
+ return 1
except BaseException as e:
- print(e)
+ logger.exception(e)
+ return 3
finally:
- currenttest.virtual_environ_stop()
\ No newline at end of file
+ currenttest.virtual_environ_stop()
+
+ return 0
+
+if __name__ == "__main__":
+ return_value = main()
+ logger.debug("Return value of main is: {}".format(return_value))
+ exit(return_value)