Example #1
0
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)
Example #2
0
    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
Example #3
0
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
Example #4
0
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