diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 43681017cc578eafd50864b75d028806a96ba4a4..395b2b60864faf4bedeed2328209b3e8e421e94b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,19 @@ Changelog ========= +`3.2.3`_ +----------------------------------------------------------------------------- + +Added +~~~~~ + +- Added support for EnOSlib 10 + +Fixed +~~~~~ + +- + `3.2.2`_ ----------------------------------------------------------------------------- diff --git a/e2clab/managers/manager.py b/e2clab/managers/manager.py index 6c685a1e298673b2452f4510fa351a167b50b267..9b1373691bb832ff5333470383c3b793443470fc 100644 --- a/e2clab/managers/manager.py +++ b/e2clab/managers/manager.py @@ -43,8 +43,10 @@ class Manager(ABC): roles: Optional[Roles] = None, networks: Optional[Networks] = None, artifacts_dir: Optional[Path] = None, + # TODO: fix this mess + # Can't import due to cyclical imports through layers_config # provider: Optional[Provider] = None, - # Weird stuff only needed for iotlab monitoring + # Weird stuff, only needed for iotlab monitoring to have consistent api provider=None, meta: dict = {}, ): diff --git a/e2clab/managers/provenance.py b/e2clab/managers/provenance.py index eda6e05f331095966d4f47547e93d0fa04c7ad96..b06c5be9eb9b6bcff51e3890af86abab01e719e7 100644 --- a/e2clab/managers/provenance.py +++ b/e2clab/managers/provenance.py @@ -15,6 +15,7 @@ from ..constants.layers_services import ( PROVENANCE_SVC, PROVENANCE_SVC_DATAFLOW_SPEC, PROVENANCE_SVC_PARALLELISM, + PROVENANCE_SVC_PORT, PROVENANCE_SVC_PROVIDER, ROLES_PROVENANCE, SERVERS, @@ -118,8 +119,24 @@ class ProvenanceManager(Manager): self.logger.info("Done destroying") def get_environment(self) -> Environment: + # Provenance_svc_provider can't be none due to schema return Environment(self.config.get(PROVENANCE_SVC_PROVIDER)) + def get_extra_info(self) -> dict: + """Returns provenance extra information + + Returns: + dict: provenance_extra_info + """ + ui_address = self.host.address + _provenance_extra_info = { + PROVENANCE_SERVICE_ROLE: { + "__address__": f"{ui_address}", + "url": f"http://{ui_address}:{PROVENANCE_SVC_PORT}", + } + } + return _provenance_extra_info + # Config parsing def _get_parallelism(self) -> int: return int(self.config.get(PROVENANCE_SVC_PARALLELISM, default.PARALLELISM)) diff --git a/e2clab/providers/provider.py b/e2clab/providers/provider.py index da204ff662a589ca25824038d5d767b27438c326..0c495926f15ad68aa8e641118b30b1b5abad787a 100644 --- a/e2clab/providers/provider.py +++ b/e2clab/providers/provider.py @@ -4,17 +4,13 @@ from typing import Optional, Tuple from enoslib import Networks, Roles from e2clab.config import InfrastructureConfig -from e2clab.constants import MonitoringType, default +from e2clab.constants import default from e2clab.constants.layers_services import ( CLUSTER, ENVIRONMENT, ID, LAYERS, - MONITORING_SERVICE_ROLE, - MONITORING_SVC_PORT, NAME, - PROVENANCE_SERVICE_ROLE, - PROVENANCE_SVC_PORT, QUANTITY, ROLES, SERVERS, @@ -72,53 +68,6 @@ class Provider: the resources of your custom Provider. """ - def get_provenance(self) -> dict: - """Returns provenance extra information - - Returns: - dict: provenance_extra_info - """ - _provenance_extra_info = {} - if self.roles and self.networks and self.provenance_provider: - ui_address = self.roles[PROVENANCE_SERVICE_ROLE][0].address - _provenance_extra_info = { - PROVENANCE_SERVICE_ROLE: { - "__address__": f"{ui_address}", - "url": f"http://{ui_address}:{PROVENANCE_SVC_PORT}", - } - } - return _provenance_extra_info - - # TODO: test and move to monitoring manager ? - def get_monitoring(self) -> dict: - """Returns monitoring information - - Returns: - Tuple[str, dict]: monitoring_type, monitoring_extra_info - """ - _monitoring_extra_info = {} - _monitoring_type = self.infra_config.get_monitoring_type() - if None not in (self.roles, self.networks) and self.monitoring_provider: - if _monitoring_type in ( - MonitoringType.TIG, - MonitoringType.TPG, - ): - ui_address = self.roles[MONITORING_SERVICE_ROLE][0].address - _monitoring_extra_info = { - MONITORING_SERVICE_ROLE: { - "__address__": f"{ui_address}", - "url": f"http://{ui_address}:{MONITORING_SVC_PORT}", - } - } - - return _monitoring_extra_info - - def is_provenance_provider(self): - return self.provenance_provider - - def is_monitoring_provider(self): - return self.monitoring_provider - def log_roles_networks(self, target_environment): logger.debug(f" Roles [{target_environment}] = {self.roles}") logger.debug(f" Networks [{target_environment}] = {self.networks}") diff --git a/e2clab/tests/unit/test_g5k_provider.py b/e2clab/tests/unit/test_g5k_provider.py index 21c735991901bceb2846c00bf7adb21b8f207059..e0daf48d76a707f8236d7ee469c7489689436ffc 100644 --- a/e2clab/tests/unit/test_g5k_provider.py +++ b/e2clab/tests/unit/test_g5k_provider.py @@ -3,7 +3,6 @@ Teting e2clab.provider.plugins.G5k module """ import enoslib as en -from enoslib import Host, Networks, Roles import e2clab.constants.default as default from e2clab.config import InfrastructureConfig @@ -24,7 +23,6 @@ from e2clab.constants.layers_services import ( MONITORING_SVC_NETWORK, MONITORING_SVC_NETWORK_PRIVATE, MONITORING_SVC_NETWORK_SHARED, - MONITORING_SVC_PORT, MONITORING_SVC_PROVIDER, MONITORING_SVC_TIG, MONITORING_SVC_TPG, @@ -34,7 +32,6 @@ from e2clab.constants.layers_services import ( PROVENANCE_SVC, PROVENANCE_SVC_DATAFLOW_SPEC, PROVENANCE_SVC_PARALLELISM, - PROVENANCE_SVC_PORT, PROVENANCE_SVC_PROVIDER, QUANTITY, RESERVATION, @@ -244,87 +241,6 @@ class TestG5kProvider(TestE2cLab): # 2 services + 1 monitor + 1 provider self.assertEqual(len(prov_conf_dict["resources"]["machines"]), 4) - def test_get_provenance(self): - - g5k = G5k(infra_config=self.g5k_infra_config, optimization_id=None) - g5k.provenance_provider = False - - provenance_extra_info = g5k.get_provenance() - self.assertEqual(provenance_extra_info, {}) - - g5k.provenance_provider = True - - provenance_extra_info = g5k.get_provenance() - self.assertEqual(provenance_extra_info, {}) - - g5k.roles = Roles({PROVENANCE_SERVICE_ROLE: [Host("1.1.1.1")]}) - - provenance_extra_info = g5k.get_provenance() - self.assertEqual(provenance_extra_info, {}) - - g5k.networks = Networks({"test": "dummy"}) - - provenance_extra_info = g5k.get_provenance() - self.assertEqual( - provenance_extra_info[PROVENANCE_SERVICE_ROLE]["__address__"], "1.1.1.1" - ) - self.assertEqual( - provenance_extra_info[PROVENANCE_SERVICE_ROLE]["url"], - f"http://1.1.1.1:{PROVENANCE_SVC_PORT}", - ) - - def test_get_monitoring(self): - - g5k = G5k(infra_config=self.g5k_infra_config, optimization_id=None) - g5k.monitoring_provider = False - - monitoring_info = g5k.get_monitoring() - self.assertEqual(monitoring_info, {}) - - g5k.monitoring_provider = True - - monitoring_info = g5k.get_monitoring() - self.assertEqual(monitoring_info, {}) - - g5k.roles = Roles({MONITORING_SERVICE_ROLE: [Host("1.1.1.1")]}) - - monitoring_info = g5k.get_monitoring() - self.assertEqual(monitoring_info, {}) - - g5k.networks = Networks({"test": "dummy"}) - - monitoring_info = g5k.get_monitoring() - self.assertEqual( - monitoring_info[MONITORING_SERVICE_ROLE]["__address__"], "1.1.1.1" - ) - self.assertEqual( - monitoring_info[MONITORING_SERVICE_ROLE]["url"], - f"http://1.1.1.1:{MONITORING_SVC_PORT}", - ) - - g5k = G5k(infra_config=self.g5k_infra_config_tpg, optimization_id=None) - g5k.monitoring_provider = True - g5k.roles = Roles({MONITORING_SERVICE_ROLE: [Host("1.1.1.1")]}) - g5k.networks = Networks({"test": "dummy"}) - - monitoring_info = g5k.get_monitoring() - self.assertEqual( - monitoring_info[MONITORING_SERVICE_ROLE]["__address__"], "1.1.1.1" - ) - self.assertEqual( - monitoring_info[MONITORING_SERVICE_ROLE]["url"], - f"http://1.1.1.1:{MONITORING_SVC_PORT}", - ) - - g5k = G5k(infra_config=self.g5k_infra_config_dstat, optimization_id=None) - # DSTAT => no monitoring provider - g5k.monitoring_provider = False - g5k.roles = Roles({MONITORING_SERVICE_ROLE: [Host("1.1.1.1")]}) - g5k.networks = Networks({"test": "dummy"}) - - monitoring_info = g5k.get_monitoring() - self.assertEqual(monitoring_info, {}) - class TestG5kConfig(TestE2cLab): """ diff --git a/e2clab/tests/unit/test_managers.py b/e2clab/tests/unit/test_managers.py index 8c760d1d72fe65ac8f62d38415d1d0e019488bf9..3973f0efa2f4562fe9f1c0514e7c4f8ae3ce5796 100644 --- a/e2clab/tests/unit/test_managers.py +++ b/e2clab/tests/unit/test_managers.py @@ -30,6 +30,7 @@ from e2clab.constants.layers_services import ( MONITORING_SVC_TPG, MONITORING_SVC_TYPE, NAME, + PROVENANCE_SERVICE_ROLE, PROVENANCE_SVC_DATAFLOW_SPEC, PROVENANCE_SVC_PARALLELISM, PROVENANCE_SVC_PROVIDER, @@ -133,6 +134,11 @@ class TestProvenanceManager(TestE2cLab): # m_backup.assert_called_once_with("here") m_backup.assert_called_once() + def test_get_extra_info(self): + extra_info = self.prov.get_extra_info() + self.assertIn(PROVENANCE_SERVICE_ROLE, extra_info) + self.assertEqual(extra_info[PROVENANCE_SERVICE_ROLE]["__address__"], "1.1.1.1") + @patch.object(Provenance, "destroy") def test_destroy(self, m_destroy: Mock): self.prov._destroy() @@ -299,14 +305,17 @@ class TestMonitoringManager(TestE2cLab): def test_get_extra_info(self, m_monitoring_type: Mock): m_monitoring_type.return_value = MonitoringType.DSTAT self.assertEqual(self.monit_dstat.get_extra_info(), {}) + expected_output = { MONITORING_SERVICE_ROLE: { "__address__": f"{self.host_address}", "url": f"http://{self.host_address}:3000", } } + m_monitoring_type.return_value = MonitoringType.TIG self.assertEqual(self.monit_tig.get_extra_info(), expected_output) + m_monitoring_type.return_value = MonitoringType.TPG self.assertEqual(self.monit_tpg.get_extra_info(), expected_output)