-
Notifications
You must be signed in to change notification settings - Fork 219
probe external modules for missing metadata that is not provided via extermal module metadata file #3174
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
probe external modules for missing metadata that is not provided via extermal module metadata file #3174
Changes from 11 commits
d56f4fa
dc51f55
54d9722
00d0077
46473d5
9cdf2ed
afe4e11
5d87a9a
6648542
bab80b3
b3152c7
e6f3eb7
6d3a63e
1a8cf18
b80c8d6
e36cde2
1507e62
0277662
12573ab
a9facb3
227a9fd
1fbea39
3aed793
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -36,6 +36,7 @@ | |
| :author: Alan O'Cais (Juelich Supercomputing Centre) | ||
| :author: Bart Oldeman (McGill University, Calcul Quebec, Compute Canada) | ||
| :author: Maxime Boissonneault (Universite Laval, Calcul Quebec, Compute Canada) | ||
| :author: Victor Holanda (CSCS, ETH Zurich) | ||
| """ | ||
|
|
||
| import copy | ||
|
|
@@ -61,7 +62,7 @@ | |
| from easybuild.tools.config import LOCAL_VAR_NAMING_CHECK_ERROR, LOCAL_VAR_NAMING_CHECK_LOG, LOCAL_VAR_NAMING_CHECK_WARN | ||
| from easybuild.tools.config import Singleton, build_option, get_module_naming_scheme | ||
| from easybuild.tools.filetools import EASYBLOCK_CLASS_PREFIX, copy_file, decode_class_name, encode_class_name | ||
| from easybuild.tools.filetools import find_backup_name_candidate, find_easyconfigs, read_file, write_file | ||
| from easybuild.tools.filetools import convert_name, find_backup_name_candidate, find_easyconfigs, read_file, write_file | ||
| from easybuild.tools.hooks import PARSE, load_hooks, run_hook | ||
| from easybuild.tools.module_naming_scheme.mns import DEVEL_MODULE_SUFFIX | ||
| from easybuild.tools.module_naming_scheme.utilities import avail_module_naming_schemes, det_full_ec_version | ||
|
|
@@ -1152,19 +1153,109 @@ def _validate(self, attr, values): # private method | |
| if self[attr] and self[attr] not in values: | ||
| raise EasyBuildError("%s provided '%s' is not valid: %s", attr, self[attr], values) | ||
|
|
||
| def _handle_ext_module_metadata_by_probing_modules(self, dep_name, dependency=None): | ||
| """ | ||
| helper function for handle_external_module_metadata | ||
| handles metadata for external module dependencies when there is not entry in the | ||
| metadata file | ||
|
|
||
| It should look for the pair of variables definitions in the available modules | ||
| 1. CRAY_XXXX_PREFIX and CRAY_XXXX_VERSION | ||
| 2. CRAY_XXXX_DIR and CRAY_XXXX_VERSION | ||
| 2. CRAY_XXXX_ROOT and CRAY_XXXX_VERSION | ||
| 5. XXXX_PREFIX and XXXX_VERSION | ||
| 4. XXXX_DIR and XXXX_VERSION | ||
| 5. XXXX_ROOT and XXXX_VERSION | ||
| 3. XXXX_HOME and XXXX_VERSION | ||
|
|
||
| If neither of the pairs is found, then an empty dictionary is returned | ||
| """ | ||
| if dependency is None: | ||
| dependency = dict() | ||
|
|
||
| short_ext_modname = dep_name.split('/')[0] | ||
| if not 'name' in dependency: | ||
| dependency['name'] = [short_ext_modname] | ||
|
||
|
|
||
| if short_ext_modname.startswith('cray-'): | ||
| short_ext_modname = short_ext_modname.split('cray-')[1] | ||
|
|
||
| short_ext_modname.replace('-', '_') | ||
| short_ext_modname_upper = convert_name(short_ext_modname, upper=True) | ||
migueldiascosta marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| allowed_pairs = [ | ||
| ('CRAY_%s_PREFIX', 'CRAY_%s_VERSION'), | ||
| ('CRAY_%s_PREFIX_DIR', 'CRAY_%s_VERSION'), | ||
| ('CRAY_%s_DIR', 'CRAY_%s_VERSION'), | ||
| ('CRAY_%s_ROOT', 'CRAY_%s_VERSION'), | ||
| ('%s_PREFIX', '%s_VERSION'), | ||
| ('%s_DIR', '%s_VERSION'), | ||
| ('%s_ROOT', '%s_VERSION'), | ||
| ('%s_HOME', '%s_VERSION'), | ||
| ] | ||
|
|
||
| for prefix, version in allowed_pairs: | ||
| prefix = prefix % short_ext_modname_upper | ||
| version = version % short_ext_modname_upper | ||
|
|
||
| dep_prefix = self.modules_tool.get_variable_from_modulefile(dep_name, prefix) | ||
| dep_version = self.modules_tool.get_variable_from_modulefile(dep_name, version) | ||
|
|
||
| # only update missing values with both keys are found | ||
| if dep_prefix and dep_version: | ||
| # version should hold the value, not the key | ||
| if 'version' not in dependency: | ||
| dependency['version'] = [dep_version] | ||
| self.log.info('setting external module %s version to be %s' % (dep_name, dep_version)) | ||
| # prefix should hold the key, not the value | ||
| if 'prefix' not in dependency: | ||
| dependency['prefix'] = prefix | ||
| self.log.info('setting external module %s prefix to be %s' % (dep_name, dep_prefix)) | ||
| break | ||
|
|
||
| return dependency | ||
|
|
||
| def handle_external_module_metadata(self, dep_name): | ||
| """ | ||
| helper function for _parse_dependency | ||
| handles metadata for external module dependencies | ||
| """ | ||
| dependency = {} | ||
| dep_name_no_version = dep_name.split('/')[0] | ||
| metadata_fields = ['name', 'version', 'prefix'] | ||
| external_metadata = {} | ||
|
|
||
| if dep_name in self.external_modules_metadata: | ||
| dependency['external_module_metadata'] = self.external_modules_metadata[dep_name] | ||
| self.log.info("Updated dependency info with available metadata for external module %s: %s", | ||
| dep_name, dependency['external_module_metadata']) | ||
| external_metadata = self.external_modules_metadata[dep_name] | ||
| if not all(d in external_metadata for d in metadata_fields): | ||
| external_metadata = self._handle_ext_module_metadata_by_probing_modules(dep_name, | ||
| dependency=external_metadata) | ||
| if external_metadata: | ||
| self.log.info("Updated dependency info with metadata from available modules for external module %s: %s", | ||
| dep_name, external_metadata) | ||
| else: | ||
| self.log.info("No metadata available for external module %s.", dep_name) | ||
| elif dep_name_no_version in self.external_modules_metadata: | ||
| external_metadata = self.external_modules_metadata[dep_name_no_version] | ||
| if not all(d in external_metadata for d in metadata_fields): | ||
| external_metadata = self._handle_ext_module_metadata_by_probing_modules(dep_name_no_version, | ||
| dependency=external_metadata) | ||
| if external_metadata: | ||
| self.log.info("Updated dependency info with metadata from available modules for external module %s: %s", | ||
victorusu marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| dep_name, external_metadata) | ||
| else: | ||
| self.log.info("No metadata available for external module %s.", dep_name) | ||
| else: | ||
| self.log.info("No metadata available for external module %s", dep_name) | ||
| self.log.info("No metadata available for external module %s. Attempting to read from available modules", | ||
| dep_name) | ||
| external_metadata = self._handle_ext_module_metadata_by_probing_modules(dep_name) | ||
| if external_metadata: | ||
| self.log.info("Updated dependency info with metadata from available modules for external module %s: %s", | ||
| dep_name, external_metadata) | ||
| else: | ||
| self.log.info("No metadata available for external module %s.", dep_name) | ||
|
|
||
| dependency['external_module_metadata'] = external_metadata | ||
boegel marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return dependency | ||
|
|
||
| def handle_multi_deps(self): | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.