def get_openshift_cluster_info(request, load_config_file): """ Fixture to get openshift cluster info """ openshift_tests_log_dir = request.config.getoption("--openshift-tests-log-dir") openshift_tests_log_level = request.config.getoption("--openshift-tests-log-level") log_to_stdout = request.config.getoption("--log-to-stdout") log_name = "ocp_tests_log" # Create log dir if logs dir does not exist. openshift_tests_log_dir = os.path.abspath(openshift_tests_log_dir) if not os.path.exists(openshift_tests_log_dir): os.makedirs(os.path.abspath(openshift_tests_log_dir)) # Define filename with timestamp filename = os.path.join( openshift_tests_log_dir, ("ocp_tests_log_%s.log" % datetime.now().strftime("%Y_%m_%d_%H_%M_%S")) ) g.log = g.create_log(name=log_name, filename=filename, level=openshift_tests_log_level) if "true" in log_to_stdout.lower(): g.add_log(g.log, filename="STDOUT") default_ocp_tests_config_file = request.config.getoption("--openshift-default-tests-config") if default_ocp_tests_config_file is not None: config = load_config_file(default_ocp_tests_config_file) g.update_config(config) openshift_cluster_config = {} openshift_first_master = request.config.getoption("--openshift-first-master") openshift_cluster_config["first_master"] = openshift_first_master # TODO'S Get master, nodes, OcpAppMgmt instance here. g.update_config(openshift_cluster_config) g.log.info("openshift tests default configs:\n%s", g.config)
def post(self): """Process a raw xUnit XML file for importing into ReportPortal""" args = import_parser_payload.parse_args() # set logging options log_level = 'INFO' if args.debug: log_level = 'DEBUG' g.log = g.create_log('mylog', filename='STDOUT', level=log_level) g.log.info('payload received...') g.log.info(args) preproc = PreProcService(args) response = preproc.process() preproc.cleanup_tmp() print('IMPORT COMPLETE: {}'.format(response)) return response
def main(): """Entry point console script for setuptools. Provides a command-line interface to Glusto. Currently does nothing useful, but plan to wrap Glusto functionality in a CLI interface that can be injected into shell scripts, etc. Example: # glusto run hostname.example.com "uname -a" """ epilog = ('NOTE: If encountering an "unknown option" issue ' 'with the -t and -n options, use param=\'args\' syntax.' '(e.g., -t="-v -x tests")') parser = argparse.ArgumentParser(description="Glusto CLI wrapper", epilog=epilog) parser.add_argument("-c", "--config", help="Config file(s) to read.", action="store", dest="config_list", default=None) parser.add_argument("--ssh-keyfile", help="SSH keyfile for connections.", action="store", dest="ssh_keyfile") parser.add_argument("-l", "--log", help="Default logfile location.", action="store", dest="log_filename", default=None) parser.add_argument("--log-level", help="Default log level.", action="store", dest="log_level", default=None) parser.add_argument("--pytest", help="Run tests using the pytest framework.", action="store", dest="run_pytest") parser.add_argument("--nosetests", help="Run tests using the nose framework.", action="store", dest="run_nosetests") parser.add_argument("--unittest", help="Run tests using the unittest framework.", action="store", dest="run_unittest") parser.add_argument("-u", help="Run unittests per provided config file.", action="store_true", dest="run_unittest_config") parser.add_argument("-d", "--discover", help="Discover unittests from directory.", action="store", dest="discover_dir") args = parser.parse_args() # read config files and update g.config attributes handle_configs(args.config_list) # TODO: break everything into separate methods # handle actionable config items # logging # set defaults log_name = "glustomain" log_filename = "/tmp/glustomain.log" log_level = "INFO" # override with config log_filename = g.config.get('log_filename', log_filename) log_level = g.config.get('log_level', log_level) # override with CLI options if args.log_filename: log_filename = args.log_filename if args.log_level: log_level = args.log_level g.log = g.create_log(name=log_name, filename=log_filename, level=log_level) print("Log %s created as %s with log level %s" % (log_name, log_filename, log_level)) g.log.info("Starting glusto via main()") print "Starting glusto via main()" # override ssh_keyfile @ CLI if args.ssh_keyfile: g.ssh_set_keyfile(args.ssh_keyfile) g.show_config(g.config) # unittest # TODO: functionalize this so it can be used for standalone test scripts if args.run_unittest_config or args.discover_dir: tsuite = unittest.TestSuite() if args.discover_dir: unittest_config = {'cli_discover': 'true'} else: unittest_config = g.config.get('unittest', False) if not unittest_config: print("ERROR: Unittest option requires a unittest configuration.") return False output_junit = unittest_config.get('output_junit', False) if output_junit: trunner = xmlrunner.XMLTestRunner(output='/tmp/glustoreports') else: trunner = unittest.TextTestRunner(verbosity=2) loader = unittest.TestLoader() loader.testMethodPrefix = unittest_config.get('test_method_prefix', 'test') discover = unittest_config.get('discover_tests') if args.discover_dir: discover = {'start_dir': args.discover_dir} # TODO: ??? Add ability to run multiple discoveries in a single config if discover: g.log.debug('unittest - discover') start_dir = discover.get('start_dir', '.') pattern = discover.get('pattern', 'test_*') top_level_dir = discover.get('top_level_dir', None) discovered_tests = loader.discover(start_dir, pattern, top_level_dir) tsuite.addTests(discovered_tests) run_list = unittest_config.get('load_tests_from_list') # TODO: ability to load multiple lists # TODO: ??? list format more conducive to automation if run_list: g.log.debug('unittest - load_tests_from_list') unittest_config = g.config['unittest'] unittest_list = g.config['unittest_list'] module_name = unittest_list['module_name'] test_list = unittest_list['list'] test_module_obj = importlib.import_module(module_name) tests_to_run = loader.loadTestsFromNames(test_list, test_module_obj) tsuite.addTests(tests_to_run) run_module = unittest_config.get('load_tests_from_module') if run_module: g.log.debug('unittest - load_tests_from_module') module_name = run_module.get('module_name') use_load_tests = run_module.get('use_load_tests', True) # TODO: is there a better way to do this without the dual import? __import__(module_name) class_list = inspect.getmembers(sys.modules[module_name], inspect.isclass) # TODO: is __import__ Python3.x friendly??? test_module_obj = __import__(module_name, fromlist=class_list) tests_from_module = loader.loadTestsFromModule( test_module_obj, use_load_tests) tsuite.addTests(tests_from_module) # Load tests from a name (string) # NOTE: does not use load_test() test_name = unittest_config.get('load_tests_from_name') if test_name: g.log.debug('unittest - load_tests_from_name') # TODO: can we collapse these loader instances into one at top??? tests_from_name = loader.loadTestsFromName(test_name) tsuite.addTests(tests_from_name) # Load tests from names (list) # NOTE: only uses load_test() when name is module level # e.g., tests.test_glusto test_name_list = unittest_config.get('load_tests_from_names') if test_name_list: g.log.debug('unittest - load_tests_from_names') # TODO: can we collapse these loader instances into one at top??? tests_from_names = loader.loadTestsFromNames(test_name_list) tsuite.addTests(tests_from_names) # TODO: Add a skip test option trunner.run(tsuite) PYTEST_FAIL = 1 NOSETESTS_FAIL = 2 UNITTEST_FAIL = 4 retcode = 0 if args.run_pytest: print "pytest: %s" % args.run_pytest # using shlex.split() to handle quoted arguments with spaces argv = shlex.split(args.run_pytest) result = pytest.main(argv) if result > 0: retcode = retcode | PYTEST_FAIL if args.run_nosetests: print "nosetests: %s" % args.run_nosetests argv = shlex.split(args.run_nosetests) argv.insert(0, 'glusto-nosetests') print(argv) result = nose.run(argv=argv) if not result: retcode = retcode | NOSETESTS_FAIL if args.run_unittest: print "unittest: %s" % args.run_unittest argv = shlex.split(args.run_unittest) argv.insert(0, 'glusto-unittest') print(argv) test_object = unittest.main(exit=False, argv=argv) num_errors = len(test_object.result.errors) num_failures = len(test_object.result.failures) if num_errors > 0 or num_failures > 0: retcode = retcode | UNITTEST_FAIL g.log.info("Ending glusto via main()") print "Ending glusto via main()" return retcode
def main(): """Entry point console script for setuptools. Provides a command-line interface to Glusto. Currently does nothing useful, but plan to wrap Glusto functionality in a CLI interface that can be injected into shell scripts, etc. Example: # glusto run hostname.example.com "uname -a" """ epilog = ('NOTE: If encountering an "unknown option" issue ' 'with the -t and -n options, use param=\'args\' syntax.' '(e.g., -t="-v -x tests")') parser = argparse.ArgumentParser(description="Glusto CLI wrapper", epilog=epilog) parser.add_argument("-c", "--config", help="Config file(s) to read.", action="store", dest="config_list", default=None) parser.add_argument("--ssh-keyfile", help="SSH keyfile for connections.", action="store", dest="ssh_keyfile") parser.add_argument("-l", "--log", help="Default logfile location.", action="store", dest="log_filename", default=None) parser.add_argument("--log-level", help="Default log level.", action="store", dest="log_level", default=None) parser.add_argument("--pytest", help="Run tests using the pytest framework.", action="store", dest="run_pytest") parser.add_argument("--nosetests", help="Run tests using the nose framework.", action="store", dest="run_nosetests") parser.add_argument("--unittest", help="Run tests using the unittest framework.", action="store", dest="run_unittest") parser.add_argument("-u", help="Run unittests per provided config file.", action="store_true", dest="run_unittest_config") parser.add_argument("-d", "--discover", help="Discover unittests from directory.", action="store", dest="discover_dir") args = parser.parse_args() # read config files and update g.config attributes handle_configs(args.config_list) # TODO: break everything into separate methods # handle actionable config items # logging # set defaults log_name = "glustomain" log_filename = "/tmp/glustomain.log" log_level = "INFO" # override with config log_filename = g.config.get('log_filename', log_filename) log_level = g.config.get('log_level', log_level) # override with CLI options if args.log_filename: log_filename = args.log_filename if args.log_level: log_level = args.log_level g.log = g.create_log(name=log_name, filename=log_filename, level=log_level) print("Log %s created as %s with log level %s" % (log_name, log_filename, log_level)) g.log.info("Starting glusto via main()") print "Starting glusto via main()" # override ssh_keyfile @ CLI if args.ssh_keyfile: g.ssh_set_keyfile(args.ssh_keyfile) g.show_config(g.config) # unittest # TODO: functionalize this so it can be used for standalone test scripts if args.run_unittest_config or args.discover_dir: tsuite = unittest.TestSuite() if args.discover_dir: unittest_config = {'cli_discover': 'true'} else: unittest_config = g.config.get('unittest', False) if not unittest_config: print ("ERROR: Unittest option requires a unittest configuration.") return False output_junit = unittest_config.get('output_junit', False) if output_junit: trunner = xmlrunner.XMLTestRunner(output='/tmp/glustoreports') else: trunner = unittest.TextTestRunner(verbosity=2) loader = unittest.TestLoader() loader.testMethodPrefix = unittest_config.get('test_method_prefix', 'test') discover = unittest_config.get('discover_tests') if args.discover_dir: discover = {'start_dir': args.discover_dir} # TODO: ??? Add ability to run multiple discoveries in a single config if discover: g.log.debug('unittest - discover') start_dir = discover.get('start_dir', '.') pattern = discover.get('pattern', 'test_*') top_level_dir = discover.get('top_level_dir', None) discovered_tests = loader.discover(start_dir, pattern, top_level_dir) tsuite.addTests(discovered_tests) run_list = unittest_config.get('load_tests_from_list') # TODO: ability to load multiple lists # TODO: ??? list format more conducive to automation if run_list: g.log.debug('unittest - load_tests_from_list') unittest_config = g.config['unittest'] unittest_list = g.config['unittest_list'] module_name = unittest_list['module_name'] test_list = unittest_list['list'] test_module_obj = importlib.import_module(module_name) tests_to_run = loader.loadTestsFromNames(test_list, test_module_obj) tsuite.addTests(tests_to_run) run_module = unittest_config.get('load_tests_from_module') if run_module: g.log.debug('unittest - load_tests_from_module') module_name = run_module.get('module_name') use_load_tests = run_module.get('use_load_tests', True) # TODO: is there a better way to do this without the dual import? __import__(module_name) class_list = inspect.getmembers(sys.modules[module_name], inspect.isclass) # TODO: is __import__ Python3.x friendly??? test_module_obj = __import__(module_name, fromlist=class_list) tests_from_module = loader.loadTestsFromModule(test_module_obj, use_load_tests) tsuite.addTests(tests_from_module) # Load tests from a name (string) # NOTE: does not use load_test() test_name = unittest_config.get('load_tests_from_name') if test_name: g.log.debug('unittest - load_tests_from_name') # TODO: can we collapse these loader instances into one at top??? tests_from_name = loader.loadTestsFromName(test_name) tsuite.addTests(tests_from_name) # Load tests from names (list) # NOTE: only uses load_test() when name is module level # e.g., tests.test_glusto test_name_list = unittest_config.get('load_tests_from_names') if test_name_list: g.log.debug('unittest - load_tests_from_names') # TODO: can we collapse these loader instances into one at top??? tests_from_names = loader.loadTestsFromNames(test_name_list) tsuite.addTests(tests_from_names) # TODO: Add a skip test option trunner.run(tsuite) PYTEST_FAIL = 1 NOSETESTS_FAIL = 2 UNITTEST_FAIL = 4 retcode = 0 if args.run_pytest: print "pytest: %s" % args.run_pytest # using shlex.split() to handle quoted arguments with spaces argv = shlex.split(args.run_pytest) result = pytest.main(argv) if result > 0: retcode = retcode | PYTEST_FAIL if args.run_nosetests: print "nosetests: %s" % args.run_nosetests argv = shlex.split(args.run_nosetests) argv.insert(0, 'glusto-nosetests') print(argv) result = nose.run(argv=argv) if not result: retcode = retcode | NOSETESTS_FAIL if args.run_unittest: print "unittest: %s" % args.run_unittest argv = shlex.split(args.run_unittest) argv.insert(0, 'glusto-unittest') print(argv) test_object = unittest.main(exit=False, argv=argv) num_errors = len(test_object.result.errors) num_failures = len(test_object.result.failures) if num_errors > 0 or num_failures > 0: retcode = retcode | UNITTEST_FAIL g.log.info("Ending glusto via main()") print "Ending glusto via main()" return retcode