Skip to content

Commit 3ab35cf

Browse files
committed
improve _version_check_greater to be more universal in netbox_utils
- allow compare even 3 digit versions or more - sanitize inputs - full_version can sometimes be 4.2.9-Docker-3.2.1 just use only 4.2.9 - extend unit tests
1 parent f5cc367 commit 3ab35cf

File tree

3 files changed

+30
-27
lines changed

3 files changed

+30
-27
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
---
2+
minor_changes:
3+
- improve version_check_greater to be more universal

plugins/module_utils/netbox_utils.py

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -808,32 +808,24 @@ def _version_sanitize(raw_value: str) -> str:
808808
f"Invalid version {raw_value!r}: must start with a digit (e.g. '1', '2.5', '4.2.9')"
809809
)
810810

811-
def _version_check_greater(self, greater, lesser, greater_or_equal=False):
811+
def _version_check_greater(
812+
self, ver_net: str, ver_def: str, greater_or_equal=False
813+
) -> bool:
812814
"""Determine if first argument is greater than second argument.
813815
814816
Args:
815-
greater (str): decimal string
816-
lesser (str): decimal string
817+
ver_net (str): decimal string
818+
ver_def (str): decimal string
817819
"""
818-
g_major, g_minor = greater.split(".")
819-
l_major, l_minor = lesser.split(".")
820-
821-
# convert to ints
822-
g_major = int(g_major)
823-
g_minor = int(g_minor)
824-
l_major = int(l_major)
825-
l_minor = int(l_minor)
826-
827-
# If major version is higher then return true right off the bat
828-
if g_major > l_major:
829-
return True
830-
elif greater_or_equal and g_major == l_major and g_minor >= l_minor:
831-
return True
832-
# If major versions are equal, and minor version is higher, return True
833-
elif g_major == l_major and g_minor > l_minor:
834-
return True
835-
836-
return False
820+
t_net = tuple(int(x) for x in self._version_sanitize(ver_net).split("."))
821+
t_def = tuple(int(x) for x in self._version_sanitize(ver_def).split("."))
822+
823+
# Pad shorter tuple with zeros
824+
max_len = max(len(t_net), len(t_def))
825+
t_net += (0,) * (max_len - len(t_net))
826+
t_def += (0,) * (max_len - len(t_def))
827+
828+
return t_net > t_def if not greater_or_equal else t_net >= t_def
837829

838830
def _connect_netbox_api(self, url, token, ssl_verify, cert, headers=None):
839831
try:

tests/unit/module_utils/test_netbox_base_class.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -375,24 +375,29 @@ def test_update_netbox_object_with_changes_check_mode_true(
375375
assert diff == on_update_diff
376376

377377

378-
@pytest.mark.parametrize("version", ["2.9", "2.8", "2.7"])
378+
@pytest.mark.parametrize("version", ["2.13", "2.12", "2.11", "2.10.8", "2.10"])
379379
def test_version_check_greater_true(mock_netbox_module, nb_obj_mock, version):
380380
mock_netbox_module.nb_object = nb_obj_mock
381-
assert mock_netbox_module._version_check_greater("2.10", version)
381+
assert mock_netbox_module._version_check_greater(version, "2.9")
382+
assert mock_netbox_module._version_check_greater(version, "2.9.11")
382383

383384

384-
@pytest.mark.parametrize("version", ["2.13", "2.12", "2.11", "2.10"])
385+
@pytest.mark.parametrize("version", ["2.9", "2.8", "2.7.12", "2.7"])
385386
def test_version_check_greater_false(mock_netbox_module, nb_obj_mock, version):
386387
mock_netbox_module.nb_object = nb_obj_mock
387-
assert not mock_netbox_module._version_check_greater("2.10", version)
388+
assert not mock_netbox_module._version_check_greater(version, "2.10")
389+
assert not mock_netbox_module._version_check_greater(version, "2.10.8")
388390

389391

390-
@pytest.mark.parametrize("version", ["2.9", "2.8", "2.7"])
392+
@pytest.mark.parametrize("version", ["2.9", "2.8", "2.7.5", "2.7"])
391393
def test_version_check_greater_equal_to_true(mock_netbox_module, nb_obj_mock, version):
392394
mock_netbox_module.nb_object = nb_obj_mock
393395
assert mock_netbox_module._version_check_greater(
394396
version, "2.7", greater_or_equal=True
395397
)
398+
assert mock_netbox_module._version_check_greater(
399+
version, "2.6.12", greater_or_equal=True
400+
)
396401

397402

398403
@pytest.mark.parametrize("version", ["2.6", "2.5", "2.4"])
@@ -401,6 +406,9 @@ def test_version_check_greater_equal_to_false(mock_netbox_module, nb_obj_mock, v
401406
assert not mock_netbox_module._version_check_greater(
402407
version, "2.7", greater_or_equal=True
403408
)
409+
assert not mock_netbox_module._version_check_greater(
410+
version, "2.7.7", greater_or_equal=True
411+
)
404412

405413

406414
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)