SafeOptionParser for Configuration Management

Change-Id: I1a32f116b851f4ba9fb445f7f02176c9ab6fa0e4
Signed-off-by: croy <Christian.Roy@windriver.com>
This commit is contained in:
croy
2025-08-18 14:16:55 -04:00
parent 7d0f11ad16
commit fb9262dab8
3 changed files with 88 additions and 135 deletions

View File

@@ -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
self.openstack_config_file = openstack_config_file

View File

@@ -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

View File

@@ -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()