diff --git a/autosubmit/job/job.py b/autosubmit/job/job.py index ba4d704079cc82ffe5560d752feab7eb759da7ef..914ef275bfcba857bb7c5af113b8c95dd4550703 100644 --- a/autosubmit/job/job.py +++ b/autosubmit/job/job.py @@ -1352,14 +1352,29 @@ class Job(object): self.status = default_status else: return default_status + + def update_current_parameters(self, as_conf: AutosubmitConfig, parameters: dict) -> dict: + """ + Update the %CURRENT_*% parameters with the current platform and jobs. + + :param as_conf: The Autosubmit configuration object. + :type as_conf: AutosubmitConfig + :param parameters: The dictionary to update with current parameters. + :type parameters: dict + :return: The updated parameter's dictionary. + :rtype: dict + """ + for key, value in as_conf.platforms_data.get(self.platform_name, {}).items(): + parameters[f"CURRENT_{key.upper()}"] = value + for key, value in as_conf.jobs_data[self.section].items(): + parameters[f"CURRENT_{key.upper()}"] = value + return parameters def update_platform_parameters(self,as_conf,parameters,job_platform): if not job_platform: submitter = job_utils._get_submitter(as_conf) submitter.load_platforms(as_conf) job_platform = submitter.platforms[self.platform_name] self.platform = job_platform - for key,value in as_conf.platforms_data.get(job_platform.name,{}).items(): - parameters["CURRENT_"+key.upper()] = value parameters['CURRENT_ARCH'] = job_platform.name parameters['CURRENT_HOST'] = job_platform.host parameters['CURRENT_USER'] = job_platform.user @@ -1921,8 +1936,6 @@ class Job(object): parameters['PROJECT_TYPE'] = as_conf.get_project_type() parameters['X11'] = self.x11 self.wchunkinc = as_conf.get_wchunkinc(self.section) - for key,value in as_conf.jobs_data[self.section].items(): - parameters["CURRENT_"+key.upper()] = value return parameters @@ -1986,13 +1999,13 @@ class Job(object): parameters['PROJDIR'] = as_conf.get_project_dir() # Set parameters dictionary # Set final value - parameters = self.update_job_parameters(as_conf,parameters) + parameters = self.update_current_parameters(as_conf, parameters) + parameters = self.update_job_parameters(as_conf, parameters) parameters = self.update_platform_parameters(as_conf, parameters, self._platform) parameters = self.update_platform_associated_parameters(as_conf, parameters, self._platform, parameters['CHUNK']) parameters = self.update_wrapper_parameters(as_conf, parameters) - parameters = as_conf.normalize_parameters_keys(parameters,default_parameters) + parameters = as_conf.deep_read_loops(parameters) parameters = as_conf.substitute_dynamic_variables(parameters,80) - parameters = as_conf.normalize_parameters_keys(parameters,default_parameters) self.update_job_variables_final_values(parameters) # For some reason, there is return but the assignee is also necessary self.parameters = parameters diff --git a/test/unit/conftest.py b/test/unit/conftest.py index b83345b0339a5409ef397fae42b1f47fe8fd789b..f2ab6ab279f6f988f639619e0292ec40fb229f76 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -168,6 +168,7 @@ def autosubmit_config( for arg, value in kwargs.items(): setattr(config, arg, value) + config.current_loaded_files = [conf_dir / 'dummy-so-it-doesnt-force-reload.yml'] return config def finalizer() -> None: @@ -177,4 +178,4 @@ def autosubmit_config( request.addfinalizer(finalizer) - return _create_autosubmit_config \ No newline at end of file + return _create_autosubmit_config diff --git a/test/unit/test_job.py b/test/unit/test_job.py index 02133f1af5d3013fb825ea8fb63f347694f3019b..9980e7f6819fa1919759207a387430519b30d9cc 100644 --- a/test/unit/test_job.py +++ b/test/unit/test_job.py @@ -1088,6 +1088,7 @@ CONFIG: 'WALLCLOCK': wallclock, 'CUSTOM_DIRECTIVES': custom_directives, 'SCRATCH_FREE_SPACE': 0, + 'PLATFORM': 'dummy_platform', } self.as_conf.jobs_data[section] = options @@ -1108,7 +1109,7 @@ CONFIG: self.as_conf.normalize_parameters_keys = MagicMock() self.as_conf.normalize_parameters_keys.return_value = default self.job._platform = dummy_platform - self.as_conf.platforms_data = { "dummy_platform":{ "whatever":"dummy_value", "whatever2":"dummy_value2"} } + self.as_conf.platforms_data = { "DUMMY_PLATFORM":{ "whatever":"dummy_value", "whatever2":"dummy_value2"} } parameters = {} # Act @@ -1440,8 +1441,3 @@ class FakeBasicConfig: DEFAULT_PLATFORMS_CONF = '' DEFAULT_JOBS_CONF = '' STRUCTURES_DIR = '/dummy/structures/dir' - - - - - diff --git a/test/unit/test_job_pytest.py b/test/unit/test_job_pytest.py new file mode 100644 index 0000000000000000000000000000000000000000..421429fbcb2e1f35399844b6850c42ccdb294e4c --- /dev/null +++ b/test/unit/test_job_pytest.py @@ -0,0 +1,52 @@ +import pytest + +from autosubmit.job.job import Job +from autosubmit.platforms.psplatform import PsPlatform + + +@pytest.mark.parametrize('experiment_data, expected_data', [( + { + 'JOBS': { + 'RANDOM-SECTION': { + 'FILE': "test.sh", + 'PLATFORM': 'DUMMY_PLATFORM', + 'TEST': "%other%" + }, + }, + 'PLATFORMS': { + 'dummy_platform': { + 'type': 'ps', + 'whatever': 'dummy_value', + 'whatever2': 'dummy_value2', + 'CUSTOM_DIRECTIVES': ['$SBATCH directive1', '$SBATCH directive2'], + }, + }, + 'OTHER': "%CURRENT_WHATEVER%/%CURRENT_WHATEVER2%", + 'ROOTDIR': 'dummy_rootdir', + 'LOCAL_TMP_DIR': 'dummy_tmpdir', + 'LOCAL_ROOT_DIR': 'dummy_rootdir', + }, + { + 'CURRENT_FILE': "test.sh", + 'CURRENT_PLATFORM': 'DUMMY_PLATFORM', + 'CURRENT_WHATEVER': 'dummy_value', + 'CURRENT_WHATEVER2': 'dummy_value2', + 'CURRENT_TEST': 'dummy_value/dummy_value2', + + } +)]) +def test_update_parameters_current_variables(autosubmit_config, experiment_data, expected_data): + as_conf = autosubmit_config("test-expid", experiment_data) + as_conf.experiment_data = as_conf.deep_normalize(as_conf.experiment_data) + as_conf.experiment_data = as_conf.normalize_variables(as_conf.experiment_data, must_exists=True) + as_conf.experiment_data = as_conf.deep_read_loops(as_conf.experiment_data) + as_conf.experiment_data = as_conf.substitute_dynamic_variables(as_conf.experiment_data) + as_conf.experiment_data = as_conf.parse_data_loops(as_conf.experiment_data) + # Create some jobs + job = Job('A', '1', 0, 1) + platform = PsPlatform(expid='a000', name='DUMMY_PLATFORM', config=as_conf.experiment_data) + job.section = 'RANDOM-SECTION' + job.platform = platform + job.update_parameters(as_conf, {}) + for key, value in expected_data.items(): + assert job.parameters[key] == value