diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh new file mode 100755 index 0000000000..048fba81f5 --- /dev/null +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -0,0 +1,50 @@ +#!/bin/bash +EESSI_VERSION="2023.06" +export LMOD_PAGER=cat + +# initialize assert framework +if [ ! -d assert.sh ]; then + echo "assert.sh not cloned." + echo "" + echo "run \`git clone https://github.com/lehmannro/assert.sh.git\`" + exit 1 +fi +. assert.sh/assert.sh + +TEST_SHELLS=("bash" "zsh" "fish" "ksh") +SHELLS=$@ + +for shell in ${SHELLS[@]}; do + echo = | awk 'NF += (OFS = $_) + 100' + echo RUNNING TESTS FOR SHELL: $shell + echo = | awk 'NF += (OFS = $_) + 100' + if [[ ! " ${TEST_SHELLS[*]} " =~ [[:space:]]${shell}[[:space:]] ]]; then + ### EXCEPTION FOR CSH ### + echo -e "\033[33mWe don't now how to test the shell '$shell', PRs are Welcome.\033[0m" + else + # TEST 1: Source Script and check Module Output + assert "$shell -c 'source init/lmod/$shell' 2>&1 " "EESSI/$EESSI_VERSION loaded successfully" + # TEST 2: Check if module overviews first section is the loaded EESSI module + MODULE_SECTIONS=($($shell -c "source init/lmod/$shell 2>/dev/null; module ov 2>&1 | grep -e '---'")) + PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3)/modules/all" + assert_raises 'echo "${MODULE_SECTIONS[1]}" | grep -E "$PATTERN"' + # TEST 3: Check if module overviews second section is the EESSI init module + assert "echo ${MODULE_SECTIONS[4]}" "/cvmfs/software.eessi.io/versions/$EESSI_VERSION/init/modules" + # Test 4: Load Python module and check version + command="$shell -c 'source init/lmod/$shell 2>/dev/null; module load Python/3.10.8-GCCcore-12.2.0; python --version'" + expected="Python 3.10.8" + assert "$command" "$expected" + # Test 5: Load Python module and check path + PYTHON_PATH=$($shell -c "source init/lmod/$shell 2>/dev/null; module load Python/3.10.8-GCCcore-12.2.0; which python") + PATTERN="/cvmfs/software\.eessi\.io/versions/$EESSI_VERSION/software/linux/x86_64/(intel/haswell|amd/zen3)/software/Python/3\.10\.8-GCCcore-12\.2\.0/bin/python" + echo "$PYTHON_PATH" | grep -E "$PATTERN" + assert_raises 'echo "$PYTHON_PATH" | grep -E "$PATTERN"' + + #End Test Suite + assert_end "source_eessi_$shell" + fi +done + + +# RESET PAGER +export LMOD_PAGER= diff --git a/.github/workflows/tests_eessi_module.yml b/.github/workflows/tests_eessi_module.yml new file mode 100644 index 0000000000..d2e3cd1338 --- /dev/null +++ b/.github/workflows/tests_eessi_module.yml @@ -0,0 +1,85 @@ +# documentation: https://help.github.com/en/articles/workflow-syntax-for-github-actions +name: Tests for eessi_module_functionality in software.eessi.io +on: + push: + branches: [ "*-software.eessi.io" ] + pull_request: +permissions: + contents: read # to fetch code (actions/checkout) +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + EESSI_VERSION: + - 2023.06 + steps: + - name: Check out software-layer repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Mount EESSI CernVM-FS pilot repository + uses: cvmfs-contrib/github-action-cvmfs@55899ca74cf78ab874bdf47f5a804e47c198743c # v4.0 + with: + cvmfs_config_package: https://github.com/EESSI/filesystem-layer/releases/download/latest/cvmfs-config-eessi_latest_all.deb + cvmfs_http_proxy: DIRECT + cvmfs_repositories: software.eessi.io + + - name: Test for making sure spider cache is being used and not being rebuilt + run: | + . /cvmfs/software.eessi.io/versions/${{matrix.EESSI_VERSION}}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash # Initialise Lmod + export MODULEPATH=init/modules + configfile="configfile.txt" + module -T load EESSI/${{matrix.EESSI_VERSION}} + module --config > "${configfile}" 2>&1 + grep cache "${configfile}" | grep software | grep -v compat + if timeout 10s bash -c "LMOD_PAGER=none module --terse avail" && grep cache "${configfile}" | grep software | grep -v compat; then + echo "EESSI spider cache is being used" + else + echo "EESSI spider cache is being rebuilt" >&2 + exit 1 + fi + env | grep LMOD + module purge + unset MODULEPATH + + - name: Test for archdetect_cpu functionality with invalid path + run: | + . /cvmfs/software.eessi.io/versions/${{matrix.EESSI_VERSION}}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash # Initialise Lmod + export MODULEPATH=init/modules + set +e # Do not exit immediately if a command exits with a non-zero status + export EESSI_ARCHDETECT_OPTIONS="dummy/cpu" + outfile="outfile.txt" + module load EESSI/${{matrix.EESSI_VERSION}} > "${outfile}" 2>&1 + cat "${outfile}" + if grep -q "Software directory check" "${outfile}"; then + echo "Test for picking up invalid path on \${archdetect_cpu} PASSED" + else + echo "Test for picking up invalid path on \${archdetect_cpu} FAILED" >&2 + exit 1 + fi + unset EESSI_ARCHDETECT_OPTIONS + set -e # Re-enable exit on non-zero status + + - name: Test for expected variables while adding dummy cpu archs and loading EESSI module + run: | + . /cvmfs/software.eessi.io/versions/${{matrix.EESSI_VERSION}}/compat/linux/$(uname -m)/usr/share/Lmod/init/bash # Initialise Lmod + export MODULEPATH=init/modules + CPU_ARCH=$(./init/eessi_archdetect.sh -a cpupath) + export EESSI_ARCHDETECT_OPTIONS="dummy/cpu:${CPU_ARCH}:dummy1/cpu1" + moduleoutfile="moduleout.txt" + sourceoutfile="sourceout.txt" + module load EESSI/${{matrix.EESSI_VERSION}} + env | grep -E '^(EESSI_S|EESSI_C)' | sort > "${moduleoutfile}" + module unload EESSI/${{matrix.EESSI_VERSION}} + source /cvmfs/software.eessi.io/versions/${{matrix.EESSI_VERSION}}/init/bash + env | grep -E '^(EESSI_S|EESSI_C)' | sort > "${sourceoutfile}" + cat "${moduleoutfile}" + cat "${sourceoutfile}" + if (diff "${moduleoutfile}" "${sourceoutfile}" > /dev/null); then + echo "Test for checking env variables PASSED" + else + echo "Test for checking env variables FAILED" >&2 + exit 1 + fi + diff --git a/.github/workflows/tests_init_module.yml b/.github/workflows/tests_init_module.yml new file mode 100644 index 0000000000..cfc4ae7b3d --- /dev/null +++ b/.github/workflows/tests_init_module.yml @@ -0,0 +1,43 @@ +# documentation: https://help.github.com/en/articles/workflow-syntax-for-github-actions +name: Check for EESSI init shell scripts to load eessi software module in software.eessi.io +on: + push: + branches: [ "*-software.eessi.io" ] + pull_request: + workflow_dispatch: +permissions: + contents: read # to fetch code (actions/checkout) +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + EESSI_VERSION: + - 2023.06 + EESSI_SOFTWARE_SUBDIR_OVERRIDE: + - x86_64/intel/haswell + steps: + - name: Check out software-layer repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Mount EESSI CernVM-FS pilot repository + uses: cvmfs-contrib/github-action-cvmfs@55899ca74cf78ab874bdf47f5a804e47c198743c # v4.0 + with: + cvmfs_config_package: https://github.com/EESSI/filesystem-layer/releases/download/latest/cvmfs-config-eessi_latest_all.deb + cvmfs_http_proxy: DIRECT + cvmfs_repositories: software.eessi.io + + - name: Clone assert.sh script + run: git clone https://github.com/lehmannro/assert.sh.git + + - name: Install missing shells + run: | + sudo apt update + sudo apt install zsh ksh fish + echo "# INIT ZSH" > ~/.zshrc + + - name: Run tests for available shells + run: | + .github/workflows/scripts/test_init_scripts.sh "bash" "zsh" "ksh" "fish" "csh" + diff --git a/create_lmodsitepackage.py b/create_lmodsitepackage.py index 7e55bce2a5..62f073c9a6 100755 --- a/create_lmodsitepackage.py +++ b/create_lmodsitepackage.py @@ -28,7 +28,7 @@ -- If EESSI_PREFIX wasn't defined, we cannot check if this module was from the EESSI environment -- In that case, we assume it isn't, otherwise EESSI_PREFIX would (probably) have been set if eessi_prefix == nil then - return False + return false else -- NOTE: exact paths for site so may need to be updated later. -- See https://github.com/EESSI/software-layer/pull/371 diff --git a/create_tarball.sh b/create_tarball.sh index 2dee665060..e59ec421c3 100755 --- a/create_tarball.sh +++ b/create_tarball.sh @@ -35,6 +35,7 @@ if [ ! -d ${software_dir_overlay} ]; then exit 3 fi +current_workdir=${PWD} cd ${overlay_upper_dir}/versions/ echo ">> Collecting list of files/directories to include in tarball via ${PWD}..." @@ -88,6 +89,9 @@ echo "wrote file list to ${files_list}" echo "wrote module file list to ${module_files_list}" [ -r ${module_files_list} ] && cat ${module_files_list} +# Copy the module files list to current workindg dir for later use in the test step +cp ${module_files_list} ${current_workdir}/module_files.list.txt + topdir=${cvmfs_repo}/versions/ echo ">> Creating tarball ${target_tgz} from ${topdir}..." diff --git a/easystacks/software.eessi.io/2023.06/a64fx/eessi-2023.06-eb-4.9.2-2023a.yml b/easystacks/software.eessi.io/2023.06/a64fx/eessi-2023.06-eb-4.9.2-2023a.yml index 5521b92398..6474d658ce 100644 --- a/easystacks/software.eessi.io/2023.06/a64fx/eessi-2023.06-eb-4.9.2-2023a.yml +++ b/easystacks/software.eessi.io/2023.06/a64fx/eessi-2023.06-eb-4.9.2-2023a.yml @@ -4,3 +4,23 @@ easyconfigs: - SciPy-bundle-2023.07-gfbf-2023a.eb - ESPResSo-4.2.2-foss-2023a.eb - ParaView-5.11.2-foss-2023a.eb + - OpenFOAM-10-foss-2023a.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/20958 + from-commit: dbadb2074464d816740ee0e95595c2cb31b6338f + - OpenFOAM-11-foss-2023a.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/20958 + from-commit: dbadb2074464d816740ee0e95595c2cb31b6338f + - OpenFOAM-v2312-foss-2023a.eb: + options: + # https://github.com/easybuilders/easybuild-easyblocks/pull/3388 + include-easyblocks-from-commit: c8256a36e7062bc09f5ce30552a9de9827054c9e + # https://github.com/easybuilders/easybuild-easyconfigs/pull/20841 + from-commit: f0e91e6e430ebf902f7788ebb47f0203dee60649 + - R-4.3.2-gfbf-2023a.eb + - Highway-1.0.4-GCCcore-12.3.0.eb + - Brunsli-0.1-GCCcore-12.3.0.eb: + options: + # https://github.com/easybuilders/easybuild-easyconfigs/pull/21366 + from-commit: 1736a123b1685836452587a5c51793257570bb2d diff --git a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-001-system.yml b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-001-system.yml new file mode 100644 index 0000000000..1b2343ec1f --- /dev/null +++ b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-001-system.yml @@ -0,0 +1,11 @@ +easyconfigs: + - EasyBuild-4.9.3.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21412 + from-commit: 1cdd81524c974a29825e37bcf8ef3ccc291f5227 + - ReFrame-4.6.2.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21307 + from-commit: 0c4bd5c5a80f571a8932fbc38880d72455406816 + # see https://github.com/easybuilders/easybuild-easyblocks/pull/3431 + include-easyblocks-from-commit: efddeb02abe1a679324ac01ef19601dedbe79cc0 diff --git a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2022b.yml b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2022b.yml index a22b78718f..0e58e2a553 100644 --- a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2022b.yml +++ b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2022b.yml @@ -6,4 +6,4 @@ easyconfigs: from-commit: d8076ebaf8cb915762adebf88d385cc672b350dc - gnuplot-5.4.6-GCCcore-12.2.0.eb - h5py-3.8.0-foss-2022b.eb - - MDAnalysis-2.4.2-foss-2022b.eb + - MDAnalysis-2.4.2-foss-2022b.eb diff --git a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023a.yml b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023a.yml index 2b5497ac45..a7dd0c14f9 100644 --- a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023a.yml +++ b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023a.yml @@ -45,5 +45,30 @@ easyconfigs: options: # see https://github.com/easybuilders/easybuild-easyconfigs/pull/20880 from-commit: bc6e08f89759b8b70166de5bfcb5056b9db8ec90 + - wradlib-2.0.3-foss-2023a.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21094 + from-commit: 3a2e0b8e6ee45277d01fb7e2eb93027a28c9461a + - MBX-1.1.0-foss-2023a.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21155 + from-commit: 6929a67401f2a2ec58f91fb306332a77497d73ff + - Transrate-1.0.3-GCC-12.3.0.eb: + options: + # https://github.com/easybuilders/easybuild-easyblocks/pull/3381 + include-easyblocks-from-commit: bb86f05d4917b29e022023f152efdf0ca5c14ded + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/20964 + from-commit: 7d539a9e599d8bc5ac2bda6ee9587ef62351ee03 + - Critic2-1.2-foss-2023a.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/20833 + from-commit: 78426c2383fc7e4b9b9e77d7a77f336e1bee3843 + - LRBinner-0.1-foss-2023a.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21310 + from-commit: 799d9101df2cf81aabe252f00cc82a7246363f53 + - Redland-1.0.17-GCC-12.3.0.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21227 + from-commit: 4c5e3455dec31e68e8383c7fd86d1f80c434676d - PyTorch-bundle-2.1.2-foss-2023a.eb - \ No newline at end of file diff --git a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023b.yml b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023b.yml index 883483f5d2..6398f014dc 100644 --- a/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023b.yml +++ b/easystacks/software.eessi.io/2023.06/eessi-2023.06-eb-4.9.2-2023b.yml @@ -15,3 +15,16 @@ easyconfigs: options: # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21034 from-commit: 76e7fc6657bab64bfbec826540a3a8f0040258f2 + - STAR-2.7.11b-GCC-13.2.0.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21200 + from-commit: 765ba900daf5953e306c4dad896febe52fdd6c00 + - HPL-2.3-foss-2023b.eb + - Brunsli-0.1-GCCcore-13.2.0.eb: + options: + # https://github.com/easybuilders/easybuild-easyconfigs/pull/21366 + from-commit: 1736a123b1685836452587a5c51793257570bb2d + - R-bundle-CRAN-2024.06-foss-2023b.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21285 + from-commit: 41a2cd83f9fb017b76f0693f6a264d8acb548317 diff --git a/easystacks/software.eessi.io/2023.06/rebuilds/20240814-eb-4.9.2-hatchling-1.18.0-updated-easyconfig.yml b/easystacks/software.eessi.io/2023.06/rebuilds/20240814-eb-4.9.2-hatchling-1.18.0-updated-easyconfig.yml new file mode 100644 index 0000000000..7ab02420ca --- /dev/null +++ b/easystacks/software.eessi.io/2023.06/rebuilds/20240814-eb-4.9.2-hatchling-1.18.0-updated-easyconfig.yml @@ -0,0 +1,9 @@ +# 2024.08.14 +# hatchling-1.18.0 rebuild to account for easyconfig changed upstream +# see https://gitlab.com/eessi/support/-/issues/85 and +# https://github.com/easybuilders/easybuild-easyconfigs/pull/20389 +easyconfigs: + - hatchling-1.18.0-GCCcore-12.3.0.eb: + options: + # see https://github.com/easybuilders/easybuild-easyconfigs/pull/20389 + from-commit: 9580c0d67d6dd97b160b768a839bfcba6d5b21b9 diff --git a/easystacks/software.eessi.io/2023.06/rebuilds/20240823-eb-4.9.2-GObject-Introspection-filter-envvars-a64fx.yml b/easystacks/software.eessi.io/2023.06/rebuilds/20240823-eb-4.9.2-GObject-Introspection-filter-envvars-a64fx.yml new file mode 100644 index 0000000000..782db66e78 --- /dev/null +++ b/easystacks/software.eessi.io/2023.06/rebuilds/20240823-eb-4.9.2-GObject-Introspection-filter-envvars-a64fx.yml @@ -0,0 +1,13 @@ +# 2024.08.23 +# GObject-Introspection sets $LD_LIBRARY_PATH (to many different paths, including $EPREFIX/lib) +# when calling gcc, and this causes a lot of issues for, especially, scripts using /bin/bash. +# +# This rebuild ensures (by using a new EasyBuild hook) that GObject-Introspection will not set +# environment variables that are configured to be filtered by EasyBuild. +# This rebuild was not done initially for A64FX. This file is meant to do the same as the +# previous rebuild of GObject-Introspection-1.76.1-GCCcore-12.3.0 in other architectures, +# but for A64FX. +# +# See https://github.com/EESSI/software-layer/issues/196 +easyconfigs: + - GObject-Introspection-1.76.1-GCCcore-12.3.0.eb diff --git a/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-001-system.yml b/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-001-system.yml new file mode 100644 index 0000000000..f1fde247d0 --- /dev/null +++ b/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-001-system.yml @@ -0,0 +1,2 @@ +easyconfigs: + - ReFrame-4.3.3.eb diff --git a/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-2023a.yml b/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-2023a.yml index 9d13d5eb3a..316754a6d1 100644 --- a/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-2023a.yml +++ b/easystacks/software.eessi.io/2023.06/zen4/eessi-2023.06-eb-4.9.2-2023a.yml @@ -22,3 +22,4 @@ easyconfigs: # see https://github.com/easybuilders/easybuild-easyconfigs/pull/21136 from-commit: d8076ebaf8cb915762adebf88d385cc672b350dc - MODFLOW-6.4.4-foss-2023a.eb + - ALL-0.9.2-foss-2023a.eb diff --git a/eb_hooks.py b/eb_hooks.py index dc4bf54f84..0dc4abe793 100644 --- a/eb_hooks.py +++ b/eb_hooks.py @@ -83,7 +83,7 @@ def post_ready_hook(self, *args, **kwargs): # 'parallel' easyconfig parameter is set via EasyBlock.set_parallel in ready step based on available cores. # here we reduce parallellism to only use half of that for selected software, # to avoid failing builds/tests due to out-of-memory problems; - memory_hungry_build = self.name in ['libxc', 'TensorFlow'] + memory_hungry_build = self.name in ['libxc', 'MBX', 'TensorFlow'] # on A64FX systems, (HBM) memory is typically scarce, so we need to use fewer cores for some builds cpu_target = get_eessi_envvar('EESSI_SOFTWARE_SUBDIR') memory_hungry_build_a64fx = cpu_target == CPU_TARGET_A64FX and self.name in ['Qt5'] @@ -333,7 +333,7 @@ def pre_prepare_hook_highway_handle_test_compilation_issues(self, *args, **kwarg Solve issues with compiling or running the tests on both neoverse_n1 and neoverse_v1 with Highway 1.0.4 and GCC 12.3.0: - for neoverse_n1 we set optarch to GENERIC - - for neoverse_v1 we completely disable the tests + - for neoverse_v1 and a64fx we completely disable the tests cfr. https://github.com/EESSI/software-layer/issues/469 """ if self.name == 'Highway': @@ -342,7 +342,7 @@ def pre_prepare_hook_highway_handle_test_compilation_issues(self, *args, **kwarg # note: keep condition in sync with the one used in # post_prepare_hook_highway_handle_test_compilation_issues if self.version in ['1.0.4'] and tcname == 'GCCcore' and tcversion == '12.3.0': - if cpu_target == CPU_TARGET_NEOVERSE_V1: + if cpu_target in [CPU_TARGET_A64FX, CPU_TARGET_NEOVERSE_V1]: self.cfg.update('configopts', '-DHWY_ENABLE_TESTS=OFF') if cpu_target == CPU_TARGET_NEOVERSE_N1: self.orig_optarch = build_option('optarch') diff --git a/eessi_container.sh b/eessi_container.sh index e404b7ee18..34fa833d99 100755 --- a/eessi_container.sh +++ b/eessi_container.sh @@ -254,7 +254,7 @@ if [[ ${LIST_REPOS} -eq 1 ]]; then default_label=", default" else default_label="" - fi + fi echo " ${cvmfs_repo} [CVMFS config repo${default_label}]" done for cfg_repo in "${!cfg_cvmfs_repos[@]}" @@ -323,7 +323,7 @@ do if [[ ! -n "${eessi_cvmfs_repos[${cvmfs_repo_name}]}" ]] ; then [[ ${VERBOSE} -eq 1 ]] && echo "repo '${cvmfs_repo_name}' is not an EESSI CVMFS repository..." # cvmfs_repo_name is actually a repository ID, use that to obtain - # the actual name from the EESSI_REPOS_CFG_FILE + # the actual name from the EESSI_REPOS_CFG_FILE cfg_repo_id=${cvmfs_repo_name} cvmfs_repo_name=$(cfg_get_value ${cfg_repo_id} "repo_name") fi @@ -595,11 +595,11 @@ do # that the necessary information for accessing a CVMFS repository is made # available inside the container if [[ -n "${cfg_cvmfs_repos[${cvmfs_repo_name}]}" ]] ; then - cfg_repo_id=${cvmfs_repo_name} + cfg_repo_id=${cvmfs_repo_name} - # obtain CVMFS repository name from section for the given ID + # obtain CVMFS repository name from section for the given ID cfg_repo_name=$(cfg_get_value ${cfg_repo_id} "repo_name") - # derive domain part from (cfg_)repo_name (everything after first '.') + # derive domain part from (cfg_)repo_name (everything after first '.') repo_name_domain=${repo_name#*.} # cfg_cvmfs_repos is populated through reading the file pointed to by @@ -609,15 +609,15 @@ do # copy repos.cfg to job directory --> makes it easier to inspect the job cp -a ${EESSI_REPOS_CFG_FILE} ${EESSI_TMPDIR}/repos_cfg/. - # cfg file should include sections (one per CVMFS repository to be mounted) - # with each section containing the settings: - # - repo_name, - # - repo_version, - # - config_bundle, and - # - a map { filepath_in_bundle -> container_filepath } + # cfg file should include sections (one per CVMFS repository to be mounted) + # with each section containing the settings: + # - repo_name, + # - repo_version, + # - config_bundle, and + # - a map { filepath_in_bundle -> container_filepath } # - # The config_bundle includes the files which are mapped ('->') to a target - # location in container: + # The config_bundle includes the files which are mapped ('->') to a target + # location in container: # - default.local -> /etc/cvmfs/default.local # contains CVMFS settings, e.g., CVMFS_HTTP_PROXY, CVMFS_QUOTA_LIMIT, ... # - ${repo_name_domain}.conf -> /etc/cvmfs/domain.d/${repo_name_domain}.conf @@ -641,7 +641,7 @@ do # use information to set up dir ${EESSI_TMPDIR}/repos_cfg and define # BIND mounts # check if config_bundle exists, if so, unpack it into - # ${EESSI_TMPDIR}/repos_cfg; if it doesn't, exit with an error + # ${EESSI_TMPDIR}/repos_cfg; if it doesn't, exit with an error # if config_bundle is relative path (no '/' at start) prepend it with # EESSI_REPOS_CFG_DIR config_bundle_path= @@ -726,7 +726,7 @@ do if [[ ${cfg_cvmfs_repos[${cvmfs_repo_name}]} ]]; then [[ ${VERBOSE} -eq 1 ]] && echo "repo '${cvmfs_repo_name}' is not an EESSI CVMFS repository..." # cvmfs_repo_name is actually a repository ID, use that to obtain - # the actual name from the EESSI_REPOS_CFG_FILE + # the actual name from the EESSI_REPOS_CFG_FILE cfg_repo_id=${cvmfs_repo_name} cvmfs_repo_name=$(cfg_get_value ${cfg_repo_id} "repo_name") fi @@ -736,15 +736,52 @@ do # add fusemount options depending on requested access mode ('ro' - read-only; 'rw' - read & write) if [[ ${cvmfs_repo_access} == "ro" ]] ; then - export EESSI_READONLY="container:cvmfs2 ${cvmfs_repo_name} /cvmfs/${cvmfs_repo_name}" + # need to distinguish between basic "ro" access and "ro" after a "rw" session + if [[ -d ${EESSI_TMPDIR}/${cvmfs_repo_name}/overlay-upper ]]; then + # the overlay-upper directory is only created in a read-write-session, thus + # we are resuming from such a session here (otherwise there shouldn't be such + # directory yet as it is only created for read-write-sessions a bit further + # below); the overlay-upper directory can only exist because it is part of + # the ${RESUME} directory or tarball + # to be able to see the contents of the read-write session we have to mount + # the fuse-overlayfs (in read-only mode) on top of the CernVM-FS repository + + echo "While processing '${cvmfs_repo_name}' to be mounted 'read-only' we detected an overlay-upper" + echo " directory (${EESSI_TMPDIR}/${cvmfs_repo_name}/overlay-upper) likely from a previous" + echo " session. Will use it as left-most directory in 'lowerdir' argument for fuse-overlayfs." + + # make the target CernVM-FS repository available under /cvmfs_ro + export EESSI_READONLY="container:cvmfs2 ${cvmfs_repo_name} /cvmfs_ro/${cvmfs_repo_name}" + + EESSI_FUSE_MOUNTS+=("--fusemount" "${EESSI_READONLY}") + + # now, put the overlay-upper read-only on top of the repo and make it available under the usual prefix /cvmfs + EESSI_READONLY_OVERLAY="container:fuse-overlayfs" + # The contents of the previous session are available under + # ${EESSI_TMPDIR} which is bind mounted to ${TMP_IN_CONTAINER}. + # Hence, we have to use ${TMP_IN_CONTAINER}/${cvmfs_repo_name}/overlay-upper + # the left-most directory given for the lowerdir argument is put on top, + # and with no upperdir=... the whole overlayfs is made available read-only + EESSI_READONLY_OVERLAY+=" -o lowerdir=${TMP_IN_CONTAINER}/${cvmfs_repo_name}/overlay-upper:/cvmfs_ro/${cvmfs_repo_name}" + EESSI_READONLY_OVERLAY+=" /cvmfs/${cvmfs_repo_name}" + export EESSI_READONLY_OVERLAY + + EESSI_FUSE_MOUNTS+=("--fusemount" "${EESSI_READONLY_OVERLAY}") + export EESSI_FUSE_MOUNTS + else + # basic "ro" access that doesn't require any fuseoverlay-fs + echo "Mounting '${cvmfs_repo_name}' 'read-only' without fuse-overlayfs." - EESSI_FUSE_MOUNTS+=("--fusemount" "${EESSI_READONLY}") - export EESSI_FUSE_MOUNTS + export EESSI_READONLY="container:cvmfs2 ${cvmfs_repo_name} /cvmfs/${cvmfs_repo_name}" + + EESSI_FUSE_MOUNTS+=("--fusemount" "${EESSI_READONLY}") + export EESSI_FUSE_MOUNTS + fi elif [[ ${cvmfs_repo_access} == "rw" ]] ; then # use repo-specific overlay directories mkdir -p ${EESSI_TMPDIR}/${cvmfs_repo_name}/overlay-upper mkdir -p ${EESSI_TMPDIR}/${cvmfs_repo_name}/overlay-work - [[ ${VERBOSE} -eq 1 ]] && echo -e "TMP directory contents:\n$(ls -l ${EESSI_TMPDIR})" + [[ ${VERBOSE} -eq 1 ]] && echo -e "TMP directory contents:\n$(ls -l ${EESSI_TMPDIR})" # set environment variables for fuse mounts in Singularity container export EESSI_READONLY="container:cvmfs2 ${cvmfs_repo_name} /cvmfs_ro/${cvmfs_repo_name}" @@ -762,7 +799,7 @@ do export EESSI_FUSE_MOUNTS else echo -e "ERROR: access mode '${cvmfs_repo_access}' for CVMFS repository\n '${cvmfs_repo_name}' is not known" - exit ${REPOSITORY_ERROR_EXITCODE} + exit ${REPOSITORY_ERROR_EXITCODE} fi # create repo_settings.sh file in ${EESSI_TMPDIR}/${cvmfs_repo_name} to store # (intention is that the file could be just sourced to obtain the settings) diff --git a/init/lmod/bash b/init/lmod/bash new file mode 100644 index 0000000000..b4941d6766 --- /dev/null +++ b/init/lmod/bash @@ -0,0 +1,16 @@ +# Choose an EESSI version +EESSI_VERSION="${EESSI_VERSION:-2023.06}" +# Path to top-level module tree +export MODULEPATH=/cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/init/modules +. /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/compat/linux/$(uname -m)/usr/share/Lmod/init/bash + +if [ -z "$__Init_Default_Modules" ]; then + export __Init_Default_Modules=1; + + ## ability to predefine elsewhere the default list + LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} + export LMOD_SYSTEM_DEFAULT_MODULES + module --initial_load --no_redirect restore +else + module refresh +fi diff --git a/init/lmod/csh b/init/lmod/csh new file mode 100644 index 0000000000..8e50d5e5c8 --- /dev/null +++ b/init/lmod/csh @@ -0,0 +1,16 @@ +# Choose an EESSI version +if (! $?EESSI_VERSION) then; set EESSI_VERSION = "2023.06"; endif +# Path to top-level module tree +setenv MODULEPATH /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/init/modules +source /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/compat/linux/`uname -m`/usr/share/Lmod/init/csh + +if (! $?__Init_Default_Modules ) then + setenv __Init_Default_Modules 1; + + ## ability to predefine elsewhere the default list + if (! $?LMOD_SYSTEM_DEFAULT_MODULES) then; setenv LMOD_SYSTEM_DEFAULT_MODULES "EESSI/$EESSI_VERSION"; endif + module --initial_load --no_redirect restore +else + module refresh +endif + diff --git a/init/lmod/fish b/init/lmod/fish new file mode 100644 index 0000000000..d4252ef32a --- /dev/null +++ b/init/lmod/fish @@ -0,0 +1,15 @@ +# Choose an EESSI version +set EESSI_VERSION (set -q EESSI_VERSION; and echo "$EESSI_VERSION"; or echo "2023.06") +# Path to top-level module tree +set -x MODULEPATH /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/init/modules +. /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/compat/linux/(uname -m)/usr/share/Lmod/init/fish + +if test -z "$__Init_Default_Modules" + export __Init_Default_Modules=1; + + ## ability to predefine elsewhere the default list + set -x LMOD_SYSTEM_DEFAULT_MODULES (set -q LMOD_SYSTEM_DEFAULT_MODULE; and echo "$LMOD_SYSTEM_DEFAULT_MODULE"; or echo "EESSI/$EESSI_VERSION") + module --initial_load --no_redirect restore +else + module refresh +end diff --git a/init/lmod/ksh b/init/lmod/ksh new file mode 100644 index 0000000000..71dc29542f --- /dev/null +++ b/init/lmod/ksh @@ -0,0 +1,16 @@ +# Choose an EESSI version +EESSI_VERSION="${EESSI_VERSION:-2023.06}" +# Path to top-level module tree +export MODULEPATH=/cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/init/modules +. /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/compat/linux/$(uname -m)/usr/share/Lmod/init/ksh + +if [ -z "$__Init_Default_Modules" ]; then + export __Init_Default_Modules=1; + + ## ability to predefine elsewhere the default list + LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} + export LMOD_SYSTEM_DEFAULT_MODULES + module --initial_load --no_redirect restore +else + module refresh +fi diff --git a/init/lmod/zsh b/init/lmod/zsh new file mode 100644 index 0000000000..5f605579c8 --- /dev/null +++ b/init/lmod/zsh @@ -0,0 +1,16 @@ +# Choose an EESSI version +EESSI_VERSION="${EESSI_VERSION:-2023.06}" +# Path to top-level module tree +export MODULEPATH=/cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/init/modules +. /cvmfs/software.eessi.io/versions/"$EESSI_VERSION"/compat/linux/$(uname -m)/usr/share/Lmod/init/zsh + +if [ -z "$__Init_Default_Modules" ]; then + export __Init_Default_Modules=1; + + ## ability to predefine elsewhere the default list + LMOD_SYSTEM_DEFAULT_MODULES=${LMOD_SYSTEM_DEFAULT_MODULES:-"EESSI/$EESSI_VERSION"} + export LMOD_SYSTEM_DEFAULT_MODULES + module --initial_load --no_redirect restore +else + module refresh +fi diff --git a/init/modules/EESSI/2023.06.lua b/init/modules/EESSI/2023.06.lua new file mode 100644 index 0000000000..32aaf6c07f --- /dev/null +++ b/init/modules/EESSI/2023.06.lua @@ -0,0 +1,70 @@ +help([[ +Description +=========== +The European Environment for Scientific Software Installations (EESSI, pronounced as easy) is a collaboration between different European partners in HPC community.The goal of this project is to build a common stack of scientific software installations for HPC systems and beyond, including laptops, personal workstations and cloud infrastructure. + +More information +================ + - URL: https://www.eessi.io/docs/ +]]) +whatis("Description: The European Environment for Scientific Software Installations (EESSI, pronounced as easy) is a collaboration between different European partners in HPC community. The goal of this project is to build a common stack of scientific software installations for HPC systems and beyond, including laptops, personal workstations and cloud infrastructure.") +whatis("URL: https://www.eessi.io/docs/") +conflict("EESSI") +local eessi_version = myModuleVersion() +local eessi_repo = "/cvmfs/software.eessi.io" +local eessi_prefix = pathJoin(eessi_repo, "versions", eessi_version) +local eessi_os_type = "linux" +setenv("EESSI_VERSION", eessi_version) +setenv("EESSI_CVMFS_REPO", eessi_repo) +setenv("EESSI_OS_TYPE", eessi_os_type) +function archdetect_cpu() + local script = pathJoin(eessi_prefix, 'init', 'lmod_eessi_archdetect_wrapper.sh') + if not os.getenv("EESSI_ARCHDETECT_OPTIONS") then + if convertToCanonical(LmodVersion()) < convertToCanonical("8.6") then + LmodError("Loading this modulefile requires using Lmod version >= 8.6, but you can export EESSI_ARCHDETECT_OPTIONS to the available cpu architecture in the form of: x86_64/intel/haswell:x86_64/generic or aarch64/neoverse_v1:aarch64/generic") + end + source_sh("bash", script) + end + local archdetect_options = os.getenv("EESSI_ARCHDETECT_OPTIONS") or "" + for archdetect_filter_cpu in string.gmatch(archdetect_options, "([^" .. ":" .. "]+)") do + if isDir(pathJoin(eessi_prefix, "software", eessi_os_type, archdetect_filter_cpu, "software")) then + -- use x86_64/amd/zen3 for now when AMD Genoa (Zen4) CPU is detected, + -- since optimized software installations for Zen4 are a work-in-progress, + -- see https://gitlab.com/eessi/support/-/issues/37 + if archdetect_filter_cpu == "x86_64/amd/zen4" then + archdetect_filter_cpu = "x86_64/amd/zen3" + if mode() == "load" then + LmodMessage("Sticking to " .. archdetect_filter_cpu .. " for now, since optimized installations for AMD Genoa (Zen4) are a work in progress.") + end + end + return archdetect_filter_cpu + end + end + LmodError("Software directory check for the detected architecture failed") +end +local archdetect = archdetect_cpu() +local eessi_cpu_family = archdetect:match("([^/]+)") +local eessi_software_subdir = archdetect +local eessi_eprefix = pathJoin(eessi_prefix, "compat", eessi_os_type, eessi_cpu_family) +local eessi_software_path = pathJoin(eessi_prefix, "software", eessi_os_type, eessi_software_subdir) +local eessi_module_path = pathJoin(eessi_software_path, "modules", "all") +local eessi_site_module_path = string.gsub(eessi_module_path, "versions", "host_injections") +setenv("EPREFIX", eessi_eprefix) +setenv("EESSI_CPU_FAMILY", eessi_cpu_family) +setenv("EESSI_SITE_MODULEPATH", eessi_site_module_path) +setenv("EESSI_SOFTWARE_SUBDIR", eessi_software_subdir) +setenv("EESSI_PREFIX", eessi_prefix) +setenv("EESSI_EPREFIX", eessi_eprefix) +prepend_path("PATH", pathJoin(eessi_eprefix, "bin")) +prepend_path("PATH", pathJoin(eessi_eprefix, "usr/bin")) +setenv("EESSI_SOFTWARE_PATH", eessi_software_path) +setenv("EESSI_MODULEPATH", eessi_module_path) +if ( mode() ~= "spider" ) then + prepend_path("MODULEPATH", eessi_module_path) +end +prepend_path("LMOD_RC", pathJoin(eessi_software_path, "/.lmod/lmodrc.lua")) +prepend_path("MODULEPATH", eessi_site_module_path) +setenv("LMOD_PACKAGE_PATH", pathJoin(eessi_software_path, ".lmod")) +if mode() == "load" then + LmodMessage("EESSI/" .. eessi_version .. " loaded successfully") +end diff --git a/install_scripts.sh b/install_scripts.sh index 6f01818840..11c7fc2a9f 100755 --- a/install_scripts.sh +++ b/install_scripts.sh @@ -102,6 +102,18 @@ mc_files=( ) copy_files_by_list ${TOPDIR}/init/Magic_Castle ${INSTALL_PREFIX}/init/Magic_Castle "${mc_files[@]}" +# Copy for init/modules/EESSI directory +mc_files=( + 2023.06.lua +) +copy_files_by_list ${TOPDIR}/init/modules/EESSI ${INSTALL_PREFIX}/init/modules/EESSI "${mc_files[@]}" + +# Copy for init/lmod directory +init_script_files=( + bash zsh ksh fish csh +) +copy_files_by_list ${TOPDIR}/init/lmod ${INSTALL_PREFIX}/init/lmod "${init_script_files[@]}" + # Copy for the scripts directory script_files=( utils.sh diff --git a/reframe_config_bot.py.tmpl b/reframe_config_bot.py.tmpl index 607373767a..323aafd5ec 100644 --- a/reframe_config_bot.py.tmpl +++ b/reframe_config_bot.py.tmpl @@ -15,19 +15,13 @@ site_configuration = { 'modules_system': 'lmod', 'partitions': [ { - 'name': 'default', + 'name': '__RFM_PARTITION__', 'scheduler': 'local', 'launcher': 'mpirun', 'environs': ['default'], 'features': [ FEATURES[CPU] ] + list(SCALES.keys()), - 'processor': { - 'num_cpus': __NUM_CPUS__, - 'num_sockets': __NUM_SOCKETS__, - 'num_cpus_per_core': __NUM_CPUS_PER_CORE__, - 'num_cpus_per_socket': __NUM_CPUS_PER_SOCKET__, - }, 'resources': [ { 'name': 'memory', @@ -56,8 +50,7 @@ site_configuration = { { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job - # disable automatic detection of CPU architecture (since we're using local scheduler) - 'remote_detect': False, + 'remote_detect': True, } ], 'logging': common_logging_config(), diff --git a/scripts/gpu_support/nvidia/install_cuda_host_injections.sh b/scripts/gpu_support/nvidia/install_cuda_host_injections.sh index a9310d817a..3842aff307 100755 --- a/scripts/gpu_support/nvidia/install_cuda_host_injections.sh +++ b/scripts/gpu_support/nvidia/install_cuda_host_injections.sh @@ -123,7 +123,7 @@ else tmpdir=$(mktemp -d) else tmpdir="${CUDA_TEMP_DIR}"/temp - if ! mkdir "$tmpdir" ; then + if ! mkdir -p "$tmpdir" ; then fatal_error "Could not create directory ${tmpdir}" fi fi @@ -175,13 +175,13 @@ else # Check the exit code if [ $? -ne 0 ]; then eb_version=$(eb --version) - available_cuda_easyconfigs=$(eb --search ^CUDA-*.eb|grep CUDA) + available_cuda_easyconfigs=$(eb --search "^CUDA-.*.eb"|grep CUDA) error="The easyconfig ${cuda_easyconfig} was not found in EasyBuild version:\n" error="${error} ${eb_version}\n" error="${error}You either need to give a different version of CUDA to install _or_ \n" error="${error}use a different version of EasyBuild for the installation.\n" - error="${error}\nThe versions of available with the current eb command are:\n" + error="${error}\nThe versions of CUDA available with the current eb command are:\n" error="${error}${available_cuda_easyconfigs}" fatal_error "${error}" fi diff --git a/test_suite.sh b/test_suite.sh index 6e73fbd87c..e7151e00e7 100755 --- a/test_suite.sh +++ b/test_suite.sh @@ -74,11 +74,17 @@ fi TMPDIR=$(mktemp -d) echo ">> Setting up environment..." -module --force purge -export EESSI_SOFTWARE_SUBDIR_OVERRIDE=$(python3 $TOPDIR/eessi_software_subdir.py $DETECTION_PARAMETERS) +# For this call to be succesful, it needs to be able to import archspec (which is part of EESSI) +# Thus, we execute it in a subshell where EESSI is already initialized (a bit like a bootstrap) +export EESSI_SOFTWARE_SUBDIR_OVERRIDE=$(source $TOPDIR/init/bash > /dev/null 2>&1; python3 $TOPDIR/eessi_software_subdir.py $DETECTION_PARAMETERS) +echo "EESSI_SOFTWARE_SUBDIR_OVERRIDE: $EESSI_SOFTWARE_SUBDIR_OVERRIDE" source $TOPDIR/init/bash +# We have to ignore the LMOD cache, otherwise the software that is built in the build step cannot be found/loaded +# Reason is that the LMOD cache is normally only updated on the Stratum 0, once everything is ingested +export LMOD_IGNORE_CACHE=1 + # Load the ReFrame module # Currently, we load the default version. Maybe we should somehow make this configurable in the future? module load ReFrame @@ -135,41 +141,48 @@ export RFM_PREFIX=$PWD/reframe_runs echo "Configured reframe with the following environment variables:" env | grep "RFM_" -# Inject correct CPU/memory properties into the ReFrame config file -cpuinfo=$(lscpu) -if [[ "${cpuinfo}" =~ CPU\(s\):[^0-9]*([0-9]+) ]]; then - cpu_count=${BASH_REMATCH[1]} -else - fatal_error "Failed to get the number of CPUs for the current test hardware with lscpu." -fi -if [[ "${cpuinfo}" =~ Socket\(s\):[^0-9]*([0-9]+) ]]; then - socket_count=${BASH_REMATCH[1]} -else - fatal_error "Failed to get the number of sockets for the current test hardware with lscpu." -fi -if [[ "${cpuinfo}" =~ (Thread\(s\) per core:[^0-9]*([0-9]+)) ]]; then - threads_per_core=${BASH_REMATCH[2]} -else - fatal_error "Failed to get the number of threads per core for the current test hardware with lscpu." -fi -if [[ "${cpuinfo}" =~ (Core\(s\) per socket:[^0-9]*([0-9]+)) ]]; then - cores_per_socket=${BASH_REMATCH[2]} +# The /sys inside the container is not the same as the /sys of the host +# We want to extract the memory limit from the cgroup on the host (which is typically set by SLURM). +# Thus, bot/test.sh bind-mounts the host's /sys/fs/cgroup into /hostsys/fs/cgroup +# and that's the prefix we use to extract the memory limit from +cgroup_v1_mem_limit="/hostsys/fs/cgroup/memory/$( Tests: {additional_tests}") + elif debug: + print(f"Software: {software_name} -> No tests found") + + # Always add the default set of tests, if default_tests is specified + if 'default_tests' in mappings: + additional_tests = mappings['default_tests'] + for test in additional_tests: + if test not in tests_to_run: + tests_to_run.append(test) + + if additional_tests and debug: + print(f"Adding default set of tests: {additional_tests}") + + # Create argument string out of the list of tests to run + if tests_to_run: + arg_string = " ".join([f"-n {test_name}" for test_name in tests_to_run]) + + # Print final lists & argument string + if debug: + print(f"Full list of tests to run: {tests_to_run}") + print(f"Argument string: {arg_string}") + else: + # This is the only thing this script should print, unless run with --debug + print(f"{arg_string}") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Map software names to their tests based on a YAML configuration.") + parser.add_argument('--mapping-file', type=str, help='Path to the YAML file containing the test mappings.') + parser.add_argument('--module-list', type=str, help='Path to the file containing the list of software names.') + parser.add_argument('--debug', action='store_true', help='Enable debug output.') + + args = parser.parse_args() + + main(args.mapping_file, args.module_list, args.debug) diff --git a/tests/eessi_test_mapping/software_to_tests.yml b/tests/eessi_test_mapping/software_to_tests.yml new file mode 100644 index 0000000000..626477781f --- /dev/null +++ b/tests/eessi_test_mapping/software_to_tests.yml @@ -0,0 +1,35 @@ +# This file creates a mapping between (regular expressions for) module names and test names from the EESSI test suite +# If a module name matches one of the regular expressions, the listed set of tests will be run in the test step +# For a given module name, the test list for the first matching regular expression is returned +# E.g. for +# mappings: +# foo-v1: +# - bar +# foo-* +# - bar2 +# only the bar test will be run for foo-v1 (even though it also matches the pattern (foo-*) +# If a module name does not match anything, the default_tests will be run +# Note that to list all available tests by name, one can do execute +# reframe -R -c /path/to/eessi/test-suite/ --list | grep -Po "\bEESSI_\S+?(?=[\s'])" | uniq +# Note that this regular expression is a bit sensitive to changes in the structure of ReFrame's output, +# but is confirmed to work for ReFrame version 4.6.1 +mappings: + PyTorch-Bundle/*: + - EESSI_PyTorch_torchvision + QuantumESPRESSO/*: + - EESSI_QuantumESPRESSO + CP2K/*: + - EESSI_CP2K + ESPResSo/*: + - EESSI_ESPRESSO + LAMMPS/*: + - EESSI_LAMMPS + OSU-Micro-Benchmarks/*: + - EESSI_OSU_Micro_Benchmarks + GROMACS/*: + - EESSI_GROMACS + default_tests: + # Low level tests + - EESSI_OSU_Micro_Benchmarks + # A very quick-to-run high level application test + - EESSI_LAMMPS