checksums: Ignore broken pyeclib installs

The RuntimeError gives more of a hint than the TypeError, but we haven't
really solved the issue. If there's a busted pyeclib install, it's safe
to assume it won't have ISA-L alongside it; just proceed assuming it's
not available.

Closes-Bug: #2120591
Related-Change: I64a85eb739fb72efe41f1ee829e463167246b793
Co-Authored-By: Alistair Coles <alistairncoles@gmail.com>
Signed-off-by: Tim Burke <tim.burke@gmail.com>
Change-Id: I2791566b208327b1fb536fb56a363337ab3f3941
(cherry picked from commit 81df05a9c4)
This commit is contained in:
Tim Burke
2025-08-20 17:26:32 -07:00
parent ca70c3a3f1
commit af70825648
2 changed files with 51 additions and 10 deletions

View File

@@ -43,14 +43,20 @@ def find_isal():
# with isal baked in?
try:
import pyeclib # noqa
from importlib.metadata import files as pkg_files # py38+
from importlib.metadata import \
files as pkg_files, PackageNotFoundError # py38+
except ImportError:
pass
else:
pyeclib_files = pkg_files('pyeclib')
if not pyeclib_files:
# see https://docs.python.org/3/library/importlib.metadata.html
raise RuntimeError('pyeclib installed but missing files')
# Assume busted installs won't have it
try:
pyeclib_files = pkg_files('pyeclib')
if pyeclib_files is None:
# Have a dist-info, but no RECORD file??
pyeclib_files = []
except PackageNotFoundError:
# Could import pyeclib, but no dist-info directory??
pyeclib_files = []
isal_libs = [f for f in pyeclib_files
if f.name.startswith("libisal")]
if len(isal_libs) == 1:

View File

@@ -12,7 +12,6 @@
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
import unittest
from unittest import mock
@@ -25,16 +24,52 @@ from test.unit import requires_crc32c, requires_crc64nvme
class TestModuleFunctions(unittest.TestCase):
def test_find_isal_sys_package_preferred(self):
with mock.patch('ctypes.util.find_library', return_value='my-isal.so'):
with mock.patch('ctypes.CDLL', return_value='fake') as mock_cdll:
self.assertEqual('fake', checksum.find_isal())
self.assertEqual([mock.call('my-isal.so')], mock_cdll.call_args_list)
@unittest.skipIf(
sys.version_info.major == 3 and sys.version_info.minor < 8,
"importlib.metadata not available until py3.8")
def test_find_isal_pyeclib_install_found(self):
mock_pkg = mock.MagicMock()
mock_pkg.locate = mock.MagicMock(return_value='fake-pkg')
with mock.patch('ctypes.util.find_library', return_value=None):
with mock.patch('ctypes.CDLL', return_value='fake') as mock_cdll:
with mock.patch('importlib.metadata.files',
return_value=[mock_pkg]):
self.assertEqual('fake', checksum.find_isal())
self.assertEqual([mock.call('fake-pkg')], mock_cdll.call_args_list)
@unittest.skipIf(
sys.version_info.major == 3 and sys.version_info.minor < 8,
"importlib.metadata not available until py3.8")
def test_find_isal_pyeclib_install_not_found(self):
mock_pkg = mock.MagicMock()
mock_pkg.locate = mock.MagicMock(return_value='fake-pkg')
with mock.patch('ctypes.util.find_library', return_value=None):
with mock.patch('importlib.metadata.files', return_value=[]):
self.assertIsNone(checksum.find_isal())
@unittest.skipIf(
sys.version_info.major == 3 and sys.version_info.minor < 8,
"importlib.metadata not available until py3.8")
def test_find_isal_pyeclib_dist_missing_files(self):
with mock.patch('ctypes.util.find_library', return_value=None):
with mock.patch('importlib.metadata.files', return_value=None):
with self.assertRaises(RuntimeError) as cm:
checksum.find_isal()
self.assertEqual('pyeclib installed but missing files',
str(cm.exception))
self.assertIsNone(checksum.find_isal())
@unittest.skipIf(
sys.version_info.major == 3 and sys.version_info.minor < 8,
"importlib.metadata not available until py3.8")
def test_find_isal_pyeclib_dist_info_missing(self):
from importlib.metadata import PackageNotFoundError
with mock.patch('ctypes.util.find_library', return_value=None):
with mock.patch('importlib.metadata.files',
side_effect=PackageNotFoundError):
self.assertIsNone(checksum.find_isal())
# If you're curious about the 0xe3069283, see "check" at