diff --git a/autosubmit/autosubmit.py b/autosubmit/autosubmit.py index d54ef43eb7344753335c03f1af39f48ef30676ba..378d6e586cfba227559e505b7ce2862869b8413d 100644 --- a/autosubmit/autosubmit.py +++ b/autosubmit/autosubmit.py @@ -1241,7 +1241,7 @@ class Autosubmit: return content @staticmethod - def as_conf_default_values(exp_id,hpc="local",minimal_configuration=False,git_repo="",git_branch="main",git_as_conf=""): + def as_conf_default_values(exp_id,hpc,minimal_configuration=False,git_repo="",git_branch="main",git_as_conf=""): """ Replace default values in as_conf files :param exp_id: experiment id @@ -1252,6 +1252,9 @@ class Autosubmit: :param git_as_conf: path to as_conf file in git repository :return: None """ + # the var hpc was harcoded in the header of the function + hpc_default="local" + # open and replace values for as_conf_file in os.listdir(os.path.join(BasicConfig.LOCAL_ROOT_DIR, exp_id,"conf")): if as_conf_file.endswith(".yml") or as_conf_file.endswith(".yaml"): @@ -1270,7 +1273,16 @@ class Autosubmit: content = Autosubmit.replace_parameter_inside_section(content, "EXPID", exp_id, "DEFAULT") search = re.search('HPCARCH: .*', content, re.MULTILINE) if search is not None: - content = content.replace(search.group(0),"HPCARCH: \""+hpc+"\"") + x = search.group(0).split(":") + #clean blankSpace, quotes and doble quote + aux=x[1].strip().strip('\"').strip('\'') + # hpc in config is empty && -H is empty-> hpc_default will be introduced + if (len(aux)==0 and not hpc): + content = content.replace(search.group(0),"HPCARCH: \""+hpc_default+"\"") + # hpc in config is empty && -H is has a value-> wrtie down hpc value + elif len(aux)==0 : + content = content.replace(search.group(0),"HPCARCH: \""+hpc+"\"") + ## the other case is aux!=0 that we dont care about val(hpc) because its a copyExpId if minimal_configuration: search = re.search('CUSTOM_CONFIG: .*', content, re.MULTILINE) if search is not None: @@ -4663,7 +4675,7 @@ class Autosubmit: :return: True if successful, False if not :rtype: bool """ - + project_destination = as_conf.get_project_destination() if project_destination is None or len(project_destination) == 0: if project_type.lower() != "none": diff --git a/test/unit/conftest.py b/test/unit/conftest.py new file mode 100644 index 0000000000000000000000000000000000000000..9f06fe1924de85df3b499099f342840db3c3c628 --- /dev/null +++ b/test/unit/conftest.py @@ -0,0 +1,109 @@ +# Fixtures available to multiple test files must be created in this file. + +import pytest +from dataclasses import dataclass +from pathlib import Path +from shutil import rmtree +from tempfile import TemporaryDirectory +from typing import Any, Dict, Callable, List + +from autosubmit.autosubmit import Autosubmit +from autosubmit.platforms.slurmplatform import SlurmPlatform, ParamikoPlatform +from autosubmitconfigparser.config.basicconfig import BasicConfig +from autosubmitconfigparser.config.configcommon import AutosubmitConfig +from autosubmitconfigparser.config.yamlparser import YAMLParserFactory + + +@dataclass +class AutosubmitExperiment: + """This holds information about an experiment created by Autosubmit.""" + expid: str + autosubmit: Autosubmit + exp_path: Path + tmp_dir: Path + aslogs_dir: Path + status_dir: Path + platform: ParamikoPlatform + + +@pytest.fixture(scope='function') +def autosubmit_exp(autosubmit: Autosubmit, request: pytest.FixtureRequest) -> Callable: + """Create an instance of ``Autosubmit`` with an experiment.""" + + original_root_dir = BasicConfig.LOCAL_ROOT_DIR + tmp_dir = TemporaryDirectory() + tmp_path = Path(tmp_dir.name) + + def _create_autosubmit_exp(expid: str): + # directories used when searching for logs to cat + root_dir = tmp_path + BasicConfig.LOCAL_ROOT_DIR = str(root_dir) + exp_path = root_dir / expid + exp_tmp_dir = exp_path / BasicConfig.LOCAL_TMP_DIR + aslogs_dir = exp_tmp_dir / BasicConfig.LOCAL_ASLOG_DIR + status_dir = exp_path / 'status' + aslogs_dir.mkdir(parents=True) + status_dir.mkdir() + + platform_config = { + "LOCAL_ROOT_DIR": BasicConfig.LOCAL_ROOT_DIR, + "LOCAL_TMP_DIR": str(exp_tmp_dir), + "LOCAL_ASLOG_DIR": str(aslogs_dir) + } + platform = SlurmPlatform(expid=expid, name='slurm_platform', config=platform_config) + platform.job_status = { + 'COMPLETED': [], + 'RUNNING': [], + 'QUEUING': [], + 'FAILED': [] + } + submit_platform_script = aslogs_dir / 'submit_local.sh' + submit_platform_script.touch(exist_ok=True) + + return AutosubmitExperiment( + expid=expid, + autosubmit=autosubmit, + exp_path=exp_path, + tmp_dir=exp_tmp_dir, + aslogs_dir=aslogs_dir, + status_dir=status_dir, + platform=platform + ) + + def finalizer(): + BasicConfig.LOCAL_ROOT_DIR = original_root_dir + rmtree(tmp_path) + + request.addfinalizer(finalizer) + + return _create_autosubmit_exp + + +@pytest.fixture(scope='module') +def autosubmit() -> Autosubmit: + """Create an instance of ``Autosubmit``. + + Useful when you need ``Autosubmit`` but do not need any experiments.""" + autosubmit = Autosubmit() + return autosubmit + + +@pytest.fixture(scope='function') +def create_as_conf() -> Callable: + def _create_as_conf(autosubmit_exp: AutosubmitExperiment, yaml_files: List[Path], experiment_data: Dict[str, Any]): + basic_config = BasicConfig + parser_factory = YAMLParserFactory() + as_conf = AutosubmitConfig( + expid=autosubmit_exp.expid, + basic_config=basic_config, + parser_factory=parser_factory + ) + for yaml_file in yaml_files: + parser = parser_factory.create_parser() + parser.data = parser.load(yaml_file) + as_conf.experiment_data.update(parser.data) + # add user-provided experiment data + as_conf.experiment_data.update(experiment_data) + return as_conf + + return _create_as_conf \ No newline at end of file diff --git a/test/unit/test_copy_expid.py b/test/unit/test_copy_expid.py new file mode 100644 index 0000000000000000000000000000000000000000..0d8b428bc7b07dbe623128d701b430014e2e2fb1 --- /dev/null +++ b/test/unit/test_copy_expid.py @@ -0,0 +1,76 @@ +import pytest +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Dict, Callable, List +from tempfile import TemporaryDirectory + +from autosubmit.autosubmit import Autosubmit +from autosubmit.platforms.slurmplatform import SlurmPlatform, ParamikoPlatform +from autosubmitconfigparser.config.basicconfig import BasicConfig +from autosubmitconfigparser.config.configcommon import AutosubmitConfig +from autosubmitconfigparser.config.yamlparser import YAMLParserFactory + +from test.unit.conftest import AutosubmitExperiment, autosubmit_exp + +@pytest.fixture +def fake_description(): + return "test descript" + +## create expid && check default hpc +# autosubmit expid -d "test descript" +def test_create_expid_default_hpc(fake_description): + #create default expid + expid = Autosubmit.expid(fake_description) + #capture the platform using the describe + describe = Autosubmit.describe(expid) + hpc_result=describe[4].lower() + + assert hpc_result == "local" + +@pytest.mark.parametrize("fake_hpc, expected_hpc", [ + ("mn5", "mn5"), + ("", "local"), +]) +## create expid && with -H value +# autosubmit expid -H ithaca -d "experiment is about..." +# autosubmit expid -H "" -d "experiment is about..." +def test_create_expid_flag_hpc(fake_description,fake_hpc, expected_hpc): + #create default expid with know hpc + expid = Autosubmit.expid(fake_description, fake_hpc) + #capture the platform using the describe + describe = Autosubmit.describe(expid) + hpc_result=describe[4].lower() + + assert hpc_result == expected_hpc + +@pytest.mark.parametrize("fake_hpc, expected_hpc", [ + ("mn5", "mn5"), + ("", "local"), +]) +## copy expid with default hpc +# autosubmit expid -y a000 -d "experiment is about..." +def test_copy_expid(fake_description, fake_hpc, expected_hpc): + #create default expid with know hpc + expid = Autosubmit.expid(fake_description, fake_hpc) + #copy expid + copy_expid=Autosubmit.expid(fake_description, "",expid) + #capture the platform using the describe + describe = Autosubmit.describe(copy_expid) + hpc_result=describe[4].lower() + + assert hpc_result == expected_hpc + +## copy expid with specific hpc should not change the hpc value +# autosubmit expid -y a000 -h local -d "experiment is about..." +def test_copy_expid_no(fake_description): + #create default expid with know hpc + fake_hpc="mn5" + new_hpc="local" + expid = Autosubmit.expid(fake_description, fake_hpc) + + copy_expid=Autosubmit.expid(fake_description, new_hpc ,expid) + #capture the platform using the describe + describe = Autosubmit.describe(copy_expid) + hpc_result=describe[4].lower() + + assert not hpc_result == new_hpc \ No newline at end of file