From 7df2949802545bbdb783891ebaf83ac117df2668 Mon Sep 17 00:00:00 2001 From: Fabian Klemm Date: Mon, 27 Nov 2023 10:13:15 +0100 Subject: [PATCH 1/4] refactor: rename to strategy pattern Signed-off-by: Fabian Klemm --- .../everest/testing/core_utils/__init__.py | 4 + .../__init__.py | 0 .../__init__.py | 4 + .../everest_configuration_strategy.py} | 4 +- .../evse_security_configuration_strategy.py} | 6 +- .../mqtt_configuration_strategy.py} | 6 +- .../ocpp_module_configuration_strategy.py} | 4 +- ...ersistent_store_configuration_strategy.py} | 6 +- .../probe_module_configuration_strategy.py} | 4 +- .../everest_environment_setup.py | 82 +++++++++---------- .../libocpp_configuration_helper.py | 28 +++---- .../src/everest/testing/core_utils/common.py | 3 +- .../__init__.py | 4 - .../testing/core_utils/everest_core.py | 36 ++++---- .../everest/testing/core_utils/fixtures.py | 26 +++--- .../everest/testing/ocpp_utils/fixtures.py | 16 ++-- 16 files changed, 118 insertions(+), 115 deletions(-) rename everest-testing/src/everest/testing/core_utils/{configuration => _configuration}/__init__.py (100%) create mode 100644 everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/__init__.py rename everest-testing/src/everest/testing/core_utils/{configuration/everest_configuration_visitors/everest_configuration_visitor.py => _configuration/everest_configuration_strategies/everest_configuration_strategy.py} (81%) rename everest-testing/src/everest/testing/core_utils/{configuration/everest_configuration_visitors/evse_security_configuration_visitor.py => _configuration/everest_configuration_strategies/evse_security_configuration_strategy.py} (94%) rename everest-testing/src/everest/testing/core_utils/{configuration/everest_configuration_visitors/mqtt_configuration_visitor.py => _configuration/everest_configuration_strategies/mqtt_configuration_strategy.py} (85%) rename everest-testing/src/everest/testing/core_utils/{configuration/everest_configuration_visitors/ocpp_module_configuration_visitor.py => _configuration/everest_configuration_strategies/ocpp_module_configuration_strategy.py} (90%) rename everest-testing/src/everest/testing/core_utils/{configuration/everest_configuration_visitors/persistent_store_configuration_visitor.py => _configuration/everest_configuration_strategies/persistent_store_configuration_strategy.py} (87%) rename everest-testing/src/everest/testing/core_utils/{configuration/everest_configuration_visitors/probe_module_configuration_visitor.py => _configuration/everest_configuration_strategies/probe_module_configuration_strategy.py} (81%) rename everest-testing/src/everest/testing/core_utils/{configuration => _configuration}/everest_environment_setup.py (77%) rename everest-testing/src/everest/testing/core_utils/{configuration => _configuration}/libocpp_configuration_helper.py (82%) delete mode 100644 everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/__init__.py diff --git a/everest-testing/src/everest/testing/core_utils/__init__.py b/everest-testing/src/everest/testing/core_utils/__init__.py index e69de29b..4bfa2abf 100644 --- a/everest-testing/src/everest/testing/core_utils/__init__.py +++ b/everest-testing/src/everest/testing/core_utils/__init__.py @@ -0,0 +1,4 @@ +from ._configuration.everest_configuration_strategies.everest_configuration_strategy import EverestConfigAdjustmentStrategy + +__all__ = ["common", "everest_core", "fixtures", "probe_module"] + diff --git a/everest-testing/src/everest/testing/core_utils/configuration/__init__.py b/everest-testing/src/everest/testing/core_utils/_configuration/__init__.py similarity index 100% rename from everest-testing/src/everest/testing/core_utils/configuration/__init__.py rename to everest-testing/src/everest/testing/core_utils/_configuration/__init__.py diff --git a/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/__init__.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/__init__.py new file mode 100644 index 00000000..9152fe3d --- /dev/null +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/__init__.py @@ -0,0 +1,4 @@ +""" +See base class `EverestConfigAdjustmentStrategy` + +""" diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/everest_configuration_visitor.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/everest_configuration_strategy.py similarity index 81% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/everest_configuration_visitor.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/everest_configuration_strategy.py index a5a3198a..45982945 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/everest_configuration_visitor.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/everest_configuration_strategy.py @@ -2,8 +2,8 @@ from typing import Dict -class EverestConfigAdjustmentVisitor(ABC): - """ Visitor that manipulates a (parsed) EVerest config when called. +class EverestConfigAdjustmentStrategy(ABC): + """ Strategy that manipulates a (parsed) EVerest config when called. Used to build up / adapt EVerest configurations for tests. diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/evse_security_configuration_visitor.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/evse_security_configuration_strategy.py similarity index 94% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/evse_security_configuration_visitor.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/evse_security_configuration_strategy.py index fd27b7e9..73ca5f86 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/evse_security_configuration_visitor.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/evse_security_configuration_strategy.py @@ -3,8 +3,8 @@ from pathlib import Path from typing import Dict, Optional, Union -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import \ - EverestConfigAdjustmentVisitor +from everest.testing.core_utils._configuration.everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy @dataclass @@ -20,7 +20,7 @@ class EvseSecurityModuleConfiguration: private_key_password: Optional[str] = None -class EvseSecurityModuleConfigurationVisitor(EverestConfigAdjustmentVisitor): +class EvseSecurityModuleConfigurationStrategy(EverestConfigAdjustmentStrategy): """ Adjusts the Evse security module configuration in the Everest configuration merging a provided configuration into it (if provided) and adapt all paths relative to a certificate target directory (if provided). """ diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/mqtt_configuration_visitor.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/mqtt_configuration_strategy.py similarity index 85% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/mqtt_configuration_visitor.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/mqtt_configuration_strategy.py index 585ba980..4911fc50 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/mqtt_configuration_visitor.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/mqtt_configuration_strategy.py @@ -1,11 +1,11 @@ from copy import deepcopy from typing import Dict -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import \ - EverestConfigAdjustmentVisitor +from everest.testing.core_utils._configuration.everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy -class EverestMqttConfigurationAdjustmentVisitor(EverestConfigAdjustmentVisitor): +class EverestMqttConfigurationAdjustmentStrategy(EverestConfigAdjustmentStrategy): """ Adjusts the Everest configuration by manipulating the "settings" block to use the prober Everest UUID and external prefix. diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/ocpp_module_configuration_visitor.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/ocpp_module_configuration_strategy.py similarity index 90% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/ocpp_module_configuration_visitor.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/ocpp_module_configuration_strategy.py index 9b7f9342..3351869b 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/ocpp_module_configuration_visitor.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/ocpp_module_configuration_strategy.py @@ -3,7 +3,7 @@ from typing import Union, Dict from everest.testing.core_utils.common import OCPPVersion -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import EverestConfigAdjustmentVisitor +from everest.testing.core_utils._configuration.everest_configuration_strategies.everest_configuration_strategy import EverestConfigAdjustmentStrategy @@ -24,7 +24,7 @@ class OCPPModulePaths201(OCPPModuleConfigurationBase): DeviceModelDatabasePath: str -class OCPPModuleConfigurationVisitor(EverestConfigAdjustmentVisitor): +class OCPPModuleConfigurationStrategy(EverestConfigAdjustmentStrategy): """ Adjusts the Everest configuration by manipulating the OCPP module configuration to use proper (temporary test) paths. """ diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/persistent_store_configuration_visitor.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/persistent_store_configuration_strategy.py similarity index 87% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/persistent_store_configuration_visitor.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/persistent_store_configuration_strategy.py index 478edd25..25b3bb06 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/persistent_store_configuration_visitor.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/persistent_store_configuration_strategy.py @@ -2,11 +2,11 @@ from pathlib import Path from typing import Dict, Optional -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import \ - EverestConfigAdjustmentVisitor +from everest.testing.core_utils._configuration.everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy -class PersistentStoreConfigurationVisitor(EverestConfigAdjustmentVisitor): +class PersistentStoreConfigurationStrategy(EverestConfigAdjustmentStrategy): """ Adjusts the Everest configuration by manipulating the PersistentStore module configuration to point to the desired (temporary) storage diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/probe_module_configuration_visitor.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/probe_module_configuration_strategy.py similarity index 81% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/probe_module_configuration_visitor.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/probe_module_configuration_strategy.py index 29e4a1d2..6737b99a 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/probe_module_configuration_visitor.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_configuration_strategies/probe_module_configuration_strategy.py @@ -2,10 +2,10 @@ from typing import Dict, List from everest.testing.core_utils.common import Requirement -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import EverestConfigAdjustmentVisitor +from everest.testing.core_utils._configuration.everest_configuration_strategies.everest_configuration_strategy import EverestConfigAdjustmentStrategy -class ProbeModuleConfigurationVisitor(EverestConfigAdjustmentVisitor): +class ProbeModuleConfigurationStrategy(EverestConfigAdjustmentStrategy): """ Adjusts the Everest configuration by adding the probe module into an EVerest config """ def __init__(self, diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_environment_setup.py b/everest-testing/src/everest/testing/core_utils/_configuration/everest_environment_setup.py similarity index 77% rename from everest-testing/src/everest/testing/core_utils/configuration/everest_environment_setup.py rename to everest-testing/src/everest/testing/core_utils/_configuration/everest_environment_setup.py index b57f5760..de206ac8 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_environment_setup.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/everest_environment_setup.py @@ -10,22 +10,20 @@ import yaml from everest.testing.core_utils.common import OCPPVersion -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import \ - EverestConfigAdjustmentVisitor -from everest.testing.core_utils.configuration.everest_configuration_visitors.evse_security_configuration_visitor import \ - EvseSecurityModuleConfigurationVisitor, EvseSecurityModuleConfiguration -from everest.testing.core_utils.configuration.everest_configuration_visitors.ocpp_module_configuration_visitor import \ - OCPPModuleConfigurationVisitor, \ +from everest.testing.core_utils.everest_core import EverestCore, Requirement +from .everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy +from .everest_configuration_strategies.evse_security_configuration_strategy import \ + EvseSecurityModuleConfigurationStrategy, EvseSecurityModuleConfiguration +from .everest_configuration_strategies.ocpp_module_configuration_strategy import \ + OCPPModuleConfigurationStrategy, \ OCPPModulePaths16, OCPPModulePaths201 -from everest.testing.core_utils.configuration.everest_configuration_visitors.persistent_store_configuration_visitor import \ - PersistentStoreConfigurationVisitor -from everest.testing.core_utils.configuration.everest_configuration_visitors.probe_module_configuration_visitor import \ - ProbeModuleConfigurationVisitor -from everest.testing.core_utils.configuration.libocpp_configuration_helper import \ +from .everest_configuration_strategies.persistent_store_configuration_strategy import \ + PersistentStoreConfigurationStrategy +from .everest_configuration_strategies.probe_module_configuration_strategy import \ + ProbeModuleConfigurationStrategy +from .libocpp_configuration_helper import \ LibOCPP201ConfigurationHelper, LibOCPP16ConfigurationHelper -from everest.testing.core_utils.everest_core import EverestCore, Requirement - -logging.basicConfig(level=logging.DEBUG) @dataclass @@ -39,7 +37,7 @@ class EverestEnvironmentOCPPConfiguration: Path] = None # Path for OCPP config to be used; if not provided, will be determined from everest config device_model_schemas_path: Optional[ Path] = None # Path of the OCPP device model json schemas. If not set, {libocpp_path} / 'config/v201/component_schemas' will be used - configuration_visitors: list[OCPPModuleConfigurationVisitor] | None = None + configuration_strategies: list[OCPPModuleConfigurationStrategy] | None = None @dataclass @@ -102,7 +100,7 @@ def __init__(self, evse_security_config: Optional[EverestEnvironmentEvseSecurityConfiguration] = None, persistent_store_config: Optional[EverestEnvironmentPersistentStoreConfiguration] = None, standalone_module: Optional[Union[str, List[str]]] = None, - everest_config_visitors: Optional[List[EverestConfigAdjustmentVisitor]] = None + everest_config_strategies: Optional[List[EverestConfigAdjustmentStrategy]] = None ) -> None: self._core_config = core_config self._ocpp_config = ocpp_config @@ -112,18 +110,18 @@ def __init__(self, self._standalone_module = standalone_module if not self._standalone_module and self._probe_config: self._standalone_module = self._probe_config.module_id - self._additional_everest_config_visitors = everest_config_visitors if everest_config_visitors else [] + self._additional_everest_config_strategies = everest_config_strategies if everest_config_strategies else [] self._everest_core = None def setup_environment(self, tmp_path: Path): temporary_paths = self._create_temporary_directory_structure(tmp_path) - configuration_visitors = self._create_everest_configuration_visitors(temporary_paths) + configuration_strategies = self._create_everest_configuration_strategies(temporary_paths) self._everest_core = EverestCore(self._core_config.everest_core_path, self._core_config.template_everest_config_path, - everest_configuration_adjustment_visitors=configuration_visitors + self._additional_everest_config_visitors, + everest_configuration_adjustment_strategies=configuration_strategies + self._additional_everest_config_strategies, standalone_module=self._standalone_module, tmp_path=tmp_path) @@ -162,8 +160,8 @@ def _create_temporary_directory_structure(self, tmp_path: Path) -> _EverestEnvir persistent_store_db_path=persistent_store_dir / "persistent_store.db" ) - def _create_ocpp_module_configuration_visitor(self, - temporary_paths: _EverestEnvironmentTemporaryPaths) -> OCPPModuleConfigurationVisitor: + def _create_ocpp_module_configuration_strategy(self, + temporary_paths: _EverestEnvironmentTemporaryPaths) -> OCPPModuleConfigurationStrategy: if self._ocpp_config.ocpp_version == OCPPVersion.ocpp16: ocpp_paths = OCPPModulePaths16( @@ -184,9 +182,9 @@ def _create_ocpp_module_configuration_visitor(self, else: raise ValueError(f"unknown ocpp version {self._ocpp_config.ocpp_version}") - occp_module_configuration_helper = OCPPModuleConfigurationVisitor(ocpp_paths=ocpp_paths, - ocpp_module_id=self._ocpp_config.ocpp_module_id, - ocpp_version=self._ocpp_config.ocpp_version) + occp_module_configuration_helper = OCPPModuleConfigurationStrategy(ocpp_paths=ocpp_paths, + ocpp_module_id=self._ocpp_config.ocpp_module_id, + ocpp_version=self._ocpp_config.ocpp_version) return occp_module_configuration_helper @@ -205,7 +203,7 @@ def _setup_libocpp_configuration(self, temporary_paths: _EverestEnvironmentTempo source_ocpp_config_file=source_ocpp_config, target_ocpp_config_file=temporary_paths.ocpp_config_file, target_ocpp_user_config_file=temporary_paths.ocpp_user_config_file, - configuration_visitors=self._ocpp_config.configuration_visitors + configuration_strategies=self._ocpp_config.configuration_strategies ) if self._ocpp_config.ocpp_version == OCPPVersion.ocpp201: @@ -218,31 +216,31 @@ def _setup_libocpp_configuration(self, temporary_paths: _EverestEnvironmentTempo target_directory=temporary_paths.ocpp_database_dir ) - def _create_everest_configuration_visitors(self, temporary_paths: _EverestEnvironmentTemporaryPaths): - configuration_visitors = [] + def _create_everest_configuration_strategies(self, temporary_paths: _EverestEnvironmentTemporaryPaths): + configuration_strategies = [] if self._ocpp_config: - configuration_visitors.append(self._create_ocpp_module_configuration_visitor(temporary_paths)) + configuration_strategies.append(self._create_ocpp_module_configuration_strategy(temporary_paths)) if self._probe_config: - configuration_visitors.append( - ProbeModuleConfigurationVisitor(connections=self._probe_config.connections, - module_id=self._probe_config.module_id)) + configuration_strategies.append( + ProbeModuleConfigurationStrategy(connections=self._probe_config.connections, + module_id=self._probe_config.module_id)) if self._evse_security_config: - configuration_visitors.append( - EvseSecurityModuleConfigurationVisitor(module_id=self._evse_security_config.module_id, - configuration=self._evse_security_config.module_configuration, - source_certificates_directory=self._evse_security_config.source_certificate_directory, - target_certificates_directory=temporary_paths.certs_dir \ - if self._evse_security_config.use_temporary_certificates_folder \ - else None - )) + configuration_strategies.append( + EvseSecurityModuleConfigurationStrategy(module_id=self._evse_security_config.module_id, + configuration=self._evse_security_config.module_configuration, + source_certificates_directory=self._evse_security_config.source_certificate_directory, + target_certificates_directory=temporary_paths.certs_dir \ + if self._evse_security_config.use_temporary_certificates_folder \ + else None + )) if self._persistent_store_config and self._persistent_store_config.use_temporary_folder: - configuration_visitors.append( - PersistentStoreConfigurationVisitor(sqlite_db_file_path=temporary_paths.persistent_store_db_path) + configuration_strategies.append( + PersistentStoreConfigurationStrategy(sqlite_db_file_path=temporary_paths.persistent_store_db_path) ) - return configuration_visitors + return configuration_strategies def _determine_configured_charge_point_config_path_from_everest_config(self): diff --git a/everest-testing/src/everest/testing/core_utils/configuration/libocpp_configuration_helper.py b/everest-testing/src/everest/testing/core_utils/_configuration/libocpp_configuration_helper.py similarity index 82% rename from everest-testing/src/everest/testing/core_utils/configuration/libocpp_configuration_helper.py rename to everest-testing/src/everest/testing/core_utils/_configuration/libocpp_configuration_helper.py index b86fade3..c6aee640 100644 --- a/everest-testing/src/everest/testing/core_utils/configuration/libocpp_configuration_helper.py +++ b/everest-testing/src/everest/testing/core_utils/_configuration/libocpp_configuration_helper.py @@ -6,8 +6,8 @@ from typing import Union, Callable -class OCPPConfigAdjustmentVisitor(ABC): - """ Visitor that manipulates a OCPP config when called. Cf. EverestConfigurationAdjustmentVisitor class +class OCPPConfigAdjustmentStrategy(ABC): + """ Strategy that manipulates a OCPP config when called. Cf. EverestConfigurationAdjustmentStrategy class """ @abstractmethod @@ -15,8 +15,8 @@ def adjust_ocpp_configuration(self, config: dict) -> dict: """ Adjusts the provided configuration by making a (deep) copy and returning the adjusted configuration. """ -class OCPPConfigAdjustmentVisitorWrapper(OCPPConfigAdjustmentVisitor): - """ Simple OCPPConfigAdjustmentVisitor from a callback function. +class OCPPConfigAdjustmentStrategyWrapper(OCPPConfigAdjustmentStrategy): + """ Simple OCPPConfigAdjustmentStrategy from a callback function. """ def __init__(self, callback: Callable[[dict], dict]): @@ -37,12 +37,12 @@ def generate_ocpp_config(self, source_ocpp_config_file: Path, central_system_host: str, central_system_port: Union[str, int], - configuration_visitors: list[OCPPConfigAdjustmentVisitor] | None = None): + configuration_strategies: list[OCPPConfigAdjustmentStrategy] | None = None): config = json.loads(source_ocpp_config_file.read_text()) - configuration_visitors = configuration_visitors if configuration_visitors else [] + configuration_strategies = configuration_strategies if configuration_strategies else [] - for v in [self._get_default_visitor(central_system_port, central_system_host)] + configuration_visitors: + for v in [self._get_default_strategy(central_system_port, central_system_host)] + configuration_strategies: config = v.adjust_ocpp_configuration(config) with target_ocpp_config_file.open("w") as f: @@ -50,13 +50,13 @@ def generate_ocpp_config(self, target_ocpp_user_config_file.write_text("{}") @abstractmethod - def _get_default_visitor(self, central_system_port: int | str, - central_system_host: str) -> OCPPConfigAdjustmentVisitor: + def _get_default_strategy(self, central_system_port: int | str, + central_system_host: str) -> OCPPConfigAdjustmentStrategy: pass class LibOCPP16ConfigurationHelper(LibOCPPConfigurationHelperBase): - def _get_default_visitor(self, central_system_port, central_system_host): + def _get_default_strategy(self, central_system_port, central_system_host): def adjust_ocpp_configuration(config: dict) -> dict: config = deepcopy(config) charge_point_id = config["Internal"]["ChargePointId"] @@ -64,10 +64,10 @@ def adjust_ocpp_configuration(config: dict) -> dict: "CentralSystemURI"] = f"{central_system_host}:{central_system_port}/{charge_point_id}" return config - return OCPPConfigAdjustmentVisitorWrapper(adjust_ocpp_configuration) + return OCPPConfigAdjustmentStrategyWrapper(adjust_ocpp_configuration) -class _OCPP201NetworkConnectionProfileAdjustment(OCPPConfigAdjustmentVisitor): +class _OCPP201NetworkConnectionProfileAdjustment(OCPPConfigAdjustmentStrategy): """ Adjusts the OCPP 2.0.1 Network Connection Profile by injecting the right host, port and chargepoint id. This is utilized by the `LibOCPP201ConfigurationHelper`. @@ -110,8 +110,8 @@ def _set_value_in_v201_config(ocpp_config: json, component_name: str, variable_n class LibOCPP201ConfigurationHelper(LibOCPPConfigurationHelperBase): - def _get_default_visitor(self, central_system_port: int | str, - central_system_host: str) -> OCPPConfigAdjustmentVisitor: + def _get_default_strategy(self, central_system_port: int | str, + central_system_host: str) -> OCPPConfigAdjustmentStrategy: return _OCPP201NetworkConnectionProfileAdjustment(central_system_port, central_system_host) @staticmethod diff --git a/everest-testing/src/everest/testing/core_utils/common.py b/everest-testing/src/everest/testing/core_utils/common.py index f95717f2..9a909d16 100644 --- a/everest-testing/src/everest/testing/core_utils/common.py +++ b/everest-testing/src/everest/testing/core_utils/common.py @@ -1,11 +1,12 @@ from enum import Enum + class Requirement: def __init__(self, module_id: str, implementation_id: str): self.module_id = module_id self.implementation_id = implementation_id + class OCPPVersion(str, Enum): ocpp16 = "ocpp1.6" ocpp201 = "ocpp2.0.1" - diff --git a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/__init__.py b/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/__init__.py deleted file mode 100644 index aaa4bf87..00000000 --- a/everest-testing/src/everest/testing/core_utils/configuration/everest_configuration_visitors/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -See base class `EverestConfigAdjustmentVisitor` - -""" diff --git a/everest-testing/src/everest/testing/core_utils/everest_core.py b/everest-testing/src/everest/testing/core_utils/everest_core.py index 8ff4c905..8458dd41 100644 --- a/everest-testing/src/everest/testing/core_utils/everest_core.py +++ b/everest-testing/src/everest/testing/core_utils/everest_core.py @@ -18,12 +18,12 @@ from everest.framework import RuntimeSession from everest.testing.core_utils.common import Requirement -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import \ - EverestConfigAdjustmentVisitor -from everest.testing.core_utils.configuration.everest_configuration_visitors.mqtt_configuration_visitor import \ - EverestMqttConfigurationAdjustmentVisitor -from everest.testing.core_utils.configuration.everest_configuration_visitors.probe_module_configuration_visitor import \ - ProbeModuleConfigurationVisitor +from ._configuration.everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy +from ._configuration.everest_configuration_strategies.mqtt_configuration_strategy import \ + EverestMqttConfigurationAdjustmentStrategy +from ._configuration.everest_configuration_strategies.probe_module_configuration_strategy import \ + ProbeModuleConfigurationStrategy STARTUP_TIMEOUT = 30 @@ -81,8 +81,8 @@ def __init__(self, prefix_path: Path, config_path: Path = None, standalone_module: Optional[Union[str, List[str]]] = None, - everest_configuration_adjustment_visitors: Optional[ - List[EverestConfigAdjustmentVisitor]] = None, + everest_configuration_adjustment_strategies: Optional[ + List[EverestConfigAdjustmentStrategy]] = None, tmp_path: Optional[Path] = None) -> None: """Initialize EVerest using everest_core_path and everest_config_path @@ -119,7 +119,7 @@ def __init__(self, self.mqtt_external_prefix = f"external_{self.everest_uuid}" - self._write_temporary_config(config_path, everest_configuration_adjustment_visitors) + self._write_temporary_config(config_path, everest_configuration_adjustment_strategies) logging.info(f"everest uuid: {self.everest_uuid}") logging.info(f"temp everest config: {self.everest_config_path} based on {config_path}") @@ -137,15 +137,15 @@ def everest_config(self) -> Dict: with self.everest_config_path.open("r") as f: return yaml.safe_load(f) - def _write_temporary_config(self, template_config_path: Path, everest_configuration_adjustment_visitors: Optional[ - List[EverestConfigAdjustmentVisitor]]): - everest_configuration_adjustment_visitors = everest_configuration_adjustment_visitors if everest_configuration_adjustment_visitors else [] - everest_configuration_adjustment_visitors.append( - EverestMqttConfigurationAdjustmentVisitor(everest_uuid=self.everest_uuid, - mqtt_external_prefix=self.mqtt_external_prefix)) + def _write_temporary_config(self, template_config_path: Path, everest_configuration_adjustment_strategies: Optional[ + List[EverestConfigAdjustmentStrategy]]): + everest_configuration_adjustment_strategies = everest_configuration_adjustment_strategies if everest_configuration_adjustment_strategies else [] + everest_configuration_adjustment_strategies.append( + EverestMqttConfigurationAdjustmentStrategy(everest_uuid=self.everest_uuid, + mqtt_external_prefix=self.mqtt_external_prefix)) everest_config = yaml.safe_load(template_config_path.read_text()) - for visitor in everest_configuration_adjustment_visitors: - everest_config = visitor.adjust_everest_configuration(everest_config) + for strategy in everest_configuration_adjustment_strategies: + everest_config = strategy.adjust_everest_configuration(everest_config) with self.everest_config_path.open("w") as f: yaml.dump(everest_config, f) @@ -243,7 +243,7 @@ def _create_testing_user_config(self): # FIXME (aw): we need some agreement, if the module id of the probe module should be fixed or not logging.info(f'Adding test control module(s) to user-config: {self.test_control_modules}') user_config = {} - user_config = ProbeModuleConfigurationVisitor(connections=self.test_connections).adjust_everest_configuration(user_config) + user_config = ProbeModuleConfigurationStrategy(connections=self.test_connections).adjust_everest_configuration(user_config) file.write_text(yaml.dump(user_config)) diff --git a/everest-testing/src/everest/testing/core_utils/fixtures.py b/everest-testing/src/everest/testing/core_utils/fixtures.py index 062d1139..dc65c808 100644 --- a/everest-testing/src/everest/testing/core_utils/fixtures.py +++ b/everest-testing/src/everest/testing/core_utils/fixtures.py @@ -5,9 +5,9 @@ import pytest -from everest.testing.core_utils.configuration.everest_configuration_visitors.everest_configuration_visitor import \ - EverestConfigAdjustmentVisitor -from everest.testing.core_utils.configuration.everest_environment_setup import \ +from ._configuration.everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy +from ._configuration.everest_environment_setup import \ EverestEnvironmentProbeModuleConfiguration, \ EverestTestEnvironmentSetup, EverestEnvironmentOCPPConfiguration, EverestEnvironmentCoreConfiguration, \ EverestEnvironmentEvseSecurityConfiguration, EverestEnvironmentPersistentStoreConfiguration @@ -63,14 +63,14 @@ def persistent_store_config(request) -> Optional[EverestEnvironmentPersistentSto @pytest.fixture -def everest_config_visitors(request) -> list[EverestConfigAdjustmentVisitor]: - additional_configuration_visitors = [] - additional_configuration_visitors_marker = request.node.get_closest_marker('everest_config_adaptions') - if additional_configuration_visitors_marker: - for v in additional_configuration_visitors_marker.args: - assert isinstance(v, EverestConfigAdjustmentVisitor), "Arguments to 'everest_config_adaptions' must all be instances of EverestConfigAdjustmentVisitor" - additional_configuration_visitors.append(v) - return additional_configuration_visitors +def everest_config_strategies(request) -> list[EverestConfigAdjustmentStrategy]: + additional_configuration_strategies = [] + additional_configuration_strategies_marker = request.node.get_closest_marker('everest_config_adaptions') + if additional_configuration_strategies_marker: + for v in additional_configuration_strategies_marker.args: + assert isinstance(v, EverestConfigAdjustmentStrategy), "Arguments to 'everest_config_adaptions' must all be instances of EverestConfigAdjustmentStrategy" + additional_configuration_strategies.append(v) + return additional_configuration_strategies @pytest.fixture def everest_core(request, @@ -80,7 +80,7 @@ def everest_core(request, probe_module_config: Optional[EverestEnvironmentProbeModuleConfiguration], evse_security_config: Optional[EverestEnvironmentEvseSecurityConfiguration], persistent_store_config: Optional[EverestEnvironmentPersistentStoreConfiguration], - everest_config_visitors: list[EverestConfigAdjustmentVisitor] + everest_config_strategies ) -> EverestCore: """Fixture that can be used to start and stop everest-core""" @@ -94,7 +94,7 @@ def everest_core(request, evse_security_config=evse_security_config, persistent_store_config=persistent_store_config, standalone_module=list(standalone_module_marker.args) if standalone_module_marker else None, - everest_config_visitors=everest_config_visitors + everest_config_strategies=everest_config_strategies ) environment_setup.setup_environment(tmp_path=tmp_path) diff --git a/everest-testing/src/everest/testing/ocpp_utils/fixtures.py b/everest-testing/src/everest/testing/ocpp_utils/fixtures.py index b05db4c3..1b124c45 100644 --- a/everest-testing/src/everest/testing/ocpp_utils/fixtures.py +++ b/everest-testing/src/everest/testing/ocpp_utils/fixtures.py @@ -18,7 +18,7 @@ from pyftpdlib.handlers import FTPHandler from everest.testing.core_utils.common import OCPPVersion -from everest.testing.core_utils.configuration.everest_environment_setup import EverestEnvironmentOCPPConfiguration +from everest.testing.core_utils._configuration.everest_environment_setup import EverestEnvironmentOCPPConfiguration from everest.testing.core_utils.controller.everest_test_controller import EverestTestController from everest.testing.ocpp_utils.central_system import CentralSystem, inject_csms_v201_mock, inject_csms_v16_mock, \ determine_ssl_context @@ -40,13 +40,13 @@ def ocpp_version(request) -> OCPPVersion: def ocpp_config(request, central_system: CentralSystem, test_config: OcppTestConfiguration, ocpp_version: OCPPVersion): ocpp_config_marker = request.node.get_closest_marker("ocpp_config") - ocpp_configuration_visitors_marker = request.node.get_closest_marker("ocpp_config_adaptions") - ocpp_configuration_visitors = [] - if ocpp_configuration_visitors_marker: - for v in ocpp_configuration_visitors_marker.args: + ocpp_configuration_strategies_marker = request.node.get_closest_marker("ocpp_config_adaptions") + ocpp_configuration_strategies = [] + if ocpp_configuration_strategies_marker: + for v in ocpp_configuration_strategies_marker.args: assert hasattr(v, - "adjust_ocpp_configuration"), "Arguments to 'ocpp_config_adaptions' must all provide interface of OCPPConfigAdjustmentVisitor" - ocpp_configuration_visitors.append(v) + "adjust_ocpp_configuration"), "Arguments to 'ocpp_config_adaptions' must all provide interface of OCPPConfigAdjustmentStrategy" + ocpp_configuration_strategies.append(v) return EverestEnvironmentOCPPConfiguration( central_system_port=central_system.port, @@ -54,7 +54,7 @@ def ocpp_config(request, central_system: CentralSystem, test_config: OcppTestCon ocpp_version=ocpp_version, libocpp_path=Path(request.config.getoption("--libocpp")), template_ocpp_config=Path(ocpp_config_marker.args[0]) if ocpp_config_marker else None, - configuration_visitors=ocpp_configuration_visitors + configuration_strategies=ocpp_configuration_strategies ) From faf21b48a04f7f8c9a24b6095ae8d0614951ba3f Mon Sep 17 00:00:00 2001 From: Fabian Klemm Date: Mon, 27 Nov 2023 10:54:57 +0100 Subject: [PATCH 2/4] add ocpp strategy wrapper; bump version Signed-off-by: Fabian Klemm --- everest-testing/src/everest/testing/__init__.py | 2 +- everest-testing/src/everest/testing/core_utils/__init__.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/everest-testing/src/everest/testing/__init__.py b/everest-testing/src/everest/testing/__init__.py index 16ebcb82..eb1d6bc1 100644 --- a/everest-testing/src/everest/testing/__init__.py +++ b/everest-testing/src/everest/testing/__init__.py @@ -1 +1 @@ -__version__="0.1.8" +__version__="0.2.0" diff --git a/everest-testing/src/everest/testing/core_utils/__init__.py b/everest-testing/src/everest/testing/core_utils/__init__.py index 4bfa2abf..cc35b150 100644 --- a/everest-testing/src/everest/testing/core_utils/__init__.py +++ b/everest-testing/src/everest/testing/core_utils/__init__.py @@ -1,4 +1,5 @@ from ._configuration.everest_configuration_strategies.everest_configuration_strategy import EverestConfigAdjustmentStrategy +from ._configuration.libocpp_configuration_helper import OCPPConfigAdjustmentStrategy, OCPPConfigAdjustmentStrategyWrapper __all__ = ["common", "everest_core", "fixtures", "probe_module"] From ea9297f255c0099c00a7eebe66fa9319500ee912 Mon Sep 17 00:00:00 2001 From: Fabian Klemm Date: Mon, 27 Nov 2023 11:49:10 +0100 Subject: [PATCH 3/4] fix linter issues Signed-off-by: Fabian Klemm --- everest-testing/src/everest/testing/core_utils/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/everest-testing/src/everest/testing/core_utils/__init__.py b/everest-testing/src/everest/testing/core_utils/__init__.py index cc35b150..e72fd5d5 100644 --- a/everest-testing/src/everest/testing/core_utils/__init__.py +++ b/everest-testing/src/everest/testing/core_utils/__init__.py @@ -1,5 +1,6 @@ -from ._configuration.everest_configuration_strategies.everest_configuration_strategy import EverestConfigAdjustmentStrategy -from ._configuration.libocpp_configuration_helper import OCPPConfigAdjustmentStrategy, OCPPConfigAdjustmentStrategyWrapper +from ._configuration.everest_configuration_strategies.everest_configuration_strategy import \ + EverestConfigAdjustmentStrategy # flake8: noqa +from ._configuration.libocpp_configuration_helper import OCPPConfigAdjustmentStrategy, \ + OCPPConfigAdjustmentStrategyWrapper # flake8: noqa __all__ = ["common", "everest_core", "fixtures", "probe_module"] - From 81340f18f31de951317e52b4b6b89b167be67bca Mon Sep 17 00:00:00 2001 From: Fabian Klemm Date: Thu, 30 Nov 2023 08:45:02 +0100 Subject: [PATCH 4/4] adjust readme Signed-off-by: Fabian Klemm --- everest-testing/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/everest-testing/README.md b/everest-testing/README.md index c2aeffae..35d9999a 100644 --- a/everest-testing/README.md +++ b/everest-testing/README.md @@ -32,7 +32,7 @@ The core_utils basically provide two fixtures that you can require in your test - **ocpp_config** Used to provide the configuration, i.e. the JSON device model, to set up the OCPP (1.6 or 2.0.1) module. - **evse_security_config** Used to provide the configuration to set up the EvseSecurity module. - **persistent_storage_config** Used to provide the configuration to set up the PersistentStorage module. -- **everest_config_visitors**: Provides a list of additional `EverestConfigAdjustmentVisitor` instances that are called to manipulate the resulting Everest configuration. +- **everest_config_strategies**: Provides a list of additional `EverestConfigAdjustmentStrategy` instances that are called to manipulate the resulting Everest configuration. ### pytest markers @@ -42,7 +42,7 @@ Some OCPP fixtures will parse pytest markers of test cases. The following marker - **probe_module**: If set, the ProbeModule will be injected into the config (used by the `probe_module_config` fixture). This marker accepts optional keyword arguments `connections` and `module_id` to configure the probe module. - **source_certs_dir**: If set and the default `evse_security_config` fixture is used, this will cause the `EvseSecurity` module configuration to use a temporary certificates folder into which the source certificate folder trees are copied. - **use_temporary_persistent_store**: If set and the default `persistent_storage_config` fixture is used, this will cause the `PersistentStore` module configuration to use a temporary database. -- **everest_config_adaptions**: Can be given instances of `EverestConfigAdjustmentVisitor` as positional arguments which will be applied to the resulting Everest configuration. +- **everest_config_adaptions**: Can be given instances of `EverestConfigAdjustmentStrategy` as positional arguments which will be applied to the resulting Everest configuration. ## OCPP utils @@ -70,7 +70,7 @@ An important function that you will frequently use when writing test cases is th - **ocpp_config_adaptions**: Specification of the .json OCPP config file. Used in `ocpp_config` fixture and used as template configuration (if not specified, the OCPP config as specified in the EVerest configuration is used) - **inject_csms_mock**: (currently only OCPP 2.0.1) If set, the `central_system_v201` will wrap any csms handler method into an unittest mock. In particular, this allows changing the CSMS behavior even after the chargepoint is started by setting side effects of the mock. See `everest.testing.ocpp_utils.charge_point_v201.inject_csms_v201_mock` docstring for an example. - **csms_tls**: Enable/disable TLS for the CSMS websocket server. If given without arguments, enables TLS. First argument can be `False` to explicitly disable TLS. Further optional keyword arguments `certificate`, `private_key`,`passphrase`, `root_ca` , and `verify_client_certificate` allow to overwrite SSL context options. -- **ocpp_config_adaptions**: Can be given instances of `OCPPConfigAdjustmentVisitor` as positional arguments which will be applied to the resulting OCPP configuration. +- **ocpp_config_adaptions**: Can be given instances of `OCPPConfigAdjustmentStrategy` as positional arguments which will be applied to the resulting OCPP configuration. ## Add a conftest.py