Skip to content

Commit f6d0ab9

Browse files
committed
Merge branch 'mpi-not-required' into update-to-3.4.0
2 parents 6b8158a + a99ab53 commit f6d0ab9

File tree

3 files changed

+44
-23
lines changed

3 files changed

+44
-23
lines changed

mache/deploy/run.py

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ def _resolve_login_pixi_env(
555555
prefix: str,
556556
pixi_cfg: dict[str, Any],
557557
runtime: dict[str, Any],
558-
compute_mpi: str,
558+
compute_mpi: str | None,
559559
) -> dict[str, str] | None:
560560
runtime_pixi = runtime.get('pixi')
561561
if not isinstance(runtime_pixi, dict):
@@ -573,6 +573,8 @@ def _resolve_login_pixi_env(
573573
resolved_login_mpi, login_mpi_prefix = _get_mpi_settings(
574574
pixi_cfg={'mpi': login_mpi}
575575
)
576+
if resolved_login_mpi is None or login_mpi_prefix is None:
577+
raise ValueError('login_mpi must resolve to a non-empty MPI setting')
576578

577579
if 'login_prefix' in runtime_pixi:
578580
login_prefix_raw = runtime_pixi.get('login_prefix')
@@ -895,15 +897,12 @@ def _resolve_pixi_mpi(
895897
*,
896898
pixi_cfg: dict[str, Any],
897899
runtime: dict[str, Any],
898-
) -> tuple[str, str]:
899-
mpi_override = None
900+
) -> tuple[str | None, str | None]:
901+
mpi_cfg = pixi_cfg
900902
runtime_pixi = runtime.get('pixi')
901903
if isinstance(runtime_pixi, dict):
902-
mpi_override = runtime_pixi.get('mpi')
903-
if mpi_override is not None:
904-
mpi_cfg: dict[str, Any] = {'mpi': str(mpi_override)}
905-
else:
906-
mpi_cfg = pixi_cfg
904+
if 'mpi' in runtime_pixi:
905+
mpi_cfg = {'mpi': runtime_pixi.get('mpi')}
907906
return _get_mpi_settings(pixi_cfg=mpi_cfg)
908907

909908

@@ -1416,7 +1415,7 @@ def _write_load_script(
14161415
software_version: str,
14171416
runtime_version_cmd: str | None,
14181417
machine: str | None,
1419-
compute_pixi_mpi: str,
1418+
compute_pixi_mpi: str | None,
14201419
toolchain_compiler: str | None,
14211420
toolchain_mpi: str | None,
14221421
spack_library_view: str | None,
@@ -1504,7 +1503,7 @@ def _write_load_script(
15041503
runtime_version_cmd_sh=shlex.quote(runtime_version_cmd or ''),
15051504
machine=machine or '',
15061505
load_script=os.path.abspath(script_path),
1507-
compute_pixi_mpi=compute_pixi_mpi,
1506+
compute_pixi_mpi=compute_pixi_mpi or '',
15081507
login_prefix=login_prefix_abs,
15091508
login_pixi_toml=login_pixi_toml,
15101509
login_pixi_mpi=login_pixi_mpi,
@@ -1537,7 +1536,7 @@ def _write_load_scripts(
15371536
software_version: str,
15381537
runtime_version_cmd: str | None,
15391538
machine: str | None,
1540-
compute_pixi_mpi: str,
1539+
compute_pixi_mpi: str | None,
15411540
toolchain_pairs: list[tuple[str, str]],
15421541
spack_results: Any,
15431542
spack_software_env: Any,
@@ -1710,29 +1709,26 @@ def _pixi_install(
17101709

17111710
def _get_mpi_settings(
17121711
pixi_cfg: dict[str, Any],
1713-
) -> tuple[str, str]:
1712+
) -> tuple[str | None, str | None]:
17141713
"""Determine MPI-related template replacements.
17151714
17161715
Returns
17171716
-------
1718-
mpi : str
1717+
mpi : str or None
17191718
The conda package name for MPI (e.g. "mpich", "openmpi", or "nompi").
1720-
mpi_prefix : str
1719+
mpi_prefix : str or None
17211720
The conda-forge variant prefix used in build-string selectors
17221721
(e.g. "nompi", "mpi_mpich", "mpi_openmpi").
17231722
"""
17241723

17251724
if 'mpi' not in pixi_cfg:
1726-
raise ValueError(
1727-
"'mpi' not found in [pixi] section of deploy/config.yaml.j2"
1728-
)
1725+
return None, None
17291726

1730-
mpi_raw = pixi_cfg.get('mpi')
1731-
mpi = str(mpi_raw).strip().lower() if mpi_raw is not None else ''
1732-
if not mpi:
1733-
raise ValueError(
1734-
"'mpi' in [pixi] section of deploy/config.yaml.j2 is empty"
1735-
)
1727+
mpi = _normalize_optional_token(pixi_cfg.get('mpi'))
1728+
if mpi is None:
1729+
return None, None
1730+
1731+
mpi = mpi.lower()
17361732
if any(ch.isspace() for ch in mpi):
17371733
raise ValueError(
17381734
"'mpi' in [pixi] section of deploy/config.yaml.j2 must not "

mache/deploy/templates/config.yaml.j2.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ pixi:
8181

8282
# MPI provider for conda packages.
8383
# Supported values in `mache deploy run`:
84+
# - null if MPI is not used in the target software
8485
# - nompi
8586
# - mpich
8687
# - openmpi

tests/test_deploy_run.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,30 @@ def test_resolve_pixi_omit_dependencies_prefers_runtime_override():
239239
assert omit_dependencies == ['git', 'ncview']
240240

241241

242+
def test_get_mpi_settings_allows_missing_mpi():
243+
mpi, mpi_prefix = deploy_run._get_mpi_settings(pixi_cfg={})
244+
245+
assert mpi is None
246+
assert mpi_prefix is None
247+
248+
249+
def test_get_mpi_settings_allows_null_mpi():
250+
mpi, mpi_prefix = deploy_run._get_mpi_settings(pixi_cfg={'mpi': None})
251+
252+
assert mpi is None
253+
assert mpi_prefix is None
254+
255+
256+
def test_resolve_pixi_mpi_runtime_override_can_disable_mpi():
257+
mpi, mpi_prefix = deploy_run._resolve_pixi_mpi(
258+
pixi_cfg={'mpi': 'openmpi'},
259+
runtime={'pixi': {'mpi': None}},
260+
)
261+
262+
assert mpi is None
263+
assert mpi_prefix is None
264+
265+
242266
def test_resolve_login_pixi_env_uses_distinct_login_prefix():
243267
login_env = deploy_run._resolve_login_pixi_env(
244268
prefix='/tmp/compute-env',

0 commit comments

Comments
 (0)