easybuild-framework
easybuild-framework copied to clipboard
Add option to make sanity_check_paths arch dependent
- Factor out
pick_system_specific_value
to be used bypick_dep_version
- Allow arch specific entries in sanity check paths
Example: 'files': [{'arch=x86_64': 'correct.a'}, 'all_archs.a']
Note that the arch-specific stuff are single files or alternatives (tuple), not a full list of files (again) to keep it simple.
@Flamefire Are the failing tests making sense to you?
@boegel They are secondary. The primary issue is that I basically changed the allowed format to accept dicts in addition to strings and tuples in the list. See https://github.com/easybuilders/easybuild-framework/pull/3845/files#diff-c63ede120b91884bda5e7d0df599ac170866c050ccec036bdf61c3d456846f43R572 However I never really understood that part of the code. I'd think it's better to have simple "conversion" functions (like I did with https://github.com/easybuilders/easybuild-framework/pull/3845/files#diff-c63ede120b91884bda5e7d0df599ac170866c050ccec036bdf61c3d456846f43R352) which errors out on wrong formats instead of having to specify a conversion function and some kind of type-specification.
The conversion function works, however it seems for yeb-files (the YAMLs) the type-spec is used and fails. So I'll need help here as I thought the way I did it was correct.
Ah I needed to add SANITY_CHECK_PATHS_ENTRY
to CHECKABLE_TYPES
. Now those tests work for me
@Flamefire: Tests failed in GitHub Actions, see https://github.com/easybuilders/easybuild-framework/actions/runs/2911263433 Last 100 lines of output from first failing test suite run:
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 172, in is_value_of_type
check_ok = extra_req_checkers[er_key](value)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 161, in <lambda>
'elem_types': lambda val: check_element_types(val, extra_reqs['elem_types']),
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in check_element_types
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in <genexpr>
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 172, in is_value_of_type
check_ok = extra_req_checkers[er_key](value)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 161, in <lambda>
'elem_types': lambda val: check_element_types(val, extra_reqs['elem_types']),
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in check_element_types
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in <genexpr>
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 186, in is_value_of_type
raise EasyBuildError("Don't know how to check whether specified value is of type %s", expected_type)
EasyBuildError: "Don't know how to check whether specified value is of type (<type 'dict'>, (('elem_types', (<type 'str'>,)), ('key_types', (<type 'str'>, (<type 'tuple'>, (('elem_types', (<type 'str'>,)),))))))"
======================================================================
ERROR: test_parse_yeb (test.framework.yeb.YebTest)
Test parsing of .yeb easyconfigs.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/test/framework/yeb.py", line 99, in test_parse_yeb
ec_yeb = EasyConfig(os.path.join(test_yeb_easyconfigs, '%s.yeb' % filename))
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 514, in __init__
self.parse()
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 705, in parse
ec_vars = self.parser.get_config_dict()
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/parser.py", line 223, in get_config_dict
self.check_values_types(cfg)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/parser.py", line 126, in check_values_types
type_ok, newval = check_type_of_param_value(key, cfg[key], self.auto_convert)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 208, in check_type_of_param_value
type_ok = is_value_of_type(val, expected_type)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 172, in is_value_of_type
check_ok = extra_req_checkers[er_key](value)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 161, in <lambda>
'elem_types': lambda val: check_element_types(val, extra_reqs['elem_types']),
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in check_element_types
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in <genexpr>
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 172, in is_value_of_type
check_ok = extra_req_checkers[er_key](value)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 161, in <lambda>
'elem_types': lambda val: check_element_types(val, extra_reqs['elem_types']),
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in check_element_types
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in <genexpr>
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 186, in is_value_of_type
raise EasyBuildError("Don't know how to check whether specified value is of type %s", expected_type)
EasyBuildError: "Don't know how to check whether specified value is of type (<type 'dict'>, (('elem_types', (<type 'str'>,)), ('key_types', (<type 'str'>, (<type 'tuple'>, (('elem_types', (<type 'str'>,)),))))))"
======================================================================
ERROR: test_yeb_get_config_obj (test.framework.yeb.YebTest)
Test get_config_dict method.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/test/framework/yeb.py", line 117, in test_yeb_get_config_obj
ec = EasyConfig(os.path.join(test_yeb_easyconfigs, 'toy-0.0.yeb'))
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 514, in __init__
self.parse()
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 705, in parse
ec_vars = self.parser.get_config_dict()
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/parser.py", line 223, in get_config_dict
self.check_values_types(cfg)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/parser.py", line 126, in check_values_types
type_ok, newval = check_type_of_param_value(key, cfg[key], self.auto_convert)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 208, in check_type_of_param_value
type_ok = is_value_of_type(val, expected_type)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 172, in is_value_of_type
check_ok = extra_req_checkers[er_key](value)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 161, in <lambda>
'elem_types': lambda val: check_element_types(val, extra_reqs['elem_types']),
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in check_element_types
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in <genexpr>
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 172, in is_value_of_type
check_ok = extra_req_checkers[er_key](value)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 161, in <lambda>
'elem_types': lambda val: check_element_types(val, extra_reqs['elem_types']),
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in check_element_types
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 97, in <genexpr>
res &= any(is_value_of_type(elem, t) for t in allowed_types_elem)
File "/tmp/runner/09a3ee6990267d97994deaa265c49df9c2c73d1e/lib/python2.7/site-packages/easybuild/framework/easyconfig/types.py", line 186, in is_value_of_type
raise EasyBuildError("Don't know how to check whether specified value is of type %s", expected_type)
EasyBuildError: "Don't know how to check whether specified value is of type (<type 'dict'>, (('elem_types', (<type 'str'>,)), ('key_types', (<type 'str'>, (<type 'tuple'>, (('elem_types', (<type 'str'>,)),))))))"
----------------------------------------------------------------------
Ran 813 tests in 888.815s
FAILED (errors=8)
ERROR: Not all tests were successful.
bleep, bloop, I'm just a bot (boegelbot v20200716.01)
Please talk to my owner @boegel
if you notice you me acting stupid),
or submit a pull request to https://github.com/boegel/boegelbot fix the problem.
@Flamefire: Tests failed in GitHub Actions, see https://github.com/easybuilders/easybuild-framework/actions/runs/2998245953 Output from first failing test suite run:
ERROR: test_false_dep_version (test.framework.easyconfig.EasyConfigTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/test/framework/easyconfig.py", line 346, in test_false_dep_version
eb = EasyConfig(self.eb_file)
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 514, in __init__
self.parse()
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 750, in parse
self['dependencies'] = remove_false_versions(self._parse_dependency(dep) for dep in self['dependencies'])
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 748, in remove_false_versions
return [dep for dep in deps if not (isinstance(dep, dict) and dep['version'] is False)]
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 750, in <genexpr>
self['dependencies'] = remove_false_versions(self._parse_dependency(dep) for dep in self['dependencies'])
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/easybuild/framework/easyconfig/easyconfig.py", line 1569, in _parse_dependency
dependency['version'] = pick_dep_version(dependency['version'])
File "/tmp/runner/0e404f76cf6b15a0e6a7bdb3b303e892a982cf02/lib/python2.7/site-packages/easybuild/tools/systemtools.py", line 1274, in pick_dep_version
raise EasyBuildError("Unknown value type for version: %s (%s), should be string value", typ, dep_version)
EasyBuildError: "Unknown value type for version: <type 'dict'> ({'arch=x86_64': False}), should be string value"
----------------------------------------------------------------------
Ran 813 tests in 892.924s
FAILED (errors=1)
ERROR: Not all tests were successful.
bleep, bloop, I'm just a bot (boegelbot v20200716.01)
Please talk to my owner @boegel
if you notice you me acting stupid),
or submit a pull request to https://github.com/boegel/boegelbot fix the problem.
@boegel All green now.
Going in, thanks @Flamefire!
@Flamefire Can you also update the documentation to mention that this is now supported? Cfr. https://docs.easybuild.io/writing-easyconfig-files/#sanity-check
@Flamefire Can you also update the documentation to mention that this is now supported? Cfr. https://docs.easybuild.io/writing-easyconfig-files/#sanity-check
Not in the next couple weeks at least. A quick message is all I can do at the moment, a rebase when required is pushing my time limits already.