From 4a343846ab50d8ddc70fb9dde72c0477eab221e8 Mon Sep 17 00:00:00 2001 From: Tim Pillinger <26465611+wxtim@users.noreply.github.com> Date: Mon, 4 Dec 2023 11:07:21 +0000 Subject: [PATCH] Ensure that the cached globalconfig object is reloaded after the export of `CYLC_SYMLINKS` variable. This means that using the `CYLC_SYMLINKS` variable allows users to specify installation symlink locations in the `rose-suite.conf`. --- CHANGES.md | 9 +++++++++ cylc/rose/utilities.py | 8 ++++++++ tests/functional/test_utils.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 27af8c00..a80577f2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,15 @@ creating a new release entry be sure to copy & paste the span tag with the updated. Only the first match gets replaced, so it's fine to leave the old ones in. --> + +## __cylc-rose-1.4.0 (Upcoming)__ + +### Features + +[#269](://github.com/cylc/cylc-rose/pull/269) - Reload the Cylc Global +config after exporting CYLC_SYMLINKS variable. This change will allow +users to set symlink directory locations in their `rose-suite.conf`. + ## __cylc-rose-1.3.1 (Released 2023-10-24)__ ### Fixes diff --git a/cylc/rose/utilities.py b/cylc/rose/utilities.py index e23f6e54..c6e1b8af 100644 --- a/cylc/rose/utilities.py +++ b/cylc/rose/utilities.py @@ -27,6 +27,7 @@ from cylc.flow import LOG from cylc.flow.exceptions import CylcError from cylc.flow.flags import cylc7_back_compat +from cylc.flow.cfgspec.glbl_cfg import glbl_cfg from cylc.flow.hostuserutil import get_host from metomi.isodatetime.datetimeoper import DateTimeOperator from metomi.rose import __version__ as ROSE_VERSION @@ -869,6 +870,13 @@ def export_environment(environment: Dict[str, str]) -> None: for key, val in environment.items(): os.environ[key] = val + # If CYLC_SYMLINKS has been set we want to force reload + # the global config so that the value of CYLC_SYMLINKS + # can be used by Jinja2 in the global config. + # https://github.com/cylc/cylc-rose/issues/237 + if 'CYLC_SYMLINKS' in environment: + glbl_cfg().load() + def record_cylc_install_options( srcdir: Path, diff --git a/tests/functional/test_utils.py b/tests/functional/test_utils.py index f2b9ef07..3b784e09 100644 --- a/tests/functional/test_utils.py +++ b/tests/functional/test_utils.py @@ -36,3 +36,37 @@ def test_basic(tmp_path): assert Path(tmp_path / 'src/rose-suite.conf').read_text() == ( Path(tmp_path / 'dest/rose-suite.conf').read_text() ) + + +def test_CYLC_SYMLINKS(monkeypatch, tmp_path, cylc_validate_cli): + """We reload the global config after exporting env variables.""" + # Setup global config: + global_conf = """#!jinja2 + {% from "cylc.flow" import LOG %} + {% set cylc_symlinks = environ.get('CYLC_SYMLINKS', None) %} + {% do LOG.critical(cylc_symlinks) %} + """ + conf_path = tmp_path / 'conf' + conf_path.mkdir() + monkeypatch.setenv('CYLC_CONF_PATH', conf_path) + + # Setup workflow config: + (conf_path / 'global.cylc').write_text(global_conf) + (tmp_path / 'rose-suite.conf').write_text( + '[env]\nCYLC_SYMLINKS="Foo"\n') + (tmp_path / 'flow.cylc').write_text(""" + [scheduling] + initial cycle point = now + [[graph]] + R1 = x + [runtime] + [[x]] + """) + + # Validate the config: + output = cylc_validate_cli(tmp_path) + assert output.ret == 0 + + # CYLC_SYMLINKS == None the first time the global.cylc + # is loaded and "Foo" the second time. + assert output.logging == 'None\n"Foo"'