easybuild-framework icon indicating copy to clipboard operation
easybuild-framework copied to clipboard

Add option to make sanity_check_paths arch dependent

Open Flamefire opened this issue 2 years ago • 6 comments

  • Factor out pick_system_specific_value to be used by pick_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 avatar Sep 21 '21 09:09 Flamefire

@Flamefire Are the failing tests making sense to you?

boegel avatar Sep 29 '21 06:09 boegel

@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.

Flamefire avatar Sep 29 '21 11:09 Flamefire

Ah I needed to add SANITY_CHECK_PATHS_ENTRY to CHECKABLE_TYPES. Now those tests work for me

Flamefire avatar Jul 26 '22 15:07 Flamefire

@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.

boegelbot avatar Aug 23 '22 16:08 boegelbot

@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.

boegelbot avatar Sep 06 '22 08:09 boegelbot

@boegel All green now.

Flamefire avatar Sep 06 '22 11:09 Flamefire

Going in, thanks @Flamefire!

akesandgren avatar Feb 16 '23 12:02 akesandgren

@Flamefire Can you also update the documentation to mention that this is now supported? Cfr. https://docs.easybuild.io/writing-easyconfig-files/#sanity-check

boegel avatar Feb 25 '23 09:02 boegel

@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.

Flamefire avatar Feb 25 '23 13:02 Flamefire