Skip to content

Commit b2284d7

Browse files
committed
avoid crash in get_os_version on modern SLES-based OSs (fixes #3952)
1 parent 5a63217 commit b2284d7

File tree

2 files changed

+46
-33
lines changed

2 files changed

+46
-33
lines changed

easybuild/tools/systemtools.py

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -742,40 +742,31 @@ def get_os_version():
742742
os_version = res.group('version')
743743

744744
if os_version:
745-
if get_os_name() in ["suse", "SLES"]:
746-
747-
# SLES subversions can only be told apart based on kernel version,
748-
# see http://wiki.novell.com/index.php/Kernel_versions
749-
version_suffixes = {
750-
'11': [
751-
('2.6.27', ''),
752-
('2.6.32', '_SP1'),
753-
('3.0.101-63', '_SP4'),
754-
# not 100% correct, since early SP3 had 3.0.76 - 3.0.93, but close enough?
755-
('3.0.101', '_SP3'),
756-
# SP2 kernel versions range from 3.0.13 - 3.0.101
757-
('3.0', '_SP2'),
758-
],
759-
760-
'12': [
761-
('3.12.28', ''),
762-
('3.12.49', '_SP1'),
763-
],
764-
}
765-
745+
# older SLES subversions can only be told apart based on kernel version,
746+
# see http://wiki.novell.com/index.php/Kernel_versions
747+
sles_version_suffixes = {
748+
'11': [
749+
('2.6.27', ''),
750+
('2.6.32', '_SP1'),
751+
('3.0.101-63', '_SP4'),
752+
# not 100% correct, since early SP3 had 3.0.76 - 3.0.93, but close enough?
753+
('3.0.101', '_SP3'),
754+
# SP2 kernel versions range from 3.0.13 - 3.0.101
755+
('3.0', '_SP2'),
756+
],
757+
758+
'12': [
759+
('3.12.28', ''),
760+
('3.12.49', '_SP1'),
761+
],
762+
}
763+
if get_os_name() in ['suse', 'SLES'] and os_version in sles_version_suffixes:
766764
# append suitable suffix to system version
767-
if os_version in version_suffixes.keys():
768-
kernel_version = platform.uname()[2]
769-
known_sp = False
770-
for (kver, suff) in version_suffixes[os_version]:
771-
if kernel_version.startswith(kver):
772-
os_version += suff
773-
known_sp = True
774-
break
775-
if not known_sp:
776-
suff = '_UNKNOWN_SP'
777-
else:
778-
raise EasyBuildError("Don't know how to determine subversions for SLES %s", os_version)
765+
kernel_version = platform.uname()[2]
766+
for (kver, suff) in sles_version_suffixes[os_version]:
767+
if kernel_version.startswith(kver):
768+
os_version += suff
769+
break
779770

780771
return os_version
781772
else:

test/framework/systemtools.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,10 +366,13 @@ def setUp(self):
366366
self.orig_is_readable = st.is_readable
367367
self.orig_read_file = st.read_file
368368
self.orig_run_cmd = st.run_cmd
369+
self.orig_platform_dist = st.platform.dist if hasattr(st.platform, 'dist') else None
369370
self.orig_platform_uname = st.platform.uname
370371
self.orig_get_tool_version = st.get_tool_version
371372
self.orig_sys_version_info = st.sys.version_info
372373
self.orig_HAVE_ARCHSPEC = st.HAVE_ARCHSPEC
374+
self.orig_HAVE_DISTRO = st.HAVE_DISTRO
375+
self.orig_ETC_OS_RELEASE = st.ETC_OS_RELEASE
373376
if hasattr(st, 'archspec_cpu_host'):
374377
self.orig_archspec_cpu_host = st.archspec_cpu_host
375378
else:
@@ -383,10 +386,14 @@ def tearDown(self):
383386
st.get_os_name = self.orig_get_os_name
384387
st.get_os_type = self.orig_get_os_type
385388
st.run_cmd = self.orig_run_cmd
389+
if self.orig_platform_dist is not None:
390+
st.platform.dist = self.orig_platform_dist
386391
st.platform.uname = self.orig_platform_uname
387392
st.get_tool_version = self.orig_get_tool_version
388393
st.sys.version_info = self.orig_sys_version_info
389394
st.HAVE_ARCHSPEC = self.orig_HAVE_ARCHSPEC
395+
st.HAVE_DISTRO = self.orig_HAVE_DISTRO
396+
st.ETC_OS_RELEASE = self.orig_ETC_OS_RELEASE
390397
if self.orig_archspec_cpu_host is not None:
391398
st.archspec_cpu_host = self.orig_archspec_cpu_host
392399
super(SystemToolsTest, self).tearDown()
@@ -738,6 +745,21 @@ def test_os_version(self):
738745
os_version = get_os_version()
739746
self.assertTrue(isinstance(os_version, string_type) or os_version == UNKNOWN)
740747

748+
# make sure that bug fixed in https://github.com/easybuilders/easybuild-framework/issues/3952
749+
# does not surface again, by mocking what's needed to make get_os_version fall into SLES-specific path
750+
751+
if hasattr(st.platform, 'dist'):
752+
st.platform.dist = lambda: (None, None)
753+
st.HAVE_DISTRO = False
754+
755+
st.get_os_name = lambda: 'SLES'
756+
fake_etc_os_release = os.path.join(self.test_prefix, 'os-release')
757+
write_file(fake_etc_os_release, 'VERSION="15-SP1"')
758+
st.ETC_OS_RELEASE = fake_etc_os_release
759+
760+
os_version = get_os_version()
761+
self.assertEqual(os_version, '15-SP1')
762+
741763
def test_gcc_version_native(self):
742764
"""Test getting gcc version."""
743765
gcc_version = get_gcc_version()

0 commit comments

Comments
 (0)