From ef551228c47ccee9f064328162e1d7efd5060706 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Mon, 21 Aug 2023 11:39:08 +0200 Subject: [PATCH 01/37] use common config section for logging --- config/github_actions.py | 40 ++-------------- config/izum_vega.py | 60 ++---------------------- config/settings_example.py | 58 ++++++----------------- config/surf_snellius.py | 48 ++----------------- config/vsc_hortense.py | 80 ++------------------------------ eessi/testsuite/common_config.py | 58 +++++++++++++++++++++++ scripts/run_reframe.sh | 15 +++++- 7 files changed, 104 insertions(+), 255 deletions(-) create mode 100644 eessi/testsuite/common_config.py diff --git a/config/github_actions.py b/config/github_actions.py index bea90f1a..7b1810f8 100644 --- a/config/github_actions.py +++ b/config/github_actions.py @@ -1,6 +1,7 @@ # ReFrame configuration file that can be used in GitHub Actions with EESSI -from eessi.testsuite.constants import * +from eessi.testsuite.common_config import common_logging_config +from eessi.testsuite.constants import * # noqa: F403 site_configuration = { @@ -38,40 +39,5 @@ 'keep_stage_files': True, } ], - 'logging': [ - { - 'level': 'debug', - 'handlers': [ - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s' - }, - { - 'type': 'file', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', # noqa: E501 - 'append': True - } - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': '%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': ( - '%(check_job_completion_time)s|reframe %(version)s|' - '%(check_info)s|jobid=%(check_jobid)s|' - '%(check_perf_var)s=%(check_perf_value)s|' - 'ref=%(check_perf_ref)s ' - '(l=%(check_perf_lower_thres)s, ' - 'u=%(check_perf_upper_thres)s)|' - '%(check_perf_unit)s' - ), - 'append': True - } - ] - } - ], + 'logging': common_logging_config, } diff --git a/config/izum_vega.py b/config/izum_vega.py index 223b4dfb..18b4622d 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -1,16 +1,5 @@ -from os import environ, makedirs - -from eessi.testsuite.constants import * - -# Get username of current user -homedir = environ.get('HOME') - -# This config will write all staging, output and logging to subdirs under this prefix -reframe_prefix = f'{homedir}/reframe_runs' -log_prefix = f'{reframe_prefix}/logs' - -# ReFrame complains if the directory for the file logger doesn't exist yet -makedirs(f'{log_prefix}', exist_ok=True) +from eessi.testsuite.common_config import common_logging_config +from eessi.testsuite.constants import * # noqa: F403 # This is an example configuration file site_configuration = { @@ -26,8 +15,7 @@ 'name': 'vega', 'descr': 'Vega, a EuroHPC JU system', 'modules_system': 'lmod', - 'hostnames': ['vglogin*','cn*','gn*'], - 'prefix': reframe_prefix, + 'hostnames': ['vglogin*', 'cn*', 'gn*'], 'partitions': [ { 'name': 'cpu', @@ -97,46 +85,6 @@ 'cxx': '', 'ftn': '', }, - ], - 'logging': [ - { - 'level': 'debug', - 'handlers': [ - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s' - }, - { - 'type': 'file', - 'name': f'{log_prefix}/reframe.log', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', # noqa: E501 - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", - } - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': f'{log_prefix}/%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': ( - '%(check_job_completion_time)s|reframe %(version)s|' - '%(check_info)s|jobid=%(check_jobid)s|' - '%(check_perfvalues)s' - ), - 'format_perfvars': ( - '%(check_perf_var)s=%(check_perf_value)s|' - 'ref=%(check_perf_ref)s ' - '(l=%(check_perf_lower_thres)s, ' - 'u=%(check_perf_upper_thres)s)|' - '%(check_perf_unit)s|' - ), - 'append': True - } - ] - } ], + 'logging': common_logging_config, } diff --git a/config/settings_example.py b/config/settings_example.py index 5954974b..fd4ae764 100644 --- a/config/settings_example.py +++ b/config/settings_example.py @@ -1,13 +1,12 @@ """ Example configuration file """ -from os import environ +import os -from eessi.testsuite.constants import * +from eessi.testsuite.common_config import common_logging_config, format_perfvars, perflog_format +from eessi.testsuite.constants import * # noqa: F403 -username = environ.get('USER') - site_configuration = { 'systems': [ { @@ -16,7 +15,7 @@ 'modules_system': 'lmod', 'hostnames': ['*'], # Note that the stagedir should be a shared directory available on all nodes running ReFrame tests - 'stagedir': f'/some/shared/dir/{username}/reframe_output/staging', + 'stagedir': f'/some/shared/dir/{os.environ.get("USER")}/reframe_output/staging', 'partitions': [ { 'name': 'cpu_partition', @@ -79,42 +78,15 @@ 'ftn': '', }, ], - 'logging': [ - { - 'level': 'debug', - 'handlers': [ - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s' - }, - { - 'type': 'file', - 'name': 'reframe.log', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', # noqa: E501 - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", - } - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': '%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': ( - '%(check_job_completion_time)s|reframe %(version)s|' - '%(check_info)s|jobid=%(check_jobid)s|' - '%(check_perf_var)s=%(check_perf_value)s|' - 'ref=%(check_perf_ref)s ' - '(l=%(check_perf_lower_thres)s, ' - 'u=%(check_perf_upper_thres)s)|' - '%(check_perf_unit)s' - ), - 'append': True - } - ] - } - ], + 'logging': common_logging_config, } + +# optional logging to syslog +site_configuration['logging'][0]['handlers_perflog'].append({ + 'type': 'syslog', + 'address': '/dev/log', + 'level': 'info', + 'format': f'reframe: {perflog_format}', + 'format_perfvars': format_perfvars, + 'append': True, +}) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 532ecb2f..bf0a2fe6 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -1,10 +1,9 @@ -from os import environ +import os -from eessi.testsuite.constants import * +from eessi.testsuite.common_config import common_logging_config +from eessi.testsuite.constants import * # noqa: F403 -username = environ.get('USER') - # This is an example configuration file site_configuration = { 'systems': [ @@ -13,7 +12,7 @@ 'descr': 'Dutch National Supercomputer', 'modules_system': 'lmod', 'hostnames': ['int*', 'tcn*', 'hcn*', 'fcn*', 'gcn*', 'srv*'], - 'stagedir': f'/scratch-shared/{username}/reframe_output/staging', + 'stagedir': f'/scratch-shared/{os.environ.get("USER")}/reframe_output/staging', 'partitions': [ { 'name': 'thin', @@ -67,44 +66,7 @@ 'ftn': '', }, ], - 'logging': [ - { - 'level': 'debug', - 'handlers': [ - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s' - }, - { - 'type': 'file', - 'name': 'reframe.log', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', # noqa: E501 - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", - } - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': '%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': ( - '%(check_job_completion_time)s|reframe %(version)s|' - '%(check_info)s|jobid=%(check_jobid)s|' - '%(check_perf_var)s=%(check_perf_value)s|' - 'ref=%(check_perf_ref)s ' - '(l=%(check_perf_lower_thres)s, ' - 'u=%(check_perf_upper_thres)s)|' - '%(check_perf_unit)s' - ), - 'append': True - } - ] - } - ], + 'logging': common_logging_config, 'general': [ { # For autodetect to work, temporarily change: diff --git a/config/vsc_hortense.py b/config/vsc_hortense.py index 223783cb..1e127440 100644 --- a/config/vsc_hortense.py +++ b/config/vsc_hortense.py @@ -1,47 +1,23 @@ # ReFrame configuration file for VSC Tier-1 Hortense # https://docs.vscentrum.be/en/latest/gent/tier1_hortense.html # -# authors: Sam Moors (VUB-HPC), Kenneth Hoste (HPC-UGent) +# authors: Samuel Moors (VUB-HPC), Kenneth Hoste (HPC-UGent) from reframe.core.backends import register_launcher from reframe.core.launchers import JobLauncher -from eessi.testsuite.constants import * - +from eessi.testsuite.common_config import common_logging_config +from eessi.testsuite.constants import * # noqa: F403 account = "my-slurm-account" -# use 'info' to log to syslog -syslog_level = 'warning' - -perf_logging_format = 'reframe: ' + '|'.join([ - 'username=%(osuser)s', - 'version=%(version)s', - 'name=%(check_name)s', - 'system=%(check_system)s', - 'partition=%(check_partition)s', - 'environ=%(check_environ)s', - 'num_tasks=%(check_num_tasks)s', - 'num_cpus_per_task=%(check_num_cpus_per_task)s', - 'num_tasks_per_node=%(check_num_tasks_per_node)s', - 'modules=%(check_modules)s', - 'jobid=%(check_jobid)s', - '%(check_perfvalues)s', -]) - -format_perfvars = '|'.join([ - 'perf_var=%(check_perf_var)s', - 'perf_value=%(check_perf_value)s', - 'unit=%(check_perf_unit)s', -]) + '|' - hortense_access = [f'-A {account}', '--export=NONE', '--get-user-env=60L'] @register_launcher('mympirun') class MyMpirunLauncher(JobLauncher): def command(self, job): - return ['mympirun', '--hybrid', str(job.num_tasks)] + return ['mympirun', '--hybrid', str(job.num_tasks_per_node)] site_configuration = { @@ -217,51 +193,5 @@ def command(self, job): 'keep_stage_files': True, } ], - 'logging': [ - { - 'level': 'debug', - 'handlers': [ - { - 'type': 'file', - 'name': 'reframe.log', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_name)s: %(message)s', # noqa: E501 - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", - }, - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s', - }, - { - 'type': 'file', - 'name': 'reframe.out', - 'level': 'info', - 'format': '%(message)s', - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", - }, - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': '%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': '%(check_job_completion_time)s ' + perf_logging_format, - 'format_perfvars': format_perfvars, - 'append': True, - }, - { - 'type': 'syslog', - 'address': '/dev/log', - 'level': syslog_level, - 'format': perf_logging_format, - 'format_perfvars': format_perfvars, - 'append': True, - }, - ], - } - ], + 'logging': common_logging_config, } diff --git a/eessi/testsuite/common_config.py b/eessi/testsuite/common_config.py new file mode 100644 index 00000000..5e95ba9e --- /dev/null +++ b/eessi/testsuite/common_config.py @@ -0,0 +1,58 @@ +perflog_format = '|'.join([ + '%(check_job_completion_time)s', + '%(osuser)s', + '%(version)s', + '%(check_unique_name)s', + '%(check_info)s', + '%(check_system)s', + '%(check_partition)s', + '%(check_environ)s', + '%(check_exclusive_access)s', + '%(check_num_tasks)s', + '%(check_num_cpus_per_task)s', + '%(check_num_tasks_per_node)s', + '%(check_num_gpus_per_node)s', + '%(check_use_multithreading)s', + '%(check_modules)s', + '%(check_jobid)s', + '%(check_perfvalues)s', +]) + +format_perfvars = '|'.join([ + '%(check_perf_var)s', + '%(check_perf_value)s', + '%(check_perf_lower_thres)s', + '%(check_perf_upper_thres)s', + '%(check_perf_unit)s', + '' # final delimiter required +]) + +common_logging_config = [{ + 'level': 'debug', + 'handlers': [ + { + 'type': 'stream', + 'name': 'stdout', + 'level': 'info', + 'format': '%(message)s', + }, + { + 'type': 'file', + 'name': 'reframe.log', + 'level': 'debug', + 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', + 'append': True, + 'timestamp': "%Y%m%d_%H%M%S", # add a timestamp to the filename (reframe_.log) + }, + ], + 'handlers_perflog': [ + { + 'type': 'filelog', + 'prefix': '%(check_system)s/%(check_partition)s', + 'level': 'info', + 'format': perflog_format, + 'format_perfvars': format_perfvars, + 'append': True, # avoid overwriting + }, + ], +}] diff --git a/scripts/run_reframe.sh b/scripts/run_reframe.sh index 870d41a5..842fff13 100755 --- a/scripts/run_reframe.sh +++ b/scripts/run_reframe.sh @@ -42,9 +42,22 @@ source /cvmfs/pilot.eessi-hpc.org/latest/init/bash deactivate source ${TEMPDIR}/${REFRAME_VENV}/bin/activate +# save dirs stage, output, perflogs into PREFIX +PREFIX=$HOME/reframe_runs + # Run ReFrame echo "PYTHONPATH: ${PYTHONPATH}" -reframe -C ${TEMPDIR}/test-suite/config/${RFM_CONFIG_NAME} -c ${TEMPDIR}/test-suite/eessi/testsuite/tests/apps/ -R -t CI ${TAGS} -r --performance-report +options=( + --config-file ${TEMPDIR}/test-suite/config/${RFM_CONFIG_NAME} + --checkpath ${TEMPDIR}/test-suite/eessi/testsuite/tests/apps/ + --recursive # Search for checks in the search path recursively + --tag CI ${TAGS} + --run + --performance-report + --prefix $PREFIX + --save-log-files # copy ReFrame file logs to $PREFIX/output on exit +) +reframe "${options[@]}" # Cleanup rm -rf ${TEMPDIR} From 6201b39ac6cb7573b48a97648eec74b7dbcfdbeb Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Mon, 21 Aug 2023 11:49:24 +0200 Subject: [PATCH 02/37] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b44e084d..dae68a6f 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,8 @@ export PYTHONPATH=$PWD:$PYTHONPATH reframe \ --config-file \ --checkpath eessi/testsuite/tests/apps \ + --prefix \ + --save-log-files \ --tag CI --tag 1_node \ --run --performance-report ``` From c8b4063eea9807e6d4b51559db3ad5c108321d87 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Fri, 25 Aug 2023 14:47:39 +0200 Subject: [PATCH 03/37] keep vega-specific prefix --- config/izum_vega.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/config/izum_vega.py b/config/izum_vega.py index 18b4622d..b78843ea 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -1,3 +1,5 @@ +import os + from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import * # noqa: F403 @@ -75,9 +77,9 @@ ], 'descr': 'GPU partition, see https://en-doc.vega.izum.si/architecture/' }, - ] - }, - ], + ] + }, + ], 'environments': [ { 'name': 'default', @@ -88,3 +90,6 @@ ], 'logging': common_logging_config, } + +# This config will write all staging, output and logging to subdirs under this prefix +site_configuration['systems'][0]['prefix'] = f'{os.environ.get("HOME")}/reframe_runs' From 4de1bf1783493707b4f6ba17d12533e99ea38082 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Fri, 25 Aug 2023 16:42:09 +0200 Subject: [PATCH 04/37] Expand functionality of find_modules so that it can be passed a regular expression. It can also ommit the version (i.e. anything after the last slash) from the match, if required. --- eessi/testsuite/utils.py | 59 ++++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/eessi/testsuite/utils.py b/eessi/testsuite/utils.py index 3b770d77..dcec83f3 100644 --- a/eessi/testsuite/utils.py +++ b/eessi/testsuite/utils.py @@ -4,7 +4,7 @@ import re import sys -from typing import Iterator +from typing import Iterator, List import reframe as rfm import reframe.core.runtime as rt @@ -57,15 +57,58 @@ def is_cuda_required_module(module_name: str) -> bool: return requires_cuda -def find_modules(substr: str) -> Iterator[str]: - """Return all modules in the current system that contain ``substr`` in their name.""" - if not isinstance(substr, str): +def find_modules(regex: str, name_only = True) -> Iterator[str]: + """ + Return all modules matching the regular expression regex. Note that since we use re.search, + a module matches if the regex matches the module name at any place. I.e. the match does + not have to be at the start of the smodule name + + Arguments: + - regex: a regular expresion + - name_only: regular expressions will only be matched on the module name, not the version (default: True). + + Note: the name_only feature assumes anything after the last forward '/' is the version, + and strips that before doing a match. + + Example + + Suppose we have the following modules on a system: + + gompic/2022a + gompi/2022a + CGAL/4.14.3-gompi-2022a + + The following calls would return the following respective modules + + find_modules('gompi') => [gompic/2022a, gompi/2022a] + find_modules('gompi$') => [gompi/2022a] + find_modules('gompi', name_only = False) => [gompic/2022a, gompi/2022a, CGAL/4.14.3-gompi-2022a] + find_modules('^gompi', name_only = False) => [gompic/2022a, gompi/2022a] + find_modules('^gompi\/', name_only = False) => [gompi/2022a] + find_modules('-gompi-2022a', name_only = False) => [CGAL/4.14.3-gompi-2022a] + + """ + + if not isinstance(regex, str): raise TypeError("'substr' argument must be a string") ms = rt.runtime().modules_system - modules = OrderedSet(ms.available_modules(substr)) - for m in modules: - yield m + # Returns e.g. ['Bison/', 'Bison/3.7.6-GCCcore-10.3.0', 'BLIS/', 'BLIS/0.8.1-GCC-10.3.0'] + modules = ms.available_modules('') + for mod in modules: + # Exclude anything without version, i.e. ending with / (e.g. Bison/) + if re.search('.*\/$', mod): + continue + # The thing we yield should always be the original module name (orig_mod), including version + orig_mod = mod + if name_only: + # Remove part after the last forward slash, as we assume this is the version + mod = re.sub('\/[^\/]*$', '', mod) + # Match the actual regular expression + log(f"Matching module {mod} with regex {regex}") + if re.search(regex, mod): + log(f"Match!") + yield orig_mod def check_proc_attribute_defined(test: rfm.RegressionTest, attribute) -> bool: """ @@ -104,4 +147,4 @@ def check_proc_attribute_defined(test: rfm.RegressionTest, attribute) -> bool: "This is a programming error, please report this issue." ) raise AttributeError(msg) - \ No newline at end of file + From 90b7f08bf187890957fdde9b4b255cbe74cb0cf4 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Fri, 25 Aug 2023 16:46:45 +0200 Subject: [PATCH 05/37] Importing List from typing isn't needed --- eessi/testsuite/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eessi/testsuite/utils.py b/eessi/testsuite/utils.py index dcec83f3..ed6c611d 100644 --- a/eessi/testsuite/utils.py +++ b/eessi/testsuite/utils.py @@ -4,7 +4,7 @@ import re import sys -from typing import Iterator, List +from typing import Iterator import reframe as rfm import reframe.core.runtime as rt From 8770d37c0af4dfd1527110913fc8792b6e626f0e Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Fri, 25 Aug 2023 20:00:36 +0200 Subject: [PATCH 06/37] fixes --- config/aws_citc.py | 67 +++++++----------------------------------- config/izum_vega.py | 8 +++-- scripts/run_reframe.sh | 6 +--- 3 files changed, 17 insertions(+), 64 deletions(-) diff --git a/config/aws_citc.py b/config/aws_citc.py index 181cc11c..f135b5dc 100644 --- a/config/aws_citc.py +++ b/config/aws_citc.py @@ -11,19 +11,14 @@ # Another known issue is that CPU autodetection fails if run from an actual installation of ReFrame. # It only works if run from a clone of their Github Repo. See https://github.com/reframe-hpc/reframe/issues/2914 -from os import environ, makedirs +import os +from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import FEATURES -# Get username of current user -homedir = environ.get('HOME') - -# This config will write all staging, output and logging to subdirs under this prefix -reframe_prefix = f'{homedir}/reframe_runs' -log_prefix = f'{reframe_prefix}/logs' - -# ReFrame complains if the directory for the file logger doesn't exist yet -makedirs(f'{log_prefix}', exist_ok=True) +# This config will write all staging, output (and logging with --save-log-files) to subdirs under this prefix +# Override with --prefix +reframe_prefix = f'{os.environ.get("HOME")}/reframe_runs' # AWS CITC site configuration site_configuration = { @@ -32,7 +27,7 @@ 'name': 'citc', 'descr': 'Cluster in the Cloud build and test environment on AWS', 'modules_system': 'lmod', - 'hostnames': ['mgmt', 'login', 'fair-mastodon*'], + 'hostnames': ['mgmt', 'login', 'fair-mastodon*'], 'prefix': reframe_prefix, 'partitions': [ { @@ -110,9 +105,9 @@ 'access': ['--constraint=shape=c7g.4xlarge', '--export=NONE'], 'descr': 'Graviton3, 16 cores, 32 GiB', }, - ] - }, - ], + ] + }, + ], 'environments': [ { 'name': 'default', @@ -120,46 +115,8 @@ 'cxx': '', 'ftn': '', }, - ], - 'logging': [ - { - 'level': 'debug', - 'handlers': [ - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s' - }, - { - 'type': 'file', - 'prefix': f'{log_prefix}/reframe.log', - 'name': 'reframe.log', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', # noqa: E501 - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", - }, - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': f'{log_prefix}/%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': ( - '%(check_job_completion_time)s|reframe %(version)s|' - '%(check_info)s|jobid=%(check_jobid)s|' - '%(check_perf_var)s=%(check_perf_value)s|' - 'ref=%(check_perf_ref)s ' - '(l=%(check_perf_lower_thres)s, ' - 'u=%(check_perf_upper_thres)s)|' - '%(check_perf_unit)s' - ), - 'append': True - } - ] - } ], + 'logging': common_logging_config, 'general': [ { 'remote_detect': True, @@ -176,7 +133,7 @@ # However, using srun requires either using pmix or proper pmi2 integration in the MPI library # See https://github.com/EESSI/test-suite/pull/53#issuecomment-1598753968 # Thus, we use mpirun for now, and manually swap to srun if we want to autodetect CPUs... - 'launcher': 'srun', + 'launcher': 'mpirun', 'environs': ['default'], 'features': [ FEATURES['CPU'] @@ -191,5 +148,3 @@ for system in site_configuration['systems']: for partition in system['partitions']: partition.update(partition_defaults) - - diff --git a/config/izum_vega.py b/config/izum_vega.py index b78843ea..f043a0e1 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -3,6 +3,10 @@ from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import * # noqa: F403 +# This config will write all staging, output (and logging with --save-log-files) to subdirs under this prefix +# Override with --prefix +reframe_prefix = f'{os.environ.get("HOME")}/reframe_runs' + # This is an example configuration file site_configuration = { 'general': [ @@ -18,6 +22,7 @@ 'descr': 'Vega, a EuroHPC JU system', 'modules_system': 'lmod', 'hostnames': ['vglogin*', 'cn*', 'gn*'], + 'prefix': reframe_prefix, 'partitions': [ { 'name': 'cpu', @@ -90,6 +95,3 @@ ], 'logging': common_logging_config, } - -# This config will write all staging, output and logging to subdirs under this prefix -site_configuration['systems'][0]['prefix'] = f'{os.environ.get("HOME")}/reframe_runs' diff --git a/scripts/run_reframe.sh b/scripts/run_reframe.sh index 842fff13..748ce5f4 100755 --- a/scripts/run_reframe.sh +++ b/scripts/run_reframe.sh @@ -42,9 +42,6 @@ source /cvmfs/pilot.eessi-hpc.org/latest/init/bash deactivate source ${TEMPDIR}/${REFRAME_VENV}/bin/activate -# save dirs stage, output, perflogs into PREFIX -PREFIX=$HOME/reframe_runs - # Run ReFrame echo "PYTHONPATH: ${PYTHONPATH}" options=( @@ -54,8 +51,7 @@ options=( --tag CI ${TAGS} --run --performance-report - --prefix $PREFIX - --save-log-files # copy ReFrame file logs to $PREFIX/output on exit + --save-log-files # copy ReFrame file logs to /output on exit ) reframe "${options[@]}" From b639998e05428f4b048a8b338a63ba7a104a8519 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen <33718780+casparvl@users.noreply.github.com> Date: Mon, 28 Aug 2023 17:52:51 +0200 Subject: [PATCH 07/37] Apply suggestions from code review Forward slash does not need to be escaped Co-authored-by: Sam Moors --- eessi/testsuite/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eessi/testsuite/utils.py b/eessi/testsuite/utils.py index ed6c611d..a18c19fa 100644 --- a/eessi/testsuite/utils.py +++ b/eessi/testsuite/utils.py @@ -97,13 +97,13 @@ def find_modules(regex: str, name_only = True) -> Iterator[str]: modules = ms.available_modules('') for mod in modules: # Exclude anything without version, i.e. ending with / (e.g. Bison/) - if re.search('.*\/$', mod): + if re.search('.*/$', mod): continue # The thing we yield should always be the original module name (orig_mod), including version orig_mod = mod if name_only: # Remove part after the last forward slash, as we assume this is the version - mod = re.sub('\/[^\/]*$', '', mod) + mod = re.sub('/[^/]*$', '', mod) # Match the actual regular expression log(f"Matching module {mod} with regex {regex}") if re.search(regex, mod): From 254d89b807f489f0d6480c01dafbac555c75fac8 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Mon, 28 Aug 2023 18:52:35 +0200 Subject: [PATCH 08/37] add num_cpus_per_core; remove keep_stage_file --- config/github_actions.py | 5 ++--- config/vsc_hortense.py | 6 +++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/config/github_actions.py b/config/github_actions.py index 7b1810f8..f5539aa2 100644 --- a/config/github_actions.py +++ b/config/github_actions.py @@ -36,8 +36,7 @@ { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job - 'keep_stage_files': True, - } - ], + } + ], 'logging': common_logging_config, } diff --git a/config/vsc_hortense.py b/config/vsc_hortense.py index 1e127440..161673a7 100644 --- a/config/vsc_hortense.py +++ b/config/vsc_hortense.py @@ -41,6 +41,7 @@ def command(self, job): 'num_cpus': 128, 'num_sockets': 2, 'num_cpus_per_socket': 64, + 'num_cpus_per_core': 1, 'arch': 'zen2', }, 'features': [ @@ -60,6 +61,7 @@ def command(self, job): 'num_cpus': 128, 'num_sockets': 2, 'num_cpus_per_socket': 64, + 'num_cpus_per_core': 1, 'arch': 'zen2', }, 'features': [ @@ -79,6 +81,7 @@ def command(self, job): 'num_cpus': 128, 'num_sockets': 2, 'num_cpus_per_socket': 64, + 'num_cpus_per_core': 1, 'arch': 'zen3', }, 'features': [ @@ -98,6 +101,7 @@ def command(self, job): 'num_cpus': 48, 'num_sockets': 2, 'num_cpus_per_socket': 24, + 'num_cpus_per_core': 1, 'arch': 'zen2', }, 'features': [ @@ -133,6 +137,7 @@ def command(self, job): 'num_cpus': 48, 'num_sockets': 2, 'num_cpus_per_socket': 24, + 'num_cpus_per_core': 1, 'arch': 'zen2', }, 'features': [ @@ -190,7 +195,6 @@ def command(self, job): { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job - 'keep_stage_files': True, } ], 'logging': common_logging_config, From 5d5ba7f9ed739151546ba2c5aea43a1f4d1ffd40 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Tue, 29 Aug 2023 21:42:47 +0200 Subject: [PATCH 09/37] add save_log_files to config files --- config/aws_citc.py | 1 + config/github_actions.py | 1 + config/izum_vega.py | 1 + config/settings_example.py | 3 +++ config/surf_snellius.py | 1 + config/vsc_hortense.py | 1 + scripts/run_reframe.sh | 1 - 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/config/aws_citc.py b/config/aws_citc.py index f135b5dc..e2740ac3 100644 --- a/config/aws_citc.py +++ b/config/aws_citc.py @@ -120,6 +120,7 @@ 'general': [ { 'remote_detect': True, + 'save_log_files': True, } ], } diff --git a/config/github_actions.py b/config/github_actions.py index f5539aa2..15df611f 100644 --- a/config/github_actions.py +++ b/config/github_actions.py @@ -36,6 +36,7 @@ { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job + 'save_log_files': True, } ], 'logging': common_logging_config, diff --git a/config/izum_vega.py b/config/izum_vega.py index f043a0e1..640ec216 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -14,6 +14,7 @@ # Enable automatic detection of CPU architecture for each partition # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information 'remote_detect': True, + 'save_log_files': True, } ], 'systems': [ diff --git a/config/settings_example.py b/config/settings_example.py index fd4ae764..d280f8e8 100644 --- a/config/settings_example.py +++ b/config/settings_example.py @@ -79,6 +79,9 @@ }, ], 'logging': common_logging_config, + 'general': { + 'save_log_files': True, # copy ReFrame file logs to /output on exit + }, } # optional logging to syslog diff --git a/config/surf_snellius.py b/config/surf_snellius.py index bf0a2fe6..20322be3 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -73,6 +73,7 @@ # 1. The launchers to srun # 2. Add --exclusive to GPU 'access' field above (avoids submission error that no GPUs are requested) 'remote_detect': True, + 'save_log_files': True, } ], } diff --git a/config/vsc_hortense.py b/config/vsc_hortense.py index 161673a7..3aa0af4f 100644 --- a/config/vsc_hortense.py +++ b/config/vsc_hortense.py @@ -195,6 +195,7 @@ def command(self, job): { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job + 'save_log_files': True, } ], 'logging': common_logging_config, diff --git a/scripts/run_reframe.sh b/scripts/run_reframe.sh index 748ce5f4..b4b6f20c 100755 --- a/scripts/run_reframe.sh +++ b/scripts/run_reframe.sh @@ -51,7 +51,6 @@ options=( --tag CI ${TAGS} --run --performance-report - --save-log-files # copy ReFrame file logs to /output on exit ) reframe "${options[@]}" From ecb3fc5412c366fe872da5ff99bfb35296157f0b Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen <33718780+casparvl@users.noreply.github.com> Date: Thu, 31 Aug 2023 17:09:18 +0200 Subject: [PATCH 10/37] Update eessi/testsuite/utils.py Co-authored-by: Sam Moors --- eessi/testsuite/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eessi/testsuite/utils.py b/eessi/testsuite/utils.py index a18c19fa..a6fd2478 100644 --- a/eessi/testsuite/utils.py +++ b/eessi/testsuite/utils.py @@ -84,7 +84,7 @@ def find_modules(regex: str, name_only = True) -> Iterator[str]: find_modules('gompi$') => [gompi/2022a] find_modules('gompi', name_only = False) => [gompic/2022a, gompi/2022a, CGAL/4.14.3-gompi-2022a] find_modules('^gompi', name_only = False) => [gompic/2022a, gompi/2022a] - find_modules('^gompi\/', name_only = False) => [gompi/2022a] + find_modules('^gompi/', name_only = False) => [gompi/2022a] find_modules('-gompi-2022a', name_only = False) => [CGAL/4.14.3-gompi-2022a] """ From 0071c7b6cbabf7881bc8ff1189fb6d0baaab3f81 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen <33718780+casparvl@users.noreply.github.com> Date: Thu, 31 Aug 2023 17:09:50 +0200 Subject: [PATCH 11/37] Apply style suggestions from code review Co-authored-by: Sam Moors --- eessi/testsuite/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eessi/testsuite/utils.py b/eessi/testsuite/utils.py index a6fd2478..e75d7eb6 100644 --- a/eessi/testsuite/utils.py +++ b/eessi/testsuite/utils.py @@ -57,14 +57,14 @@ def is_cuda_required_module(module_name: str) -> bool: return requires_cuda -def find_modules(regex: str, name_only = True) -> Iterator[str]: +def find_modules(regex: str, name_only=True) -> Iterator[str]: """ Return all modules matching the regular expression regex. Note that since we use re.search, a module matches if the regex matches the module name at any place. I.e. the match does not have to be at the start of the smodule name Arguments: - - regex: a regular expresion + - regex: a regular expression - name_only: regular expressions will only be matched on the module name, not the version (default: True). Note: the name_only feature assumes anything after the last forward '/' is the version, From 65a25186d622c81ce5d997b6107f078b8f37cf94 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Thu, 31 Aug 2023 17:15:42 +0200 Subject: [PATCH 12/37] Added suggested stripping of trailing slashes in case we do matching with name_only=True --- eessi/testsuite/utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eessi/testsuite/utils.py b/eessi/testsuite/utils.py index ed6c611d..a754c2cf 100644 --- a/eessi/testsuite/utils.py +++ b/eessi/testsuite/utils.py @@ -102,6 +102,8 @@ def find_modules(regex: str, name_only = True) -> Iterator[str]: # The thing we yield should always be the original module name (orig_mod), including version orig_mod = mod if name_only: + # Remove trailing slashes from the regex (in case the callee forgot) + regex = regex.rstrip('/') # Remove part after the last forward slash, as we assume this is the version mod = re.sub('\/[^\/]*$', '', mod) # Match the actual regular expression From 902c3ba6adfecc50653a47b866cf08a6600fc450 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Wed, 6 Sep 2023 14:54:45 +0200 Subject: [PATCH 13/37] Set prefix for Snellius as well --- config/surf_snellius.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 20322be3..c9896376 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -3,6 +3,9 @@ from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import * # noqa: F403 +# This config will write all staging, output (and logging with --save-log-files) to subdirs under this prefix +# Override with --prefix +reframe_prefix = f'{os.environ.get("HOME")}/reframe_runs' # This is an example configuration file site_configuration = { @@ -12,6 +15,7 @@ 'descr': 'Dutch National Supercomputer', 'modules_system': 'lmod', 'hostnames': ['int*', 'tcn*', 'hcn*', 'fcn*', 'gcn*', 'srv*'], + 'prefix': reframe_prefix, 'stagedir': f'/scratch-shared/{os.environ.get("USER")}/reframe_output/staging', 'partitions': [ { From b3ea0c32fe1324de12b551ca8d48628082dede09 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Tue, 12 Sep 2023 09:13:43 +0200 Subject: [PATCH 14/37] use absolute paths for file logs to directly save in prefix --- README.md | 3 +- config/aws_citc.py | 8 ++-- config/github_actions.py | 3 +- config/izum_vega.py | 8 ++-- config/settings_example.py | 5 +-- config/surf_snellius.py | 3 +- config/vsc_hortense.py | 3 +- eessi/testsuite/common_config.py | 70 +++++++++++++++++++------------- 8 files changed, 52 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index dae68a6f..d67095d3 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,11 @@ cd /path/to/EESSI/test-suite module load ReFrame/4.2.0 export PYTHONPATH=$PWD:$PYTHONPATH +export RFM_PREFIX= reframe \ --config-file \ --checkpath eessi/testsuite/tests/apps \ - --prefix \ - --save-log-files \ --tag CI --tag 1_node \ --run --performance-report ``` diff --git a/config/aws_citc.py b/config/aws_citc.py index e2740ac3..c0004e09 100644 --- a/config/aws_citc.py +++ b/config/aws_citc.py @@ -16,9 +16,8 @@ from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import FEATURES -# This config will write all staging, output (and logging with --save-log-files) to subdirs under this prefix -# Override with --prefix -reframe_prefix = f'{os.environ.get("HOME")}/reframe_runs' +# This config will write all staging, output and logging to subdirs under this prefix +reframe_prefix = os.path.join(os.environ['HOME'], 'reframe_runs') # AWS CITC site configuration site_configuration = { @@ -116,11 +115,10 @@ 'ftn': '', }, ], - 'logging': common_logging_config, + 'logging': common_logging_config(reframe_prefix), 'general': [ { 'remote_detect': True, - 'save_log_files': True, } ], } diff --git a/config/github_actions.py b/config/github_actions.py index 15df611f..68c55072 100644 --- a/config/github_actions.py +++ b/config/github_actions.py @@ -36,8 +36,7 @@ { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job - 'save_log_files': True, } ], - 'logging': common_logging_config, + 'logging': common_logging_config(), } diff --git a/config/izum_vega.py b/config/izum_vega.py index 640ec216..8d34c1ae 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -3,9 +3,8 @@ from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import * # noqa: F403 -# This config will write all staging, output (and logging with --save-log-files) to subdirs under this prefix -# Override with --prefix -reframe_prefix = f'{os.environ.get("HOME")}/reframe_runs' +# This config will write all staging, output and logging to subdirs under this prefix +reframe_prefix = os.path.join(os.environ['HOME'], 'reframe_runs') # This is an example configuration file site_configuration = { @@ -14,7 +13,6 @@ # Enable automatic detection of CPU architecture for each partition # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information 'remote_detect': True, - 'save_log_files': True, } ], 'systems': [ @@ -94,5 +92,5 @@ 'ftn': '', }, ], - 'logging': common_logging_config, + 'logging': common_logging_config(reframe_prefix), } diff --git a/config/settings_example.py b/config/settings_example.py index d280f8e8..af910605 100644 --- a/config/settings_example.py +++ b/config/settings_example.py @@ -78,10 +78,7 @@ 'ftn': '', }, ], - 'logging': common_logging_config, - 'general': { - 'save_log_files': True, # copy ReFrame file logs to /output on exit - }, + 'logging': common_logging_config(), } # optional logging to syslog diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 20322be3..43c53597 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -66,14 +66,13 @@ 'ftn': '', }, ], - 'logging': common_logging_config, + 'logging': common_logging_config(), 'general': [ { # For autodetect to work, temporarily change: # 1. The launchers to srun # 2. Add --exclusive to GPU 'access' field above (avoids submission error that no GPUs are requested) 'remote_detect': True, - 'save_log_files': True, } ], } diff --git a/config/vsc_hortense.py b/config/vsc_hortense.py index 3aa0af4f..270cd66d 100644 --- a/config/vsc_hortense.py +++ b/config/vsc_hortense.py @@ -195,8 +195,7 @@ def command(self, job): { 'purge_environment': True, 'resolve_module_conflicts': False, # avoid loading the module before submitting the job - 'save_log_files': True, } ], - 'logging': common_logging_config, + 'logging': common_logging_config(), } diff --git a/eessi/testsuite/common_config.py b/eessi/testsuite/common_config.py index 5e95ba9e..5fd2c816 100644 --- a/eessi/testsuite/common_config.py +++ b/eessi/testsuite/common_config.py @@ -1,3 +1,5 @@ +import os + perflog_format = '|'.join([ '%(check_job_completion_time)s', '%(osuser)s', @@ -27,32 +29,42 @@ '' # final delimiter required ]) -common_logging_config = [{ - 'level': 'debug', - 'handlers': [ - { - 'type': 'stream', - 'name': 'stdout', - 'level': 'info', - 'format': '%(message)s', - }, - { - 'type': 'file', - 'name': 'reframe.log', - 'level': 'debug', - 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', - 'append': True, - 'timestamp': "%Y%m%d_%H%M%S", # add a timestamp to the filename (reframe_.log) - }, - ], - 'handlers_perflog': [ - { - 'type': 'filelog', - 'prefix': '%(check_system)s/%(check_partition)s', - 'level': 'info', - 'format': perflog_format, - 'format_perfvars': format_perfvars, - 'append': True, # avoid overwriting - }, - ], -}] + +def common_logging_config(prefix=None): + """ + return default logging configuration as a list: stdout, file log, perflog + :param prefix: file log prefix + """ + prefix = os.getenv('RFM_PREFIX', prefix if prefix else '.') + + os.makedirs(os.path.join(prefix, 'log'), exist_ok=True) + + return [{ + 'level': 'debug', + 'handlers': [ + { + 'type': 'stream', + 'name': 'stdout', + 'level': 'info', + 'format': '%(message)s', + }, + { + 'type': 'file', + 'name': os.path.join(prefix, 'log', 'reframe.log'), + 'level': 'debug', + 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', + 'append': True, + 'timestamp': "%Y%m%d_%H%M%S", # add a timestamp to the filename (reframe_.log) + }, + ], + 'handlers_perflog': [ + { + 'type': 'filelog', + 'prefix': '%(check_system)s/%(check_partition)s', + 'level': 'info', + 'format': perflog_format, + 'format_perfvars': format_perfvars, + 'append': True, # avoid overwriting + }, + ], + }] From 37b9592bc0fe4c423b2475594e8388d1a216f886 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Tue, 12 Sep 2023 09:32:32 +0200 Subject: [PATCH 15/37] path style --- config/surf_snellius.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 9afdb885..a8ca124f 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -3,9 +3,8 @@ from eessi.testsuite.common_config import common_logging_config from eessi.testsuite.constants import * # noqa: F403 -# This config will write all staging, output (and logging with --save-log-files) to subdirs under this prefix -# Override with --prefix -reframe_prefix = f'{os.environ.get("HOME")}/reframe_runs' +# This config will write all staging, output and logging to subdirs under this prefix +reframe_prefix = os.path.join(os.environ['HOME'], 'reframe_runs') # This is an example configuration file site_configuration = { From 352e028f3b703fae6c11df946b98e83e0c92653f Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Tue, 12 Sep 2023 09:48:31 +0200 Subject: [PATCH 16/37] add back/update override comment --- config/aws_citc.py | 1 + config/izum_vega.py | 1 + config/surf_snellius.py | 1 + 3 files changed, 3 insertions(+) diff --git a/config/aws_citc.py b/config/aws_citc.py index c0004e09..1141291d 100644 --- a/config/aws_citc.py +++ b/config/aws_citc.py @@ -17,6 +17,7 @@ from eessi.testsuite.constants import FEATURES # This config will write all staging, output and logging to subdirs under this prefix +# Override with RFM_PREFIX environment variable reframe_prefix = os.path.join(os.environ['HOME'], 'reframe_runs') # AWS CITC site configuration diff --git a/config/izum_vega.py b/config/izum_vega.py index 8d34c1ae..51300d25 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -4,6 +4,7 @@ from eessi.testsuite.constants import * # noqa: F403 # This config will write all staging, output and logging to subdirs under this prefix +# Override with RFM_PREFIX environment variable reframe_prefix = os.path.join(os.environ['HOME'], 'reframe_runs') # This is an example configuration file diff --git a/config/surf_snellius.py b/config/surf_snellius.py index a8ca124f..f1344ffb 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -4,6 +4,7 @@ from eessi.testsuite.constants import * # noqa: F403 # This config will write all staging, output and logging to subdirs under this prefix +# Override with RFM_PREFIX environment variable reframe_prefix = os.path.join(os.environ['HOME'], 'reframe_runs') # This is an example configuration file From 6c290a19b4079f3c158aecaddd0353791c0189c2 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Wed, 13 Sep 2023 18:21:07 +0200 Subject: [PATCH 17/37] use logs rather than log --- eessi/testsuite/common_config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eessi/testsuite/common_config.py b/eessi/testsuite/common_config.py index 5fd2c816..4fef1a2f 100644 --- a/eessi/testsuite/common_config.py +++ b/eessi/testsuite/common_config.py @@ -36,8 +36,8 @@ def common_logging_config(prefix=None): :param prefix: file log prefix """ prefix = os.getenv('RFM_PREFIX', prefix if prefix else '.') - - os.makedirs(os.path.join(prefix, 'log'), exist_ok=True) + logdir = os.path.join(prefix, 'logs') + os.makedirs(logdir, exist_ok=True) return [{ 'level': 'debug', @@ -50,7 +50,7 @@ def common_logging_config(prefix=None): }, { 'type': 'file', - 'name': os.path.join(prefix, 'log', 'reframe.log'), + 'name': os.path.join(logdir, 'reframe.log'), 'level': 'debug', 'format': '[%(asctime)s] %(levelname)s: %(check_info)s: %(message)s', 'append': True, From fd5f077bce3378e38b3f1363ed093f18451d9f3f Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Mon, 18 Sep 2023 15:55:16 +0200 Subject: [PATCH 18/37] pass prefix to common_logging_config for snellius --- config/surf_snellius.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index f1344ffb..72aad234 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -70,7 +70,7 @@ 'ftn': '', }, ], - 'logging': common_logging_config(), + 'logging': common_logging_config(reframe_prefix), 'general': [ { # For autodetect to work, temporarily change: From 46d6b2bd6372128c8780cb53c1b9a0c02a26100b Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 12:32:43 +0200 Subject: [PATCH 19/37] Added new genoa partition. Renamed thin to rome, as the thin partition will be deprecated --- config/surf_snellius.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 72aad234..71c55a3c 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -19,18 +19,32 @@ 'stagedir': f'/scratch-shared/{os.environ.get("USER")}/reframe_output/staging', 'partitions': [ { - 'name': 'thin', + 'name': 'rome', 'scheduler': 'slurm', 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'launcher': 'mpirun', - 'access': ['-p thin', '--export=None'], + 'access': ['-p rome', '--export=None'], 'environs': ['default'], 'max_jobs': 120, 'features': [ FEATURES[CPU], ], - 'descr': 'Test CPU partition with native EESSI stack' + 'descr': 'AMD Rome CPU partition with native EESSI stack' }, + { + 'name': 'genoa', + 'scheduler': 'slurm', + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], + 'launcher': 'mpirun', + 'access': ['-p genoa', '--export=None'], + 'environs': ['default'], + 'max_jobs': 120, + 'features': [ + FEATURES[CPU], + ], + 'descr': 'AMD Genoa CPU partition with native EESSI stack' + }, + { 'name': 'gpu', 'scheduler': 'slurm', @@ -57,7 +71,7 @@ 'extras': { GPU_VENDOR: GPU_VENDORS[NVIDIA], }, - 'descr': 'Test GPU partition with native EESSI stack' + 'descr': 'Nvidia A100 GPU partition with native EESSI stack' }, ] }, From 194dbfc462d57c791c68616ffa8a39c76f165cda Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 12:40:56 +0200 Subject: [PATCH 20/37] Added comment about autodetect for ReFrame 4.3.3, since a change of the launcher is not needed there anymore. It doesn't use a launcher anymore, just executes locally, since it's serial code anyway --- config/surf_snellius.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 71c55a3c..917f8e0f 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -88,7 +88,7 @@ 'general': [ { # For autodetect to work, temporarily change: - # 1. The launchers to srun + # 1. The launchers to srun (or use ReFrame >= 4.3.3) # 2. Add --exclusive to GPU 'access' field above (avoids submission error that no GPUs are requested) 'remote_detect': True, } From 76f6d4daf42f1d831a85a031e68d008f50359ce0 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 13:09:10 +0200 Subject: [PATCH 21/37] Changed comment for CPU autodetect. I'll move this up for other configs as well --- config/surf_snellius.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 917f8e0f..1059b9a5 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -1,3 +1,12 @@ +# WARNING: for CPU autodetect to work correctly you need to +# 1. Either use ReFrame >= 4.3.3 _or_ temporarily change the 'launcher' for each partition to srun +# 2. Temporarily change the 'access' field for the GPU partition to +# 'access': ['-p gpu', '--export=None', '--exclusive'], + +# Without this, the autodetect job fails because +# a missing mpirun command (change #1) +# Snellius doesn't allow submission to the GPU partition without requesting at least one GPU (change #2) + import os from eessi.testsuite.common_config import common_logging_config @@ -87,9 +96,8 @@ 'logging': common_logging_config(reframe_prefix), 'general': [ { - # For autodetect to work, temporarily change: - # 1. The launchers to srun (or use ReFrame >= 4.3.3) - # 2. Add --exclusive to GPU 'access' field above (avoids submission error that no GPUs are requested) + # Enable automatic detection of CPU architecture for each partition + # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information 'remote_detect': True, } ], From 2f411e9c3d3c4bc228f55039eb5685c4a6e1af26 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 13:13:25 +0200 Subject: [PATCH 22/37] Changed comments for CPU autodetection in Vega --- config/izum_vega.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/config/izum_vega.py b/config/izum_vega.py index 51300d25..500bff09 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -1,3 +1,12 @@ +# WARNING: for CPU autodetect to work correctly you need to +# 1. Either use ReFrame >= 4.3.3 _or_ temporarily change the 'launcher' for each partition to srun +# 2. Temporarily change the 'access' field for the GPU partition to +# 'access': ['-p gpu', '--export=None', '--gres=gpu:1'], + +# Without this, the autodetect job fails because +# a missing mpirun command (change #1) +# Vega doesn't allow submission to the GPU partition without requesting at least one GPU (change #2) + import os from eessi.testsuite.common_config import common_logging_config @@ -37,7 +46,7 @@ # Can be taken out once we don't care about old OpenMPI versions anymore (pre-4.1.1) 'export OMPI_MCA_pml=ucx', ], - 'launcher': 'mpirun', # Needs to be temporarily changed to srun for cpu autodetection + 'launcher': 'mpirun', # Use --export=None to avoid that login environment is passed down to submitted jobs 'access': ['-p cpu', '--export=None'], 'environs': ['default'], @@ -60,7 +69,7 @@ # Can be taken out once we don't care about old OpenMPI versions anymore (pre-4.1.1) 'export OMPI_MCA_pml=ucx', ], - 'launcher': 'mpirun', # Needs to be temporarily changed to srun for cpu autodetection + 'launcher': 'mpirun', # Use --export=None to avoid that login environment is passed down to submitted jobs 'access': ['-p gpu', '--export=None'], 'environs': ['default'], From 44b815b3bb6b4f0e0f642d52215229c83becbdcc Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 13:24:20 +0200 Subject: [PATCH 23/37] Added required changes for CPU autodetection --- config/aws_citc.py | 19 +++++++++---------- config/izum_vega.py | 14 ++++++++++---- config/surf_snellius.py | 14 ++++++++++---- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/config/aws_citc.py b/config/aws_citc.py index 1141291d..7b411fd5 100644 --- a/config/aws_citc.py +++ b/config/aws_citc.py @@ -1,15 +1,14 @@ -# This is an example configuration file +# WARNING: for CPU autodetect to work correctly you need to +# 1. Either use ReFrame >= 4.3.3 or temporarily change the 'launcher' for each partition to srun +# 2. Either use ReFrame >= 4.3.3 or run from a clone of the ReFrame repository -# Note that CPU autodetect currently does not work with this configuration file on AWS. -# This is because there is no system mpirun, and the CPU autodetection doesn't load any modules -# that would make an mpirun command available (as normal multiprocessing tests would). -# In order to do CPU autodetection, you'll need to change the launcer to srun: -# 'launcher = srun' -# You can run the CPU autodetect by listing all tests (reframe -l ...) -# and then, once all CPUs are autodetected, change the launcher back to mpirun for a 'real' run (reframe -r ...) +# Without this, the autodetect job fails because +# 1. A missing mpirun command +# 2. An incorrect directory structure is assumed when preparing the stagedir for the autodetect job -# Another known issue is that CPU autodetection fails if run from an actual installation of ReFrame. -# It only works if run from a clone of their Github Repo. See https://github.com/reframe-hpc/reframe/issues/2914 +# Related issues +# 1. https://github.com/reframe-hpc/reframe/issues/2926 +# 2. https://github.com/reframe-hpc/reframe/issues/2914 import os diff --git a/config/izum_vega.py b/config/izum_vega.py index 500bff09..1fb9ecd5 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -1,11 +1,17 @@ # WARNING: for CPU autodetect to work correctly you need to -# 1. Either use ReFrame >= 4.3.3 _or_ temporarily change the 'launcher' for each partition to srun -# 2. Temporarily change the 'access' field for the GPU partition to +# 1. Either use ReFrame >= 4.3.3 or temporarily change the 'launcher' for each partition to srun +# 2. Either use ReFrame >= 4.3.3 or run from a clone of the ReFrame repository +# 3. Temporarily change the 'access' field for the GPU partition to # 'access': ['-p gpu', '--export=None', '--gres=gpu:1'], # Without this, the autodetect job fails because -# a missing mpirun command (change #1) -# Vega doesn't allow submission to the GPU partition without requesting at least one GPU (change #2) +# 1. A missing mpirun command +# 2. An incorrect directory structure is assumed when preparing the stagedir for the autodetect job +# 3. Vega doesn't allow submission to the GPU partition without requesting at least one GPU (change #2) + +# Related issues +# 1. https://github.com/reframe-hpc/reframe/issues/2926 +# 2. https://github.com/reframe-hpc/reframe/issues/2914 import os diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 1059b9a5..d15d2a6d 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -1,11 +1,17 @@ # WARNING: for CPU autodetect to work correctly you need to -# 1. Either use ReFrame >= 4.3.3 _or_ temporarily change the 'launcher' for each partition to srun -# 2. Temporarily change the 'access' field for the GPU partition to +# 1. Either use ReFrame >= 4.3.3 or temporarily change the 'launcher' for each partition to srun +# 2. Either use ReFrame >= 4.3.3 or run from a clone of the ReFrame repository +# 3. Temporarily change the 'access' field for the GPU partition to # 'access': ['-p gpu', '--export=None', '--exclusive'], # Without this, the autodetect job fails because -# a missing mpirun command (change #1) -# Snellius doesn't allow submission to the GPU partition without requesting at least one GPU (change #2) +# 1. A missing mpirun command +# 2. An incorrect directory structure is assumed when preparing the stagedir for the autodetect job +# 3. Snellius doesn't allow submission to the GPU partition without requesting at least one GPU + +# Related issues +# 1. https://github.com/reframe-hpc/reframe/issues/2926 +# 2. https://github.com/reframe-hpc/reframe/issues/2914 import os From 08eff9a0afe14a00c084326de5b4c391eaa2f9d1 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 13:26:08 +0200 Subject: [PATCH 24/37] Move the autodetect setting to the top --- config/surf_snellius.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/config/surf_snellius.py b/config/surf_snellius.py index d15d2a6d..966807a8 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -24,6 +24,13 @@ # This is an example configuration file site_configuration = { + 'general': [ + { + # Enable automatic detection of CPU architecture for each partition + # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information + 'remote_detect': True, + } + ], 'systems': [ { 'name': 'snellius', @@ -100,11 +107,4 @@ }, ], 'logging': common_logging_config(reframe_prefix), - 'general': [ - { - # Enable automatic detection of CPU architecture for each partition - # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information - 'remote_detect': True, - } - ], } From 3bcee8477a61bbd3de796dbd59a77f6b4d247f40 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 13:31:56 +0200 Subject: [PATCH 25/37] Added comment on CPU autodetect to settings_example. Moved all autodetect settings to the end of the config --- config/aws_citc.py | 8 ++------ config/izum_vega.py | 14 +++++++------- config/settings_example.py | 23 +++++++++++++++++++++++ config/surf_snellius.py | 14 +++++++------- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/config/aws_citc.py b/config/aws_citc.py index 7b411fd5..6bd44062 100644 --- a/config/aws_citc.py +++ b/config/aws_citc.py @@ -118,6 +118,8 @@ 'logging': common_logging_config(reframe_prefix), 'general': [ { + # Enable automatic detection of CPU architecture for each partition + # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information 'remote_detect': True, } ], @@ -126,12 +128,6 @@ # Add default things to each partition: partition_defaults = { 'scheduler': 'squeue', - # mpirun causes problems with cpu autodetect, since there is no system mpirun. - # See https://github.com/EESSI/test-suite/pull/53#issuecomment-1590849226 - # and this feature request https://github.com/reframe-hpc/reframe/issues/2926 - # However, using srun requires either using pmix or proper pmi2 integration in the MPI library - # See https://github.com/EESSI/test-suite/pull/53#issuecomment-1598753968 - # Thus, we use mpirun for now, and manually swap to srun if we want to autodetect CPUs... 'launcher': 'mpirun', 'environs': ['default'], 'features': [ diff --git a/config/izum_vega.py b/config/izum_vega.py index 1fb9ecd5..ca3e2179 100644 --- a/config/izum_vega.py +++ b/config/izum_vega.py @@ -24,13 +24,6 @@ # This is an example configuration file site_configuration = { - 'general': [ - { - # Enable automatic detection of CPU architecture for each partition - # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information - 'remote_detect': True, - } - ], 'systems': [ { 'name': 'vega', @@ -109,4 +102,11 @@ }, ], 'logging': common_logging_config(reframe_prefix), + 'general': [ + { + # Enable automatic detection of CPU architecture for each partition + # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information + 'remote_detect': True, + } + ], } diff --git a/config/settings_example.py b/config/settings_example.py index af910605..219efbcd 100644 --- a/config/settings_example.py +++ b/config/settings_example.py @@ -1,3 +1,19 @@ +# WARNING: for CPU autodetect to work correctly you need to +# 1. Either use ReFrame >= 4.3.3 or temporarily change the 'launcher' for each partition to srun +# 2. Either use ReFrame >= 4.3.3 or run from a clone of the ReFrame repository +# If your system has a GPU partition, it might force jobs to request at least one GPU. If that is the +# case, you also need to temporarily change 'access' field for the GPU partition to include the request +# for one GPU, e.g. 'access': ['-p gpu', '--export=None', '--gres=gpu:1'], + +# Without this, the autodetect job fails because +# 1. A missing mpirun command +# 2. An incorrect directory structure is assumed when preparing the stagedir for the autodetect job + +# Related issues +# 1. https://github.com/reframe-hpc/reframe/issues/2926 +# 2. https://github.com/reframe-hpc/reframe/issues/2914 + + """ Example configuration file """ @@ -79,6 +95,13 @@ }, ], 'logging': common_logging_config(), + 'general': [ + { + # Enable automatic detection of CPU architecture for each partition + # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information + 'remote_detect': True, + } + ], } # optional logging to syslog diff --git a/config/surf_snellius.py b/config/surf_snellius.py index 966807a8..d15d2a6d 100644 --- a/config/surf_snellius.py +++ b/config/surf_snellius.py @@ -24,13 +24,6 @@ # This is an example configuration file site_configuration = { - 'general': [ - { - # Enable automatic detection of CPU architecture for each partition - # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information - 'remote_detect': True, - } - ], 'systems': [ { 'name': 'snellius', @@ -107,4 +100,11 @@ }, ], 'logging': common_logging_config(reframe_prefix), + 'general': [ + { + # Enable automatic detection of CPU architecture for each partition + # See https://reframe-hpc.readthedocs.io/en/stable/configure.html#auto-detecting-processor-information + 'remote_detect': True, + } + ], } From ec22a9a9d8d8861018503e13c56e6c562016514d Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 17:12:36 +0200 Subject: [PATCH 26/37] Allign Settings example with instructions as we now have them in the hackmd, which _will_ become our docs... --- config/settings_example.py | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/config/settings_example.py b/config/settings_example.py index 219efbcd..314d4e50 100644 --- a/config/settings_example.py +++ b/config/settings_example.py @@ -35,33 +35,39 @@ 'partitions': [ { 'name': 'cpu_partition', + 'descr': 'CPU partition' 'scheduler': 'slurm', 'launcher': 'mpirun', - 'access': ['-p cpu'], + 'access': ['-p cpu', '--export=None'], + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'environs': ['default'], 'max_jobs': 4, - 'processor': { - 'num_cpus': 128, - 'num_sockets': 2, - 'num_cpus_per_socket': 64, - 'arch': 'zen2', - }, + # We recommend to rely on ReFrame's CPU autodetection, + # and only define the 'processor' field if autodetection fails + # 'processor': { + # 'num_cpus': 128, + # 'num_sockets': 2, + # 'num_cpus_per_socket': 64, + # 'num_cpus_per_core': 1, + # }, 'features': [FEATURES[CPU]], - 'descr': 'CPU partition' }, { 'name': 'gpu_partition', 'scheduler': 'slurm', 'launcher': 'mpirun', - 'access': ['-p gpu'], + 'access': ['-p gpu', '--export=None'], + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'environs': ['default'], 'max_jobs': 4, - 'processor': { - 'num_cpus': 72, - 'num_sockets': 2, - 'num_cpus_per_socket': 36, - 'arch': 'icelake', - }, + # We recommend to rely on ReFrame's CPU autodetection, + # and only define the 'processor' field if autodetection fails + # 'processor': { + # 'num_cpus': 72, + # 'num_sockets': 2, + # 'num_cpus_per_socket': 36, + # 'num_cpus_per_core': 1, + # }, 'resources': [ { 'name': '_rfm_gpu', From 33199ddc2e0ea2a00da5c6774c6f0183fbc66329 Mon Sep 17 00:00:00 2001 From: Caspar van Leeuwen Date: Tue, 19 Sep 2023 18:03:08 +0200 Subject: [PATCH 27/37] Moved GPU partition description to right after the name --- config/settings_example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/settings_example.py b/config/settings_example.py index 314d4e50..c46636a5 100644 --- a/config/settings_example.py +++ b/config/settings_example.py @@ -54,6 +54,7 @@ }, { 'name': 'gpu_partition', + 'descr': 'GPU partition' 'scheduler': 'slurm', 'launcher': 'mpirun', 'access': ['-p gpu', '--export=None'], @@ -87,7 +88,6 @@ 'extras': { GPU_VENDOR: GPU_VENDORS[NVIDIA], }, - 'descr': 'GPU partition' }, ] }, From 82db6aca07cdef1ae3056f4839b3e8837611020f Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Wed, 20 Sep 2023 17:22:23 +0200 Subject: [PATCH 28/37] fix pip install for older setuptools --- pyproject.toml | 3 +-- setup.cfg | 8 ++++---- src/eessi/__init__.py | 1 + src/eessi/testsuite/__init__.py | 0 {eessi => src/eessi}/testsuite/common_config.py | 0 {eessi => src/eessi}/testsuite/constants.py | 0 {eessi => src/eessi}/testsuite/hooks.py | 0 {eessi => src/eessi}/testsuite/tests/apps/gromacs.py | 0 .../testsuite/tests/apps/tensorflow/src/mnist_setup.py | 0 .../eessi}/testsuite/tests/apps/tensorflow/src/tf_test.py | 0 .../eessi}/testsuite/tests/apps/tensorflow/tensorflow.py | 0 {eessi => src/eessi}/testsuite/utils.py | 0 12 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 src/eessi/__init__.py create mode 100644 src/eessi/testsuite/__init__.py rename {eessi => src/eessi}/testsuite/common_config.py (100%) rename {eessi => src/eessi}/testsuite/constants.py (100%) rename {eessi => src/eessi}/testsuite/hooks.py (100%) rename {eessi => src/eessi}/testsuite/tests/apps/gromacs.py (100%) rename {eessi => src/eessi}/testsuite/tests/apps/tensorflow/src/mnist_setup.py (100%) rename {eessi => src/eessi}/testsuite/tests/apps/tensorflow/src/tf_test.py (100%) rename {eessi => src/eessi}/testsuite/tests/apps/tensorflow/tensorflow.py (100%) rename {eessi => src/eessi}/testsuite/utils.py (100%) diff --git a/pyproject.toml b/pyproject.toml index 65cb01e9..c9b42b0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,5 @@ requires-python = ">=3.6" "Bug Tracker" = "https://github.com/EESSI/test-suite/issues" [tool.setuptools.packages.find] -where = ["eessi/testsuite"] +where = ["src"] include = ["eessi*"] -namespaces = true diff --git a/setup.cfg b/setup.cfg index b6329a2f..ecc8d491 100644 --- a/setup.cfg +++ b/setup.cfg @@ -13,11 +13,11 @@ project_urls = install_requires = setuptools python_requires = >=3.6 -packages = find: package_dir = - =eessi/testsuite + =src +packages = find: +namespace_packages = eessi [options.packages.find] -where = eessi/testsuite +where = src include = eessi* -namespaces = true diff --git a/src/eessi/__init__.py b/src/eessi/__init__.py new file mode 100644 index 00000000..5284146e --- /dev/null +++ b/src/eessi/__init__.py @@ -0,0 +1 @@ +__import__("pkg_resources").declare_namespace(__name__) diff --git a/src/eessi/testsuite/__init__.py b/src/eessi/testsuite/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/eessi/testsuite/common_config.py b/src/eessi/testsuite/common_config.py similarity index 100% rename from eessi/testsuite/common_config.py rename to src/eessi/testsuite/common_config.py diff --git a/eessi/testsuite/constants.py b/src/eessi/testsuite/constants.py similarity index 100% rename from eessi/testsuite/constants.py rename to src/eessi/testsuite/constants.py diff --git a/eessi/testsuite/hooks.py b/src/eessi/testsuite/hooks.py similarity index 100% rename from eessi/testsuite/hooks.py rename to src/eessi/testsuite/hooks.py diff --git a/eessi/testsuite/tests/apps/gromacs.py b/src/eessi/testsuite/tests/apps/gromacs.py similarity index 100% rename from eessi/testsuite/tests/apps/gromacs.py rename to src/eessi/testsuite/tests/apps/gromacs.py diff --git a/eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py b/src/eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py similarity index 100% rename from eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py rename to src/eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py diff --git a/eessi/testsuite/tests/apps/tensorflow/src/tf_test.py b/src/eessi/testsuite/tests/apps/tensorflow/src/tf_test.py similarity index 100% rename from eessi/testsuite/tests/apps/tensorflow/src/tf_test.py rename to src/eessi/testsuite/tests/apps/tensorflow/src/tf_test.py diff --git a/eessi/testsuite/tests/apps/tensorflow/tensorflow.py b/src/eessi/testsuite/tests/apps/tensorflow/tensorflow.py similarity index 100% rename from eessi/testsuite/tests/apps/tensorflow/tensorflow.py rename to src/eessi/testsuite/tests/apps/tensorflow/tensorflow.py diff --git a/eessi/testsuite/utils.py b/src/eessi/testsuite/utils.py similarity index 100% rename from eessi/testsuite/utils.py rename to src/eessi/testsuite/utils.py From abd73846873248c087282df026c299d236d0b8b1 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Wed, 20 Sep 2023 17:43:36 +0200 Subject: [PATCH 29/37] make sure all subdirs are installed --- src/eessi/testsuite/tests/__init__.py | 0 src/eessi/testsuite/tests/apps/__init__.py | 0 src/eessi/testsuite/tests/apps/tensorflow/__init__.py | 0 src/eessi/testsuite/tests/apps/tensorflow/src/__init__.py | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/eessi/testsuite/tests/__init__.py create mode 100644 src/eessi/testsuite/tests/apps/__init__.py create mode 100644 src/eessi/testsuite/tests/apps/tensorflow/__init__.py create mode 100644 src/eessi/testsuite/tests/apps/tensorflow/src/__init__.py diff --git a/src/eessi/testsuite/tests/__init__.py b/src/eessi/testsuite/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/eessi/testsuite/tests/apps/__init__.py b/src/eessi/testsuite/tests/apps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/eessi/testsuite/tests/apps/tensorflow/__init__.py b/src/eessi/testsuite/tests/apps/tensorflow/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/eessi/testsuite/tests/apps/tensorflow/src/__init__.py b/src/eessi/testsuite/tests/apps/tensorflow/src/__init__.py new file mode 100644 index 00000000..e69de29b From 160b66b04b9d07265df5b7d195185a7e9fc46732 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Wed, 20 Sep 2023 18:03:46 +0200 Subject: [PATCH 30/37] move back out of src --- {src/eessi => eessi}/__init__.py | 0 {src/eessi => eessi}/testsuite/__init__.py | 0 {src/eessi => eessi}/testsuite/common_config.py | 0 {src/eessi => eessi}/testsuite/constants.py | 0 {src/eessi => eessi}/testsuite/hooks.py | 0 {src/eessi => eessi}/testsuite/tests/__init__.py | 0 {src/eessi => eessi}/testsuite/tests/apps/__init__.py | 0 {src/eessi => eessi}/testsuite/tests/apps/gromacs.py | 0 .../testsuite/tests/apps/tensorflow/__init__.py | 0 .../testsuite/tests/apps/tensorflow/src/__init__.py | 0 .../testsuite/tests/apps/tensorflow/src/mnist_setup.py | 0 .../testsuite/tests/apps/tensorflow/src/tf_test.py | 0 .../testsuite/tests/apps/tensorflow/tensorflow.py | 0 {src/eessi => eessi}/testsuite/utils.py | 0 pyproject.toml | 1 - setup.cfg | 3 --- 16 files changed, 4 deletions(-) rename {src/eessi => eessi}/__init__.py (100%) rename {src/eessi => eessi}/testsuite/__init__.py (100%) rename {src/eessi => eessi}/testsuite/common_config.py (100%) rename {src/eessi => eessi}/testsuite/constants.py (100%) rename {src/eessi => eessi}/testsuite/hooks.py (100%) rename {src/eessi => eessi}/testsuite/tests/__init__.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/__init__.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/gromacs.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/tensorflow/__init__.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/tensorflow/src/__init__.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/tensorflow/src/mnist_setup.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/tensorflow/src/tf_test.py (100%) rename {src/eessi => eessi}/testsuite/tests/apps/tensorflow/tensorflow.py (100%) rename {src/eessi => eessi}/testsuite/utils.py (100%) diff --git a/src/eessi/__init__.py b/eessi/__init__.py similarity index 100% rename from src/eessi/__init__.py rename to eessi/__init__.py diff --git a/src/eessi/testsuite/__init__.py b/eessi/testsuite/__init__.py similarity index 100% rename from src/eessi/testsuite/__init__.py rename to eessi/testsuite/__init__.py diff --git a/src/eessi/testsuite/common_config.py b/eessi/testsuite/common_config.py similarity index 100% rename from src/eessi/testsuite/common_config.py rename to eessi/testsuite/common_config.py diff --git a/src/eessi/testsuite/constants.py b/eessi/testsuite/constants.py similarity index 100% rename from src/eessi/testsuite/constants.py rename to eessi/testsuite/constants.py diff --git a/src/eessi/testsuite/hooks.py b/eessi/testsuite/hooks.py similarity index 100% rename from src/eessi/testsuite/hooks.py rename to eessi/testsuite/hooks.py diff --git a/src/eessi/testsuite/tests/__init__.py b/eessi/testsuite/tests/__init__.py similarity index 100% rename from src/eessi/testsuite/tests/__init__.py rename to eessi/testsuite/tests/__init__.py diff --git a/src/eessi/testsuite/tests/apps/__init__.py b/eessi/testsuite/tests/apps/__init__.py similarity index 100% rename from src/eessi/testsuite/tests/apps/__init__.py rename to eessi/testsuite/tests/apps/__init__.py diff --git a/src/eessi/testsuite/tests/apps/gromacs.py b/eessi/testsuite/tests/apps/gromacs.py similarity index 100% rename from src/eessi/testsuite/tests/apps/gromacs.py rename to eessi/testsuite/tests/apps/gromacs.py diff --git a/src/eessi/testsuite/tests/apps/tensorflow/__init__.py b/eessi/testsuite/tests/apps/tensorflow/__init__.py similarity index 100% rename from src/eessi/testsuite/tests/apps/tensorflow/__init__.py rename to eessi/testsuite/tests/apps/tensorflow/__init__.py diff --git a/src/eessi/testsuite/tests/apps/tensorflow/src/__init__.py b/eessi/testsuite/tests/apps/tensorflow/src/__init__.py similarity index 100% rename from src/eessi/testsuite/tests/apps/tensorflow/src/__init__.py rename to eessi/testsuite/tests/apps/tensorflow/src/__init__.py diff --git a/src/eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py b/eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py similarity index 100% rename from src/eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py rename to eessi/testsuite/tests/apps/tensorflow/src/mnist_setup.py diff --git a/src/eessi/testsuite/tests/apps/tensorflow/src/tf_test.py b/eessi/testsuite/tests/apps/tensorflow/src/tf_test.py similarity index 100% rename from src/eessi/testsuite/tests/apps/tensorflow/src/tf_test.py rename to eessi/testsuite/tests/apps/tensorflow/src/tf_test.py diff --git a/src/eessi/testsuite/tests/apps/tensorflow/tensorflow.py b/eessi/testsuite/tests/apps/tensorflow/tensorflow.py similarity index 100% rename from src/eessi/testsuite/tests/apps/tensorflow/tensorflow.py rename to eessi/testsuite/tests/apps/tensorflow/tensorflow.py diff --git a/src/eessi/testsuite/utils.py b/eessi/testsuite/utils.py similarity index 100% rename from src/eessi/testsuite/utils.py rename to eessi/testsuite/utils.py diff --git a/pyproject.toml b/pyproject.toml index c9b42b0a..7ffffe55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,5 +18,4 @@ requires-python = ">=3.6" "Bug Tracker" = "https://github.com/EESSI/test-suite/issues" [tool.setuptools.packages.find] -where = ["src"] include = ["eessi*"] diff --git a/setup.cfg b/setup.cfg index ecc8d491..737b6e84 100644 --- a/setup.cfg +++ b/setup.cfg @@ -13,11 +13,8 @@ project_urls = install_requires = setuptools python_requires = >=3.6 -package_dir = - =src packages = find: namespace_packages = eessi [options.packages.find] -where = src include = eessi* From 44563d584fcee445536fc697a6295452eed62441 Mon Sep 17 00:00:00 2001 From: Samuel Moors Date: Thu, 21 Sep 2023 08:52:45 +0200 Subject: [PATCH 31/37] add fixed pip_install gh action --- .github/workflows/pip_install.yml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pip_install.yml b/.github/workflows/pip_install.yml index 84ad340a..1847574d 100644 --- a/.github/workflows/pip_install.yml +++ b/.github/workflows/pip_install.yml @@ -4,20 +4,33 @@ on: [push, pull_request, workflow_dispatch] permissions: read-all jobs: test_pip_install: - runs-on: ubuntu-22.04 + # ubuntu <= 20.04 is required for python 3.6 + runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: - python: ['3.6', '3.7', '3.8', '3.9', '3.10', '3.11'] + python-version: ['3.6', '3.7', '3.8', '3.9', '3.10', '3.11'] steps: - name: Check out software-layer repository uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 with: persist-credentials: false + - name: Set up Python + uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Install setuptools + run: | + if [[ "${{ matrix.python-version }}" == "3.6" ]]; then + # system installed setuptools version in RHEL8 and CO7 + python -m pip install --user setuptools==39.2.0 + fi + - name: Install ReFrame run: | - pip install --user ReFrame-HPC + python -m pip install --user ReFrame-HPC - name: Install EESSI test suite with 'pip install' run: | @@ -26,8 +39,15 @@ jobs: python setup.py sdist ls dist - pip install --user dist/eessi*.tar.gz + python -m pip install --user dist/eessi*.tar.gz find $HOME/.local + # make sure we are not in the source directory + cd $HOME + + python --version + python -m pip --version + python -c 'import setuptools; print("setuptools", setuptools.__version__)' + python -c 'import eessi.testsuite.utils' python -c 'import eessi.testsuite.tests.apps' From 32679f2f433fce99b77e39677f986d8db6f09249 Mon Sep 17 00:00:00 2001 From: Lara Ramona Peeters <49882639+laraPPr@users.noreply.github.com> Date: Thu, 21 Sep 2023 09:47:29 +0200 Subject: [PATCH 32/37] Update vsc_hortense.py --- config/vsc_hortense.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/vsc_hortense.py b/config/vsc_hortense.py index 223783cb..612bdd6b 100644 --- a/config/vsc_hortense.py +++ b/config/vsc_hortense.py @@ -55,6 +55,7 @@ def command(self, job): { 'name': 'cpu_rome_256gb', 'scheduler': 'slurm', + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'access': hortense_access + ['--partition=cpu_rome'], 'environs': ['default'], 'descr': 'CPU nodes (AMD Rome, 256GiB RAM)', @@ -74,6 +75,7 @@ def command(self, job): { 'name': 'cpu_rome_512gb', 'scheduler': 'slurm', + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'access': hortense_access + ['--partition=cpu_rome_512'], 'environs': ['default'], 'descr': 'CPU nodes (AMD Rome, 512GiB RAM)', @@ -93,6 +95,7 @@ def command(self, job): { 'name': 'cpu_milan', 'scheduler': 'slurm', + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'access': hortense_access + ['--partition=cpu_milan'], 'environs': ['default'], 'descr': 'CPU nodes (AMD Milan, 256GiB RAM)', @@ -112,6 +115,7 @@ def command(self, job): { 'name': 'gpu_rome_a100_40gb', 'scheduler': 'slurm', + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'access': hortense_access + ['--partition=cpu_rome_a100_40'], 'environs': ['default'], 'descr': 'GPU nodes (A100 40GB)', @@ -147,6 +151,7 @@ def command(self, job): { 'name': 'gpu_rome_a100_80gb', 'scheduler': 'slurm', + 'prepare_cmds': ['source /cvmfs/pilot.eessi-hpc.org/latest/init/bash'], 'access': hortense_access + ['--partition=cpu_rome_a100_80'], 'environs': ['default'], 'descr': 'GPU nodes (A100 80GB)', From 4396d6c753ad036d9fe7597c75a899dfad9e2ef4 Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Wed, 4 Oct 2023 20:36:07 +0200 Subject: [PATCH 33/37] clean up README file, refer to docs for installing/configuring/using EESSI test suite --- README.md | 128 +++++++----------------------------------------------- 1 file changed, 16 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index d67095d3..3c417f68 100644 --- a/README.md +++ b/README.md @@ -1,109 +1,13 @@ # test-suite -A portable test suite for software installations, using ReFrame -## Getting started +A portable test suite for software installations, using ReFrame. -- install ReFrame >=4.0 +## Documentation -- install the test suite using +For documentation on installing, configuring, and using the EESSI test suite, see https://eessi.io/docs/test-suite/. -```bash -pip install git+https://github.com/EESSI/test-suite.git -``` - -Alternatively, you can clone the repository - -```bash -git clone git@github.com:EESSI/test-suite.git -``` - -- add the path of the `test-suite` directory to your ``$PYTHONPATH`` - -- create a site configuration file - - - should look similar to `test-suite/config/settings_example.py` - -- run the tests - - The example below runs a gromacs simulation using GROMACS modules available - in the system, in combination with all available system:partitions as - defined in the site config file, using 1 full node (`--tag 1_node`, see `SCALES` - in `constants.py`). This example assumes that you have cloned the - repository at `/path/to/EESSI/test-suite`. - -``` -cd /path/to/EESSI/test-suite - -module load ReFrame/4.2.0 - -export PYTHONPATH=$PWD:$PYTHONPATH -export RFM_PREFIX= - -reframe \ - --config-file \ - --checkpath eessi/testsuite/tests/apps \ - --tag CI --tag 1_node \ - --run --performance-report -``` +## Development -## Configuring GPU/non-GPU partitions in your site config file: - -- running GPU jobs in GPU nodes - - add `'features': [FEATURES[GPU]]` to the GPU partitions - - add `'extras': {GPU_VENDOR: GPU_VENDORS[NVIDIA]}` to the GPU partitions (or - `INTEL` or `AMD`, see `GPU_VENDORS` in `constants.py`) - -- running non-GPU jobs in non-GPU nodes - - add `'features': [FEATURES[CPU]]` to the non-GPU partitions - -- running both GPU jobs and non-GPU jobs in GPU nodes - - add `'features': [FEATURES[CPU], FEATURES[GPU]]` to the GPU partitions - -- setting the number of GPUS per node for a partition: - ``` - 'access': ['-p '], - 'devices': [ - {'type': DEVICE_TYPES[GPU], 'num_devices': } - ], - ``` -- requesting GPUs per node for a partition: - ``` - 'resources': [ - { - 'name': '_rfm_gpu', - 'options': ['--gpus-per-node={num_gpus_per_node}'], - } - ], - ``` - -## Changing the default test behavior on the cmd line - -- specifying modules - - `--setvar modules=` - -- specifying valid systems:partitions - - `--setvar valid_systems=` - - Note that setting `valid_systems` on the cmd line disables filtering of - valid systems:partitions in the hooks, so you have to do the filtering - yourself. - -- overriding tasks, cpus, gpus - - `--setvar num_tasks_per_node=` - - `--setvar num_cpus_per_task=` - - `--setvar num_gpus_per_node=` - -- setting additional environment variables - - `--setvar env_vars=:` - -Note that these override the variables for _all_ tests in the test suite that -respect those variables. To override a variable only for specific tests, one -can use the `TEST.VAR` syntax. For example, to run the `GROMACS_EESSI` test with the -module `GROMACS/2021.6-foss-2022a`: - -- `--setvar GROMACS_EESSI.modules=GROMACS/2021.6-foss-2022a` - -## Developers If you want to install the EESSI test suite from a branch, you can either install the feature branch with `pip`, or clone the Github repository and check out the feature branch. @@ -124,8 +28,9 @@ pip install git+https://github.com//test-suite.git@branchname ``` ### Check out a feature branch from a fork -We'll assume you already have a local clone of the official test-suite -repository, called 'origin'. In that case, executing `git remote -v`, you + +We'll assume you already have a local clone of the official `test-suite` +repository, called '`origin`'. In that case, executing `git remote -v`, you should see: ```bash @@ -147,10 +52,10 @@ With `git remote -v` you should now see the new remote: ```bash $ git remote -v -origin git@github.com:EESSI/test-suite.git (fetch) -origin git@github.com:EESSI/test-suite.git (push) -casparvl git@github.com:casparvl/test-suite.git (fetch) -casparvl git@github.com:casparvl/test-suite.git (push) +origin git@github.com:EESSI/test-suite.git (fetch) +origin git@github.com:EESSI/test-suite.git (push) +casparvl git@github.com:casparvl/test-suite.git (fetch) +casparvl git@github.com:casparvl/test-suite.git (push) ``` Next, we'll fetch the branches that `casparvl` has in his fork: @@ -162,10 +67,8 @@ $ git fetch casparvl We can check the remote branches using ```bash $ git branch --list --remotes - casparvl/gromacs_cscs + casparvl/example_branch casparvl/main - casparvl/setuppy - casparvl/updated_defaults_pr11 origin/HEAD -> origin/main origin/main ``` @@ -174,14 +77,15 @@ $ git branch --list --remotes this command). Finally, we can create a new local branch (`-c`) and checkout one of these -feature branches (e.g. `setuppy` from the remote `casparvl`). Here, we've -picked `local_setuppy_branch` as the local branch name: +feature branches (e.g. `example_branch` from the remote `casparvl`). Here, we've +picked `my_own_example_branch` as the local branch name: ```bash -$ git switch -c local_setuppy_branch casparvl/setuppy +$ git switch -c my_owm_example_branch casparvl/example_branch ``` While the initial setup is a bit more involved, the advantage of this approach is that it is easy to pull in updates from a feature branch using `git pull`. + You can also push back changes to the feature branch directly, but note that you are pushing to the Github fork of another Github user, so _make sure they are ok with that_ before doing so! From 5ec1ea4a3eb799d6b0d7f11daacf73e84d3b39f0 Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Wed, 4 Oct 2023 20:31:43 +0200 Subject: [PATCH 34/37] bump version to 0.1.0, add RELEASE_NOTES --- RELEASE_NOTES | 19 +++++++++++++++++++ pyproject.toml | 4 ++-- setup.cfg | 4 ++-- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 RELEASE_NOTES diff --git a/RELEASE_NOTES b/RELEASE_NOTES new file mode 100644 index 00000000..beecb987 --- /dev/null +++ b/RELEASE_NOTES @@ -0,0 +1,19 @@ +This file contains a description of the major changes to the EESSI test suite. +For more detailed information, please see the git log. + +v0.1.0 (4 October 2023) +----------------------- + +This is the first release of the EESSI test suite. + +It includes: + +* A well-structured `eessi.testsuite` Python package that provides constants, utilities, hooks, and tests, which can be installed with "`pip install`". +* Tests for GROMACS and TensorFlow in `eessi.testsuite.tests.apps` that leverage the functionality provided by `eessi.testsuite.*`. +* Examples of ReFrame configuration files for various systems in the `config` subdirectory. +* A `common_logging_config()` function to facilitate the ReFrame logging configuration. +* A set of standard device types and features that can be used in the partitions section of the ReFrame configuration file. +* A set of tags (CI + scale) that can be used to filter checks. +* Scripts that show how to run the test suite. + +For documentation, see https://eessi.io/docs/test-suite . diff --git a/pyproject.toml b/pyproject.toml index 7ffffe55..3c374a5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "eessi-testsuite" -version = "0.0.2" +version = "0.1.0" description = "Test suite for the EESSI software stack" readme = "README.md" license = {file = "LICENSE"} @@ -14,7 +14,7 @@ classifiers = [ requires-python = ">=3.6" [project.urls] -"Homepage" = "https://eessi.github.io/docs/software_testing/" +"Homepage" = "https://eessi.io/docs/test-suite" "Bug Tracker" = "https://github.com/EESSI/test-suite/issues" [tool.setuptools.packages.find] diff --git a/setup.cfg b/setup.cfg index 737b6e84..f48c4789 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,12 +1,12 @@ [metadata] name = eessi-testsuite -version = 0.0.2 +version = 0.1.0 description = Test suite for the EESSI software stack long_description = file: README.md, LICENSE classifiers = Programming Language :: Python :: 3 project_urls = - Homepage = https://eessi.github.io/docs/software_testing/ + Homepage = https://eessi.io/docs/test-suite Bug Tracker = https://github.com/EESSI/test-suite/issues [options] From a105d36339be2095d9b8243bc0917b00023a49c9 Mon Sep 17 00:00:00 2001 From: Sam Moors Date: Thu, 5 Oct 2023 08:54:52 +0200 Subject: [PATCH 35/37] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c417f68..cdec5fd4 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Finally, we can create a new local branch (`-c`) and checkout one of these feature branches (e.g. `example_branch` from the remote `casparvl`). Here, we've picked `my_own_example_branch` as the local branch name: ```bash -$ git switch -c my_owm_example_branch casparvl/example_branch +$ git switch -c my_own_example_branch casparvl/example_branch ``` While the initial setup is a bit more involved, the advantage of this approach From 47f393f42d14f98ad06b8af12e2b299d11b5ba3a Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Thu, 5 Oct 2023 09:00:30 +0200 Subject: [PATCH 36/37] bump release date to 5 Oct'23 --- RELEASE_NOTES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index beecb987..0bb97deb 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -1,7 +1,7 @@ This file contains a description of the major changes to the EESSI test suite. For more detailed information, please see the git log. -v0.1.0 (4 October 2023) +v0.1.0 (5 October 2023) ----------------------- This is the first release of the EESSI test suite. From e70bac57a39003c39b58f4871d9edf77aedee14f Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Thu, 5 Oct 2023 13:35:43 +0200 Subject: [PATCH 37/37] add content type of long description + license to setup.cfg --- setup.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index f48c4789..9839603a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,9 @@ name = eessi-testsuite version = 0.1.0 description = Test suite for the EESSI software stack -long_description = file: README.md, LICENSE +long_description = file: README.md +long_description_content_type = text/markdown +license = GPL-2.0-only classifiers = Programming Language :: Python :: 3 project_urls =