diff --git a/config/configuration_file_locations_manager.py b/config/configuration_file_locations_manager.py index 8d5bede8..28e45313 100644 --- a/config/configuration_file_locations_manager.py +++ b/config/configuration_file_locations_manager.py @@ -2,6 +2,8 @@ from optparse import OptionParser from _pytest.main import Session +from framework.options.safe_option_parser import SafeOptionParser + class ConfigurationFileLocationsManager: """ @@ -30,8 +32,6 @@ class ConfigurationFileLocationsManager: Args: session (Session): the pytest session - Returns: None - """ lab_config_file = session.config.getoption("--lab_config_file") if lab_config_file: @@ -97,7 +97,9 @@ class ConfigurationFileLocationsManager: Returns: None """ - options = self._add_options(parser) + safe_option_parser = SafeOptionParser(parser) + self.add_options(safe_option_parser) + options, args = parser.parse_args() lab_config_file = options.lab_config_file if lab_config_file: @@ -151,123 +153,28 @@ class ConfigurationFileLocationsManager: if openstack_config_file: self.set_openstack_config_file(openstack_config_file) - def _add_options(self, parser: OptionParser): + @staticmethod + def add_options(safe_parser: SafeOptionParser): """ - Adds the command line options we can expect. + This function will add the configuration file locations options to the safe_parser passed in. - Returns: None + Args: + safe_parser (SafeOptionParser): The SafeOptionParser """ - if not parser: - parser = OptionParser() - - parser.add_option( - "--lab_config_file", - action="store", - type="str", - dest="lab_config_file", - help="the lab file used for scanning", - ) - - parser.add_option( - "--deployment_assets_config_file", - action="store", - type="str", - dest="deployment_assets_config_file", - help="The location of the files used to deploy the lab", - ) - - parser.add_option( - "--k8s_config_file", - action="store", - type="str", - dest="k8s_config_file", - help="the k8s config file", - ) - - parser.add_option( - "--ptp_config_file", - action="store", - type="str", - dest="ptp_config_file", - help="the PTP config file", - ) - - parser.add_option( - "--logger_config_file", - action="store", - type="str", - dest="logger_config_file", - help="the logger config file", - ) - - parser.add_option( - "--docker_config_file", - action="store", - type="str", - dest="docker_config_file", - help="the docker config file", - ) - - parser.add_option( - "--web_config_file", - action="store", - type="str", - dest="web_config_file", - help="The Web config file", - ) - - parser.add_option( - "--database_config_file", - action="store", - type="str", - dest="database_config_file", - help="The database config file", - ) - - parser.add_option( - "--rest_api_config_file", - action="store", - type="str", - dest="rest_api_config_file", - help="The rest api config file", - ) - - parser.add_option( - "--security_config_file", - action="store", - type="str", - dest="security_config_file", - help="The security config file", - ) - - parser.add_option( - "--usm_config_file", - action="store", - type="str", - dest="usm_config_file", - help="The USM config file", - ) - - parser.add_option( - "--app_config_file", - action="store", - type="str", - dest="app_config_file", - help="The app config file", - ) - - parser.add_option( - "--openstack_config_file", - action="store", - type="str", - dest="openstack_config_file", - help="The openstack config file", - ) - - options, args = parser.parse_args() - - return options + safe_parser.add_option("--lab_config_file", action="store", dest="lab_config_file", help="the lab file used for scanning") + safe_parser.add_option("--deployment_assets_config_file", action="store", dest="deployment_assets_config_file", help="The location of the files used to deploy the lab") + safe_parser.add_option("--k8s_config_file", action="store", dest="k8s_config_file", help="the k8s config file") + safe_parser.add_option("--ptp_config_file", action="store", dest="ptp_config_file", help="the PTP config file") + safe_parser.add_option("--logger_config_file", action="store", dest="logger_config_file", help="the logger config file") + safe_parser.add_option("--docker_config_file", action="store", dest="docker_config_file", help="the docker config file") + safe_parser.add_option("--web_config_file", action="store", dest="web_config_file", help="The Web config file") + safe_parser.add_option("--database_config_file", action="store", dest="database_config_file", help="The database config file") + safe_parser.add_option("--rest_api_config_file", action="store", dest="rest_api_config_file", help="The rest api config file") + safe_parser.add_option("--security_config_file", action="store", dest="security_config_file", help="The security config file") + safe_parser.add_option("--usm_config_file", action="store", dest="usm_config_file", help="The USM config file") + safe_parser.add_option("--app_config_file", action="store", dest="app_config_file", help="The app config file") + safe_parser.add_option("--openstack_config_file", action="store", dest="openstack_config_file", help="The openstack config file") def set_lab_config_file(self, lab_config_file: str): """ @@ -534,4 +441,4 @@ class ConfigurationFileLocationsManager: openstack_config_file (str): the app config file """ - self.openstack_config_file = openstack_config_file \ No newline at end of file + self.openstack_config_file = openstack_config_file diff --git a/framework/options/safe_option_parser.py b/framework/options/safe_option_parser.py new file mode 100644 index 00000000..7f7689e4 --- /dev/null +++ b/framework/options/safe_option_parser.py @@ -0,0 +1,56 @@ +from optparse import OptionConflictError, OptionParser +from typing import Any, Dict + +from pytest import Parser + + +class SafeOptionParser: + """Class that abstracts out the differences in setting Pytest options and OptionParser options.""" + + def __init__(self, parser: Any = None): + """Initialize SafeOptionParser with an optional OptionParser or Pytest Parser instance. + + Args: + parser (Any): An existing OptionParser or Parser instance to wrap. If None, a new OptionParser will be created. Defaults to None. + """ + if not parser: + parser = OptionParser() + + options_parser = None + if isinstance(parser, OptionParser): + options_parser = parser + + pytest_parser = None + if isinstance(parser, Parser): + pytest_parser = parser + + # These implementations are mutually exclusive. Only one should be set at a time. + self.options_parser = options_parser + self.pytest_parser = pytest_parser + + def add_option(self, *args: Dict, **kwargs: Dict): + """Add an option to the underlying OptionParser. + + Args: + *args (Dict): Positional arguments to pass to OptionParser.add_option + **kwargs (Dict): Keyword arguments to pass to OptionParser.add_option + + """ + try: + if self.options_parser: + self.options_parser.add_option(*args, **kwargs) + else: + self.pytest_parser.addoption(*args, **kwargs) + except (OptionConflictError, ValueError): + pass # We know that sometimes options get added twice, but we only need them once. + + def get_option_parser(self) -> Any: + """Get the underlying OptionParser instance. + + Returns: + Any: The wrapped OptionParser instance. + """ + if self.options_parser: + return self.options_parser + else: + return self.pytest_parser diff --git a/testcases/conftest.py b/testcases/conftest.py index 1988d24c..7e4d0110 100644 --- a/testcases/conftest.py +++ b/testcases/conftest.py @@ -1,46 +1,36 @@ import os from typing import Any +from pytest import Parser + from config.configuration_file_locations_manager import ConfigurationFileLocationsManager from config.configuration_manager import ConfigurationManager from framework.logging import log_banners from framework.logging.automation_logger import configure_testcase_log_handler, get_logger, remove_testcase_handler +from framework.options.safe_option_parser import SafeOptionParser -def pytest_addoption(parser: Any): +def pytest_addoption(parser: Parser): """ Adds the pytest options Args: - parser (Any): the parser + parser (Parser): the parser """ - parser.addoption("--lab_config_file", action="store") - parser.addoption("--deployment_assets_config_file", action="store") - parser.addoption("--k8s_config_file", action="store") - parser.addoption("--ptp_config_file", action="store") - parser.addoption("--logger_config_file", action="store") - parser.addoption("--docker_config_file", action="store") - parser.addoption("--web_config_file", action="store") - parser.addoption("--database_config_file", action="store") - parser.addoption("--rest_api_config_file", action="store") - parser.addoption("--security_config_file", action="store") - parser.addoption("--usm_config_file", action="store") - parser.addoption("--app_config_file", action="store") - parser.addoption("--openstack_config_file", action="store") + safe_parser = SafeOptionParser(parser) + ConfigurationFileLocationsManager.add_options(safe_parser) def pytest_sessionstart(session: Any): """ - This is run once at test start up. + This is run once at test start up.` Args: session (Any): the session """ configuration_locations_manager = ConfigurationFileLocationsManager() - configuration_locations_manager.set_configs_from_pytest_args(session) - ConfigurationManager.load_configs(configuration_locations_manager) log_configuration()