From 8934728d460bf822556d86e190c240ba489d8e25 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: May 06 2025 11:48:35 +0000 Subject: Make IPAAbstractVersion available to all platforms They still need to implement own comparison function Signed-off-by: Alexander Bokovoy Reviewed-By: Florence Blanc-Renaud --- diff --git a/ipaplatform/base/tasks.py b/ipaplatform/base/tasks.py index cd17e41..53ef348 100644 --- a/ipaplatform/base/tasks.py +++ b/ipaplatform/base/tasks.py @@ -23,6 +23,7 @@ This module contains default platform-specific implementations of system tasks. ''' from __future__ import absolute_import +from functools import total_ordering import os import logging @@ -48,6 +49,34 @@ RESOLVE1_IPA_CONF = textwrap.dedent(""" """) +@total_ordering +class IPAAbstractVersion: + + def __init__(self, version): + self._version = version + self._bytes = version.encode('utf-8') + + @property + def version(self): + return self._version + + def __eq__(self, other): + if not isinstance(other, IPAAbstractVersion): + return NotImplemented + return self._vercmp(self._bytes, other._bytes) == 0 + + def __lt__(self, other): + if not isinstance(other, IPAAbstractVersion): + return NotImplemented + return self._vercmp(self._bytes, other._bytes) < 0 + + def __hash__(self): + return hash(self._version) + + def _vercmp(self, _a, _b): + return NotImplemented + + class BaseTaskNamespace: def restore_context(self, filepath, force=False): @@ -274,7 +303,7 @@ class BaseTaskNamespace: :param version: textual version :return: object implementing proper __cmp__ method for version compare """ - return parse_version(version) + return IPAAbstractVersion(parse_version(version)) def set_hostname(self, hostname): """ diff --git a/ipaplatform/redhat/tasks.py b/ipaplatform/redhat/tasks.py index d3eda01..18203bf 100644 --- a/ipaplatform/redhat/tasks.py +++ b/ipaplatform/redhat/tasks.py @@ -50,7 +50,7 @@ import ipapython.errors from ipaplatform.constants import constants from ipaplatform.paths import paths from ipaplatform.redhat.authconfig import get_auth_tool -from ipaplatform.base.tasks import BaseTaskNamespace +from ipaplatform.base.tasks import BaseTaskNamespace, IPAAbstractVersion logger = logging.getLogger(__name__) @@ -77,44 +77,22 @@ NM_IPA_CONF = textwrap.dedent(""" @total_ordering -class IPAVersion: +class IPAVersion(IPAAbstractVersion): _rpmvercmp_func = None - @classmethod - def _rpmvercmp(cls, a, b): + def _vercmp(self, a, b): """Lazy load and call librpm's rpmvercmp """ - rpmvercmp_func = cls._rpmvercmp_func + rpmvercmp_func = self._rpmvercmp_func if rpmvercmp_func is None: librpm = ctypes.CDLL(find_library('rpm')) rpmvercmp_func = librpm.rpmvercmp # int rpmvercmp(const char *a, const char *b) rpmvercmp_func.argtypes = [ctypes.c_char_p, ctypes.c_char_p] rpmvercmp_func.restype = ctypes.c_int - cls._rpmvercmp_func = rpmvercmp_func + self._rpmvercmp_func = rpmvercmp_func return rpmvercmp_func(a, b) - def __init__(self, version): - self._version = version - self._bytes = version.encode('utf-8') - - @property - def version(self): - return self._version - - def __eq__(self, other): - if not isinstance(other, IPAVersion): - return NotImplemented - return self._rpmvercmp(self._bytes, other._bytes) == 0 - - def __lt__(self, other): - if not isinstance(other, IPAVersion): - return NotImplemented - return self._rpmvercmp(self._bytes, other._bytes) < 0 - - def __hash__(self): - return hash(self._version) - class RedHatTaskNamespace(BaseTaskNamespace): @@ -482,7 +460,8 @@ class RedHatTaskNamespace(BaseTaskNamespace): return True - def parse_ipa_version(self, version): + @staticmethod + def parse_ipa_version(version): """ :param version: textual version :return: object implementing proper __cmp__ method for version compare diff --git a/ipatests/test_ipaplatform/test_tasks.py b/ipatests/test_ipaplatform/test_tasks.py index 592a864..68fd7b5 100644 --- a/ipatests/test_ipaplatform/test_tasks.py +++ b/ipatests/test_ipaplatform/test_tasks.py @@ -31,7 +31,6 @@ def test_ipa_version(): assert v3 <= v3 assert v3 != v4 assert v3 == v3 - assert not v3 == v4 assert v4 > v3 assert v4 >= v3