From 89c5e1a98ce1a6aa53808a98be4da3901653be47 Mon Sep 17 00:00:00 2001 From: john feng Date: Tue, 11 Mar 2025 15:35:31 -0700 Subject: [PATCH 1/9] fix the version comparator for ubuntu pro client version extraction --- src/core/src/core_logic/VersionComparator.py | 17 +++++- src/core/tests/Test_VersionComparator.py | 57 ++++++++++++------- src/extension/src/VersionComparatorHandler.py | 20 +++++-- .../tests/Test_VersionComparatorHandler.py | 22 ++++--- 4 files changed, 81 insertions(+), 35 deletions(-) diff --git a/src/core/src/core_logic/VersionComparator.py b/src/core/src/core_logic/VersionComparator.py index 68779c91..ba1e42c1 100644 --- a/src/core/src/core_logic/VersionComparator.py +++ b/src/core/src/core_logic/VersionComparator.py @@ -39,10 +39,21 @@ def extract_version_nums(self, path): # type (str) -> str """ Extract the version part from a given path. - Input: /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.5/config - Return: "1.2.5" + Path Extracted Version + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.5/config "1.2.5" + "abc-1.2.3-alpha" "1.2.3" + "xyz-34~20.04" "34" + "some-27.14-ubuntu" "27.14" + "random-5.0.1+build" "5.0.1" + "abc" "" """ - match = re.search(r'([\d]+\.[\d]+\.[\d]+)', path) + # extract lpe version + if "LinuxPatchExtension" in path: + match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts + return match.group(1).rstrip('.') if match else "" + + # extract os version + match = re.search(r'(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts return match.group(1) if match else str() def sort_versions_desc_order(self, paths): diff --git a/src/core/tests/Test_VersionComparator.py b/src/core/tests/Test_VersionComparator.py index ff8b7972..74ced0c0 100644 --- a/src/core/tests/Test_VersionComparator.py +++ b/src/core/tests/Test_VersionComparator.py @@ -25,27 +25,45 @@ def setUp(self): self.version_comparator = VersionComparator() def test_linux_version_comparator(self): - # Test extract version logic - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001"), "1.21.1001") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"), "1.6.100") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99"), "1.6.99") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.6."), "") - self.assertEqual(self.version_comparator.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") - - expected_extracted_version = "27.13.4" - test_extracted_v1 = self.version_comparator.extract_version_nums("27.13.4~18.04.1") - test_extracted_v2 = self.version_comparator.extract_version_nums("27.13.4+18.04.1") - test_extracted_v3 = self.version_comparator.extract_version_nums("27.13.4-18.04.1") + # Test extract version logic on Extension package + + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc"), "1.2.25") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001"), "1.21.1001") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"), "1.6.100") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99"), "1.6.99") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6"), "1.6") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6."), "1.6") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.."), "1.6") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.abc"), "1.6") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6abc"), "1.6") + self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + + # Test extract version logic on Ubuntuproclient version + self.assertEqual(self.version_comparator.extract_version_nums("27.~18.04.1"), "27") + self.assertEqual(self.version_comparator.extract_version_nums("27.a+18.04.1"), "27") + self.assertEqual(self.version_comparator.extract_version_nums("27abc-20.04"), "27") + self.assertEqual(self.version_comparator.extract_version_nums("27~abc-20"), "27") + self.assertEqual(self.version_comparator.extract_version_nums("27~25.1.2-18.04.1"), "27") + + self.assertEqual(self.version_comparator.extract_version_nums("27.1.~18.04.1"), "27.1") + self.assertEqual(self.version_comparator.extract_version_nums("27.1.a+18.04.1"), "27.1") + self.assertEqual(self.version_comparator.extract_version_nums("27.1abc-20.04"), "27.1") + self.assertEqual(self.version_comparator.extract_version_nums("27.1!abc-20"), "27.1") - self.assertEqual(test_extracted_v1, expected_extracted_version) - self.assertEqual(test_extracted_v2, expected_extracted_version) - self.assertEqual(test_extracted_v3, expected_extracted_version) + self.assertEqual(self.version_comparator.extract_version_nums("27.13.4"), "27.13.4") + self.assertEqual(self.version_comparator.extract_version_nums("27.13.4~18.04.1"), "27.13.4") + self.assertEqual(self.version_comparator.extract_version_nums("27.13.4-ab+18.04.1"), "27.13.4") + self.assertEqual(self.version_comparator.extract_version_nums("27.13.4abc-18.04.1"), "27.13.4") + self.assertEqual(self.version_comparator.extract_version_nums("27.13.4!@abc"), "27.13.4") - # Test compare versions logic + + # Test compare versions logic Ubuntuproclient version + test_extracted_v1 = self.version_comparator.extract_version_nums("27.13.4~18.04.1") + test_extracted_v2 = self.version_comparator.extract_version_nums("27.13.4!27.1.2.3-ab+18.04.1") + test_extracted_v3 = self.version_comparator.extract_version_nums("27.13.4~25.6aa#@bc") self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v1, "27.13.4"), 0) # equal self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v2, "27.13.3"), 1) # greater self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v3, "27.13.5"), -1) # less @@ -72,6 +90,7 @@ def test_linux_version_comparator(self): # valid versions self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_path_versions), expected_sorted_path_versions) + if __name__ == '__main__': unittest.main() diff --git a/src/extension/src/VersionComparatorHandler.py b/src/extension/src/VersionComparatorHandler.py index fd119087..49d8d033 100644 --- a/src/extension/src/VersionComparatorHandler.py +++ b/src/extension/src/VersionComparatorHandler.py @@ -23,11 +23,22 @@ def extract_version_nums(self, path): # type (str) -> (str) """ Extract the version part from a given path. - Input: /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.5/config - Return: "1.2.5" + Path Extracted Version + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.5/config "1.2.5" + "abc-1.2.3-alpha" "1.2.3" + "xyz-34~20.04" "34" + "some-27.14-ubuntu" "27.14" + "random-5.0.1+build" "5.0.1" + "abc" "" """ - match = re.search(r'([\d]+\.[\d]+\.[\d]+)', path) - return match.group(1) if match else "" + # extract lpe version + if "LinuxPatchExtension" in path: + match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts + return match.group(1).rstrip('.') if match else "" + + # extract os version + match = re.search(r'(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts + return match.group(1) if match else str() def sort_versions_desc_order(self, paths): # type (list[str]) -> list[str] @@ -51,4 +62,5 @@ def __version_key(self, path): Return: (1.6.100) """ version_numbers = self.extract_version_nums(path) + return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) diff --git a/src/extension/tests/Test_VersionComparatorHandler.py b/src/extension/tests/Test_VersionComparatorHandler.py index 450231d1..511f4d32 100644 --- a/src/extension/tests/Test_VersionComparatorHandler.py +++ b/src/extension/tests/Test_VersionComparatorHandler.py @@ -25,15 +25,19 @@ def setUp(self): def test_linux_version_comparator_handler(self): # Test extract version logic - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001"), "1.21.1001") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"), "1.6.100") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99"), "1.6.99") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-1.6."), "") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001"), "1.21.1001") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"), "1.6.100") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99"), "1.6.99") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6"), "1.6") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6."), "1.6") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.."), "1.6") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.abc"), "1.6") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6abc"), "1.6") + self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") # Test sort versions logic unsorted_path_versions = [ From c84206901b4b283f713867ef59bb9cbd62105442 Mon Sep 17 00:00:00 2001 From: johnfeng Date: Wed, 12 Mar 2025 22:08:36 -0700 Subject: [PATCH 2/9] fix the version comparator logic --- src/core/src/core_logic/VersionComparator.py | 78 +++++++++--- src/core/tests/Test_VersionComparator.py | 118 ++++++++++-------- src/extension/src/VersionComparatorHandler.py | 77 +++++++++--- .../tests/Test_VersionComparatorHandler.py | 73 ++++++++--- 4 files changed, 243 insertions(+), 103 deletions(-) diff --git a/src/core/src/core_logic/VersionComparator.py b/src/core/src/core_logic/VersionComparator.py index ba1e42c1..33a4e1d9 100644 --- a/src/core/src/core_logic/VersionComparator.py +++ b/src/core/src/core_logic/VersionComparator.py @@ -35,32 +35,53 @@ def compare_version_nums(self, version_a, version_b): # If equal 27.13.4 vs 27.13.4, return 0 return (len(parse_version_a) > len(parse_version_b)) - (len(parse_version_a) < len(parse_version_b)) - def extract_version_nums(self, path): + def extract_lpe_path_version_num(self, lpe_path): # type (str) -> str """ - Extract the version part from a given path. - Path Extracted Version - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.5/config "1.2.5" - "abc-1.2.3-alpha" "1.2.3" - "xyz-34~20.04" "34" - "some-27.14-ubuntu" "27.14" - "random-5.0.1+build" "5.0.1" - "abc" "" + Extract the version part from a given lpe path. + Input Extracted Version + LinuxPatchExtension-1.2.25 "1.2.25" + LinuxPatchExtension-1.2.250 "1.2.250" + LinuxPatchExtension-1.21.2501 "1.21.2501" + LinuxPatchExtension-1.2.25. "1.2.25" + LinuxPatchExtension-1.2.25.. "1.2.25" + LinuxPatchExtension-1.2.25abc "1.2.25" + LinuxPatchExtension-1.2.25.abc "1.2.25" + LinuxPatchExtension-1.2.25+abc.123 "1.2.25" + LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" + LinuxPatchExtension-a.b.c "" """ - # extract lpe version - if "LinuxPatchExtension" in path: - match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts - return match.group(1).rstrip('.') if match else "" + match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', lpe_path) # extract numbers with optional dot-separated parts + return match.group(1).rstrip('.') if match else "" - # extract os version - match = re.search(r'(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts + def extract_os_version_nums(self, os_version): + # type (str) -> str + """ + Extract the version part from a given os version. + Input os version Extracted Version + 34 34 + 34~18 34 + 34.~18.04 34 + 34.a+18.04.1 34 + 34abc-18.04 34 + abc34~18.04 34 + abc34~18.04.123 34 + 34~25.1.2-18.04.1 34 + 34.1~18.04.1 34.1 + 34.13.4 34.13.4 + 34.13.4~18.04.1 34.13.4 + 34.13.4-ab+18.04.1 34.13.4 + 34.13.4abc-18.04.1 34.13.4 + abc.34.13.4!@abc 34.13.4 + """ + match = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts return match.group(1) if match else str() def sort_versions_desc_order(self, paths): # type (list[str]) -> list[str] """ Sort paths based on version numbers extracted from paths. - Input: + Lpe input: ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] @@ -68,16 +89,37 @@ def sort_versions_desc_order(self, paths): ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] + + Os Version input: + ["32.101~18.01", + "32.101.15~18", + "34~18.04", + "32~18.04.01", + "32.1~18.04.01"] + + return: + ["34~18.04", + "32.101.15~18", + "32.101~18.01", + "32.1~18.04.01", + "32~18.04.01"] """ return sorted(paths, key=self.__version_key, reverse=True) def __version_key(self, path): # type (str) -> (int) """ Extract version number from input and return int tuple. - Input: "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" + Lpe input: "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" Return: (1.6.100) + + os version input: "34~18.04" + Return: (34) """ - version_numbers = self.extract_version_nums(path) + if "LinuxPatchExtension" in path: + version_numbers = self.extract_lpe_path_version_num(lpe_path = path) + else: + version_numbers = self.extract_os_version_nums(os_version=path) + return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) def __split_version_components(self, version): diff --git a/src/core/tests/Test_VersionComparator.py b/src/core/tests/Test_VersionComparator.py index 74ced0c0..269fc191 100644 --- a/src/core/tests/Test_VersionComparator.py +++ b/src/core/tests/Test_VersionComparator.py @@ -24,71 +24,91 @@ class TestVersionComparator(unittest.TestCase): def setUp(self): self.version_comparator = VersionComparator() - def test_linux_version_comparator(self): - # Test extract version logic on Extension package - - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001"), "1.21.1001") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"), "1.6.100") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99"), "1.6.99") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6"), "1.6") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6."), "1.6") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.."), "1.6") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.abc"), "1.6") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6abc"), "1.6") - self.assertEqual(self.version_comparator.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") - - # Test extract version logic on Ubuntuproclient version - self.assertEqual(self.version_comparator.extract_version_nums("27.~18.04.1"), "27") - self.assertEqual(self.version_comparator.extract_version_nums("27.a+18.04.1"), "27") - self.assertEqual(self.version_comparator.extract_version_nums("27abc-20.04"), "27") - self.assertEqual(self.version_comparator.extract_version_nums("27~abc-20"), "27") - self.assertEqual(self.version_comparator.extract_version_nums("27~25.1.2-18.04.1"), "27") - - self.assertEqual(self.version_comparator.extract_version_nums("27.1.~18.04.1"), "27.1") - self.assertEqual(self.version_comparator.extract_version_nums("27.1.a+18.04.1"), "27.1") - self.assertEqual(self.version_comparator.extract_version_nums("27.1abc-20.04"), "27.1") - self.assertEqual(self.version_comparator.extract_version_nums("27.1!abc-20"), "27.1") - - self.assertEqual(self.version_comparator.extract_version_nums("27.13.4"), "27.13.4") - self.assertEqual(self.version_comparator.extract_version_nums("27.13.4~18.04.1"), "27.13.4") - self.assertEqual(self.version_comparator.extract_version_nums("27.13.4-ab+18.04.1"), "27.13.4") - self.assertEqual(self.version_comparator.extract_version_nums("27.13.4abc-18.04.1"), "27.13.4") - self.assertEqual(self.version_comparator.extract_version_nums("27.13.4!@abc"), "27.13.4") - - - # Test compare versions logic Ubuntuproclient version - test_extracted_v1 = self.version_comparator.extract_version_nums("27.13.4~18.04.1") - test_extracted_v2 = self.version_comparator.extract_version_nums("27.13.4!27.1.2.3-ab+18.04.1") - test_extracted_v3 = self.version_comparator.extract_version_nums("27.13.4~25.6aa#@bc") - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v1, "27.13.4"), 0) # equal - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v2, "27.13.3"), 1) # greater - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v3, "27.13.5"), -1) # less - - # Test sort versions logic - unsorted_path_versions = [ + def test_linux_extension_version_extract_comparator(self): + """ Test extract version logic on Extension package """ + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + + def test_linux_os_version_extract_comparator(self): + """ Test extract version logic on Ubuntuproclient version """ + self.assertEqual(self.version_comparator.extract_os_version_nums("34"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("34~18"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("34.~18.04"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("34.a+18.04.1"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("34abc-18.04"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("abc34~18.04"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("abc34~18.04.123"), "34") + self.assertEqual(self.version_comparator.extract_os_version_nums("34~25.1.2-18.04.1"), "34") + + self.assertEqual(self.version_comparator.extract_os_version_nums("34.1~18.04.1"), "34.1") + self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4"), "34.13.4") + self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4~18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4-ab+18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4abc-18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator.extract_os_version_nums("abc.34.13.4!@abc"), "34.13.4") + + def test_linux_os_version_comparison(self): + """ Test compare versions logic Ubuntuproclient version """ + test_extracted_v1 = self.version_comparator.extract_os_version_nums("34.13.4~18.04.1") + test_extracted_v2 = self.version_comparator.extract_os_version_nums("34.13.4!34.1.2.3-ab+18.04.1") + test_extracted_v3 = self.version_comparator.extract_os_version_nums("34.13.4~25.6aa#@bc") + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v1, "34.13.4"), 0) # equal + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v2, "34.13.3"), 1) # greater + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v3, "34.13.5"), -1) # less + + def test_linux_extension_sort_comparator(self): + + # Test sort lpe versions + unsorted_lpe_versions = [ "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", + "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", ] - expected_sorted_path_versions = [ + expected_sorted_lpe_versions = [ "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" ] - # valid versions - self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_path_versions), expected_sorted_path_versions) + # validate sorted lpe versions + self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) + + def test_os_version_sort_comparator(self): + """ Test sort os versions """ + unsorted_os_versions = [ + "32.101.~18.01", + "32.101.15~18", + "abc34~18.04", + "32~18.04.01", + "32.1~18.04.01" + ] + + expected_sorted_os_versions = [ + "abc34~18.04", + "32.101.15~18", + "32.101.~18.01", + "32.1~18.04.01", + "32~18.04.01" + ] + + self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_os_versions), expected_sorted_os_versions) if __name__ == '__main__': diff --git a/src/extension/src/VersionComparatorHandler.py b/src/extension/src/VersionComparatorHandler.py index 49d8d033..5e5c2ec1 100644 --- a/src/extension/src/VersionComparatorHandler.py +++ b/src/extension/src/VersionComparatorHandler.py @@ -19,32 +19,53 @@ class VersionComparatorHandler(object): - def extract_version_nums(self, path): - # type (str) -> (str) + def extract_lpe_path_version_num(self, lpe_path): + # type (str) -> str """ - Extract the version part from a given path. - Path Extracted Version - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.5/config "1.2.5" - "abc-1.2.3-alpha" "1.2.3" - "xyz-34~20.04" "34" - "some-27.14-ubuntu" "27.14" - "random-5.0.1+build" "5.0.1" - "abc" "" + Extract the version part from a given lpe path. + Input Extracted Version + LinuxPatchExtension-1.2.25 "1.2.25" + LinuxPatchExtension-1.2.250 "1.2.250" + LinuxPatchExtension-1.21.2501 "1.21.2501" + LinuxPatchExtension-1.2.25. "1.2.25" + LinuxPatchExtension-1.2.25.. "1.2.25" + LinuxPatchExtension-1.2.25abc "1.2.25" + LinuxPatchExtension-1.2.25.abc "1.2.25" + LinuxPatchExtension-1.2.25+abc.123 "1.2.25" + LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" + LinuxPatchExtension-a.b.c "" """ - # extract lpe version - if "LinuxPatchExtension" in path: - match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts - return match.group(1).rstrip('.') if match else "" + match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', lpe_path) # extract numbers with optional dot-separated parts + return match.group(1).rstrip('.') if match else "" - # extract os version - match = re.search(r'(\d+(?:\.\d+)*)', path) # extract numbers with optional dot-separated parts + def extract_os_version_nums(self, os_version): + # type (str) -> str + """ + Extract the version part from a given os version. + Input os version Extracted Version + 34 34 + 34~18 34 + 34.~18.04 34 + 34.a+18.04.1 34 + 34abc-18.04 34 + abc34~18.04 34 + abc34~18.04.123 34 + 34~25.1.2-18.04.1 34 + 34.1~18.04.1 34.1 + 34.13.4 34.13.4 + 34.13.4~18.04.1 34.13.4 + 34.13.4-ab+18.04.1 34.13.4 + 34.13.4abc-18.04.1 34.13.4 + abc.34.13.4!@abc 34.13.4 + """ + match = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts return match.group(1) if match else str() def sort_versions_desc_order(self, paths): # type (list[str]) -> list[str] """ Sort paths based on version numbers extracted from paths. - Input: + Lpe input: ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] @@ -52,6 +73,20 @@ def sort_versions_desc_order(self, paths): ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] + + Os Version input: + ["32.101~18.01", + "32.101.15~18", + "34~18.04", + "32~18.04.01", + "32.1~18.04.01"] + + return: + ["34~18.04", + "32.101.15~18", + "32.101~18.01", + "32.1~18.04.01", + "32~18.04.01"] """ return sorted(paths, key=self.__version_key,reverse=True) @@ -60,7 +95,13 @@ def __version_key(self, path): """ Extract version number from input and return int tuple. Input: "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" Return: (1.6.100) + + os version input: "34~18.04" + Return: (34) """ - version_numbers = self.extract_version_nums(path) + if "LinuxPatchExtension" in path: + version_numbers = self.extract_lpe_path_version_num(lpe_path=path) + else: + version_numbers = self.extract_os_version_nums(os_version=path) return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) diff --git a/src/extension/tests/Test_VersionComparatorHandler.py b/src/extension/tests/Test_VersionComparatorHandler.py index 511f4d32..12be3177 100644 --- a/src/extension/tests/Test_VersionComparatorHandler.py +++ b/src/extension/tests/Test_VersionComparatorHandler.py @@ -23,23 +23,39 @@ class TestVersionComparatorHandler(unittest.TestCase): def setUp(self): self.version_comparator_handler = VersionComparatorHandler() - def test_linux_version_comparator_handler(self): - # Test extract version logic - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001"), "1.21.1001") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"), "1.6.100") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99"), "1.6.99") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6"), "1.6") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6."), "1.6") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.."), "1.6") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6.abc"), "1.6") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.6abc"), "1.6") - self.assertEqual(self.version_comparator_handler.extract_version_nums("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") - - # Test sort versions logic + def test_linux_extension_version_extract_comparator_handler(self): + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + + def test_linux_os_version_extract_comparator_handler(self): + """ Test extract version logic on Ubuntuproclient version """ + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34~18"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.~18.04"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.a+18.04.1"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34abc-18.04"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc34~18.04"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc34~18.04.123"), "34") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34~25.1.2-18.04.1"), "34") + + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.1~18.04.1"), "34.1") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4"), "34.13.4") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4~18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4-ab+18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4abc-18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc.34.13.4!@abc"), "34.13.4") + + + def test_linux_extension_sort_comparator_handler(self): + """Test version comparator sorting logic on linux extension versions """ unsorted_path_versions = [ "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", @@ -58,6 +74,27 @@ def test_linux_version_comparator_handler(self): "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" ] - # valid versions + # validate sorted lpe versions self.assertEqual(self.version_comparator_handler.sort_versions_desc_order(unsorted_path_versions), expected_sorted_path_versions) + + def test_os_version_sort_comparator_handler(self): + """Test version comparator sorting logic on linux os versions """ + unsorted_os_versions = [ + "32.101.~18.01", + "32.101.15~18", + "abc34~18.04", + "32~18.04.01", + "32.1~18.04.01" + ] + + expected_sorted_os_versions = [ + "abc34~18.04", + "32.101.15~18", + "32.101.~18.01", + "32.1~18.04.01", + "32~18.04.01" + ] + + self.assertEqual(self.version_comparator_handler.sort_versions_desc_order(unsorted_os_versions), expected_sorted_os_versions) + From 66b29f4ff554670167081af1b4c9350ba852420e Mon Sep 17 00:00:00 2001 From: johnfeng Date: Wed, 12 Mar 2025 22:18:27 -0700 Subject: [PATCH 3/9] update extraction method for ubuntuproclient --- src/core/src/package_managers/UbuntuProClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/src/package_managers/UbuntuProClient.py b/src/core/src/package_managers/UbuntuProClient.py index 5c8b3189..b7544d01 100644 --- a/src/core/src/package_managers/UbuntuProClient.py +++ b/src/core/src/package_managers/UbuntuProClient.py @@ -57,7 +57,7 @@ def is_pro_working(self): ubuntu_pro_client_version = version_result.installed_version # extract version from pro_client_verison 27.13.4~18.04.1 -> 27.13.4 - extracted_ubuntu_pro_client_version = self.version_comparator.extract_version_nums(ubuntu_pro_client_version) + extracted_ubuntu_pro_client_version = self.version_comparator.extract_os_version_nums(ubuntu_pro_client_version) self.composite_logger.log_debug("Ubuntu Pro Client current version: [ClientVersion={0}]".format(str(extracted_ubuntu_pro_client_version))) From 134e65c5af248cab3d1530dda989ed61519d96cb Mon Sep 17 00:00:00 2001 From: johnfeng Date: Wed, 12 Mar 2025 22:51:48 -0700 Subject: [PATCH 4/9] add unit test for mock pro client version --- src/core/tests/Test_UbuntuProClient.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/tests/Test_UbuntuProClient.py b/src/core/tests/Test_UbuntuProClient.py index 6f6dd5b9..ed169b31 100644 --- a/src/core/tests/Test_UbuntuProClient.py +++ b/src/core/tests/Test_UbuntuProClient.py @@ -57,6 +57,9 @@ def mock_to_below_minimum_version(self): def mock_version_raise_exception(self): raise + def mock_pro_version(self): + return MockVersionResult("34~18.004.01") + def mock_import_uaclient_version_module(self, mock_name, method_name): if sys.version_info[0] == 3: sys.modules['uaclient.api.u.pro.version.v1'] = types.ModuleType('version_module') @@ -185,6 +188,15 @@ def test_is_pro_working_success(self): obj.mock_unimport_uaclient_version_module() + def test_is_actual_pro_version_working_success(self): + obj = MockVersionResult() + obj.mock_import_uaclient_version_module('version', 'mock_pro_version') + + package_manager = self.container.get('package_manager') + self.assertTrue(package_manager.ubuntu_pro_client.is_pro_working()) + + obj.mock_unimport_uaclient_version_module() + def test_is_pro_working_failure_when_minimum_version_required_is_false(self): obj = MockVersionResult() obj.mock_import_uaclient_version_module('version', 'mock_to_below_minimum_version') From 324705a6e2da313f6f6c81ff16cab9fb77fb24dc Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 13 Mar 2025 11:02:08 -0700 Subject: [PATCH 5/9] use basepath() to extract last part of lpe path with version --- src/core/src/core_logic/VersionComparator.py | 59 +++++----- src/core/tests/Test_VersionComparator.py | 102 ++++++++++-------- src/extension/src/VersionComparatorHandler.py | 60 ++++++----- .../tests/Test_VersionComparatorHandler.py | 72 ++++++------- 4 files changed, 157 insertions(+), 136 deletions(-) diff --git a/src/core/src/core_logic/VersionComparator.py b/src/core/src/core_logic/VersionComparator.py index 33a4e1d9..7f46df1a 100644 --- a/src/core/src/core_logic/VersionComparator.py +++ b/src/core/src/core_logic/VersionComparator.py @@ -13,6 +13,7 @@ # limitations under the License. # # Requires Python 2.7+ +import os.path import re @@ -39,20 +40,22 @@ def extract_lpe_path_version_num(self, lpe_path): # type (str) -> str """ Extract the version part from a given lpe path. - Input Extracted Version - LinuxPatchExtension-1.2.25 "1.2.25" - LinuxPatchExtension-1.2.250 "1.2.250" - LinuxPatchExtension-1.21.2501 "1.21.2501" - LinuxPatchExtension-1.2.25. "1.2.25" - LinuxPatchExtension-1.2.25.. "1.2.25" - LinuxPatchExtension-1.2.25abc "1.2.25" - LinuxPatchExtension-1.2.25.abc "1.2.25" - LinuxPatchExtension-1.2.25+abc.123 "1.2.25" - LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" - LinuxPatchExtension-a.b.c "" + Input Extracted Version + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250 "1.2.250" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501 "1.21.2501" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25. "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.. "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c "" """ - match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', lpe_path) # extract numbers with optional dot-separated parts - return match.group(1).rstrip('.') if match else "" + + lpe_filename = os.path.basename(lpe_path) # Microsoft.CPlat.Core.LinuxPatchExtension-x.x.xx + lpe_version = re.search(r'(\d+(?:\.\d+)*)', lpe_filename) # extract numbers with optional dot-separated parts + return lpe_version.group(1).rstrip('.') if lpe_version else "" def extract_os_version_nums(self, os_version): # type (str) -> str @@ -74,21 +77,21 @@ def extract_os_version_nums(self, os_version): 34.13.4abc-18.04.1 34.13.4 abc.34.13.4!@abc 34.13.4 """ - match = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts - return match.group(1) if match else str() + version_num = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts + return version_num.group(1) if version_num else str() - def sort_versions_desc_order(self, paths): + def sort_versions_desc_order(self, version_list): # type (list[str]) -> list[str] """ Sort paths based on version numbers extracted from paths. Lpe input: - ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] + ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] Return: - ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] + ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] Os Version input: ["32.101~18.01", @@ -104,21 +107,21 @@ def sort_versions_desc_order(self, paths): "32.1~18.04.01", "32~18.04.01"] """ - return sorted(paths, key=self.__version_key, reverse=True) + return sorted(version_list, key=self.__version_key, reverse=True) - def __version_key(self, path): + def __version_key(self, version_input): # type (str) -> (int) """ Extract version number from input and return int tuple. - Lpe input: "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" + Lpe input: "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" Return: (1.6.100) os version input: "34~18.04" Return: (34) """ - if "LinuxPatchExtension" in path: - version_numbers = self.extract_lpe_path_version_num(lpe_path = path) + if "LinuxPatchExtension" in version_input: + version_numbers = self.extract_lpe_path_version_num(lpe_path=version_input) else: - version_numbers = self.extract_os_version_nums(os_version=path) + version_numbers = self.extract_os_version_nums(os_version=version_input) return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) diff --git a/src/core/tests/Test_VersionComparator.py b/src/core/tests/Test_VersionComparator.py index 269fc191..a42d8468 100644 --- a/src/core/tests/Test_VersionComparator.py +++ b/src/core/tests/Test_VersionComparator.py @@ -26,16 +26,57 @@ def setUp(self): def test_linux_extension_version_extract_comparator(self): """ Test extract version logic on Extension package """ - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), + "1.21.2501") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), + "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), + "1.2.25") + self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + + def test_linux_lpe_version_comparison(self): + """ Test compare versions logic lpe version with existing vm version """ + test_extracted_good_version = self.version_comparator.extract_os_version_nums( + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25") # return 1.2.25 + + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "1.2.25"), 0) # equal 1.2.25 == 1.2.25 + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "1.2.24"), 1) # greater 1.2.25 > 1.2.24 + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "1.19.25"), -1) # less 1.2.25 < 1.19.25, 19 > 2 + + test_extracted_bad_version = self.version_comparator.extract_os_version_nums( + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c") # return "" + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_bad_version, "1.2.25"), -1) # less "" != 1.2.25 + + def test_linux_extension_sort_comparator(self): + """ Test sorting comparator on linux patch extension """ + unsorted_lpe_versions = [ + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", + ] + + expected_sorted_lpe_versions = [ + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" + ] + + # validate sorted lpe versions + self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) def test_linux_os_version_extract_comparator(self): """ Test extract version logic on Ubuntuproclient version """ @@ -56,42 +97,18 @@ def test_linux_os_version_extract_comparator(self): self.assertEqual(self.version_comparator.extract_os_version_nums("abc.34.13.4!@abc"), "34.13.4") def test_linux_os_version_comparison(self): - """ Test compare versions logic Ubuntuproclient version """ - test_extracted_v1 = self.version_comparator.extract_os_version_nums("34.13.4~18.04.1") - test_extracted_v2 = self.version_comparator.extract_os_version_nums("34.13.4!34.1.2.3-ab+18.04.1") - test_extracted_v3 = self.version_comparator.extract_os_version_nums("34.13.4~25.6aa#@bc") - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v1, "34.13.4"), 0) # equal - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v2, "34.13.3"), 1) # greater - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_v3, "34.13.5"), -1) # less + """ Test compare versions logic Ubuntuproclient version with existing vm version """ + test_extracted_good_version = self.version_comparator.extract_os_version_nums("34.13.4~18.04.1") # return 34 - def test_linux_extension_sort_comparator(self): - - # Test sort lpe versions - unsorted_lpe_versions = [ - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", - ] - - expected_sorted_lpe_versions = [ - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" - ] + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "34.13.4"), 0) # equal 34.13.4 == 34.13.4 + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "34.13.3"), 1) # greater 34.13.4 > 34.13.3 + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "34.13.5"), -1) # less 34.13.4 < 34.13.5 - # validate sorted lpe versions - self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) + test_extracted_bad_version = self.version_comparator.extract_os_version_nums("abc~18.04.1") # return "" + self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_bad_version, "34.13.4"), -1) # less "" < 34.13.4 def test_os_version_sort_comparator(self): - """ Test sort os versions """ + """ Test sorting comparator on linux os version """ unsorted_os_versions = [ "32.101.~18.01", "32.101.15~18", @@ -113,4 +130,3 @@ def test_os_version_sort_comparator(self): if __name__ == '__main__': unittest.main() - diff --git a/src/extension/src/VersionComparatorHandler.py b/src/extension/src/VersionComparatorHandler.py index 5e5c2ec1..2037cfdf 100644 --- a/src/extension/src/VersionComparatorHandler.py +++ b/src/extension/src/VersionComparatorHandler.py @@ -13,7 +13,7 @@ # limitations under the License. # # Requires Python 2.7+ - +import os.path import re @@ -23,20 +23,22 @@ def extract_lpe_path_version_num(self, lpe_path): # type (str) -> str """ Extract the version part from a given lpe path. - Input Extracted Version - LinuxPatchExtension-1.2.25 "1.2.25" - LinuxPatchExtension-1.2.250 "1.2.250" - LinuxPatchExtension-1.21.2501 "1.21.2501" - LinuxPatchExtension-1.2.25. "1.2.25" - LinuxPatchExtension-1.2.25.. "1.2.25" - LinuxPatchExtension-1.2.25abc "1.2.25" - LinuxPatchExtension-1.2.25.abc "1.2.25" - LinuxPatchExtension-1.2.25+abc.123 "1.2.25" - LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" - LinuxPatchExtension-a.b.c "" + Input Extracted Version + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250 "1.2.250" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501 "1.21.2501" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25. "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.. "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c "" """ - match = re.search(r'LinuxPatchExtension-(\d+(?:\.\d+)*)', lpe_path) # extract numbers with optional dot-separated parts - return match.group(1).rstrip('.') if match else "" + + lpe_filename = os.path.basename(lpe_path) # Microsoft.CPlat.Core.LinuxPatchExtension-x.x.xx + lpe_version = re.search(r'(\d+(?:\.\d+)*)', lpe_filename) # extract numbers with optional dot-separated parts + return lpe_version.group(1).rstrip('.') if lpe_version else "" def extract_os_version_nums(self, os_version): # type (str) -> str @@ -58,21 +60,21 @@ def extract_os_version_nums(self, os_version): 34.13.4abc-18.04.1 34.13.4 abc.34.13.4!@abc 34.13.4 """ - match = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts - return match.group(1) if match else str() + version_num = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts + return version_num.group(1) if version_num else str() - def sort_versions_desc_order(self, paths): + def sort_versions_desc_order(self, version_list): # type (list[str]) -> list[str] """ Sort paths based on version numbers extracted from paths. Lpe input: - ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] + ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] Return: - ["Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] + ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] Os Version input: ["32.101~18.01", @@ -88,20 +90,20 @@ def sort_versions_desc_order(self, paths): "32.1~18.04.01", "32~18.04.01"] """ - return sorted(paths, key=self.__version_key,reverse=True) + return sorted(version_list, key=self.__version_key,reverse=True) - def __version_key(self, path): + def __version_key(self, version_input): # type (str) -> (int) """ Extract version number from input and return int tuple. - Input: "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" + Input: "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" Return: (1.6.100) os version input: "34~18.04" Return: (34) """ - if "LinuxPatchExtension" in path: - version_numbers = self.extract_lpe_path_version_num(lpe_path=path) + if "LinuxPatchExtension" in version_input: + version_numbers = self.extract_lpe_path_version_num(lpe_path=version_input) else: - version_numbers = self.extract_os_version_nums(os_version=path) + version_numbers = self.extract_os_version_nums(os_version=version_input) return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) diff --git a/src/extension/tests/Test_VersionComparatorHandler.py b/src/extension/tests/Test_VersionComparatorHandler.py index 12be3177..fa220eb0 100644 --- a/src/extension/tests/Test_VersionComparatorHandler.py +++ b/src/extension/tests/Test_VersionComparatorHandler.py @@ -24,16 +24,41 @@ def setUp(self): self.version_comparator_handler = VersionComparatorHandler() def test_linux_extension_version_extract_comparator_handler(self): - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("Users\Smith~123\AppData\tmp5a42j2ua\Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") + self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + + def test_linux_extension_sort_comparator_handler(self): + """Test sorting comparator on linux extension versions """ + unsorted_lpe_versions = [ + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", + ] + + expected_sorted_lpe_versions = [ + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" + ] + + # validate sorted lpe versions + self.assertEqual(self.version_comparator_handler.sort_versions_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) def test_linux_os_version_extract_comparator_handler(self): """ Test extract version logic on Ubuntuproclient version """ @@ -53,33 +78,8 @@ def test_linux_os_version_extract_comparator_handler(self): self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4abc-18.04.1"), "34.13.4") self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc.34.13.4!@abc"), "34.13.4") - - def test_linux_extension_sort_comparator_handler(self): - """Test version comparator sorting logic on linux extension versions """ - unsorted_path_versions = [ - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", - ] - - expected_sorted_path_versions = [ - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" - ] - - # validate sorted lpe versions - self.assertEqual(self.version_comparator_handler.sort_versions_desc_order(unsorted_path_versions), expected_sorted_path_versions) - - def test_os_version_sort_comparator_handler(self): - """Test version comparator sorting logic on linux os versions """ + """Test sorting comparator on linux os versions """ unsorted_os_versions = [ "32.101.~18.01", "32.101.15~18", From 2f28261df7ed7c3548084fa09ae561a4ed1ef548 Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 13 Mar 2025 15:15:55 -0700 Subject: [PATCH 6/9] use constant for linuxpatchextenstion --- src/core/src/bootstrap/Constants.py | 5 ++++- src/core/src/core_logic/VersionComparator.py | 4 +++- src/extension/src/Constants.py | 3 +++ src/extension/src/VersionComparatorHandler.py | 4 +++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/core/src/bootstrap/Constants.py b/src/core/src/bootstrap/Constants.py index e7e71d69..24dfcfc0 100644 --- a/src/core/src/bootstrap/Constants.py +++ b/src/core/src/bootstrap/Constants.py @@ -375,7 +375,7 @@ class EnvLayer(EnumBackport): class UbuntuProClientSettings(EnumBackport): FEATURE_ENABLED = True MINIMUM_PYTHON_VERSION_REQUIRED = (3, 5) # using tuple as we can compare this with sys.version_info. The comparison will happen in the same order. Major version checked first. Followed by Minor version. - MAX_OS_MAJOR_VERSION_SUPPORTED = 20 + MAX_OS_MAJOR_VERSION_SUPPORTED = 22 MINIMUM_CLIENT_VERSION = "27.14.4" class BufferMessage(EnumBackport): @@ -383,3 +383,6 @@ class BufferMessage(EnumBackport): FALSE = 1 FLUSH = 2 + class VersionComparator(EnumBackport): + LINUXPATCHEXTENSION = "LinuxPatchExtension" + diff --git a/src/core/src/core_logic/VersionComparator.py b/src/core/src/core_logic/VersionComparator.py index 7f46df1a..7bf9958d 100644 --- a/src/core/src/core_logic/VersionComparator.py +++ b/src/core/src/core_logic/VersionComparator.py @@ -16,6 +16,8 @@ import os.path import re +from core.src.bootstrap.Constants import Constants + class VersionComparator(object): @@ -118,7 +120,7 @@ def __version_key(self, version_input): os version input: "34~18.04" Return: (34) """ - if "LinuxPatchExtension" in version_input: + if Constants.VersionComparator.LINUXPATCHEXTENSION in version_input: version_numbers = self.extract_lpe_path_version_num(lpe_path=version_input) else: version_numbers = self.extract_os_version_nums(os_version=version_input) diff --git a/src/extension/src/Constants.py b/src/extension/src/Constants.py index d0573e08..335271c1 100644 --- a/src/extension/src/Constants.py +++ b/src/extension/src/Constants.py @@ -224,3 +224,6 @@ class AgentEnvVarStatusCode(EnumBackport): AGENT_ENABLED = "AGENT_ENABLED" FAILED_TO_GET_AGENT_SUPPORTED_FEATURES = "FAILED_TO_GET_AGENT_SUPPORTED_FEATURES" FAILED_TO_GET_TELEMETRY_KEY = "FAILED_TO_GET_TELEMETRY_KEY" + + class VersionComparatorHandler(EnumBackport): + LINUXPATCHEXTENSION = "LinuxPatchExtension" diff --git a/src/extension/src/VersionComparatorHandler.py b/src/extension/src/VersionComparatorHandler.py index 2037cfdf..1d669b7d 100644 --- a/src/extension/src/VersionComparatorHandler.py +++ b/src/extension/src/VersionComparatorHandler.py @@ -16,6 +16,8 @@ import os.path import re +from extension.src.Constants import Constants + class VersionComparatorHandler(object): @@ -101,7 +103,7 @@ def __version_key(self, version_input): os version input: "34~18.04" Return: (34) """ - if "LinuxPatchExtension" in version_input: + if Constants.VersionComparatorHandler.LINUXPATCHEXTENSION in version_input: version_numbers = self.extract_lpe_path_version_num(lpe_path=version_input) else: version_numbers = self.extract_os_version_nums(os_version=version_input) From b68f39dc707bf296779b50845e0a3ccc260a7342 Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 13 Mar 2025 15:18:09 -0700 Subject: [PATCH 7/9] change MAX_OS_MAJOR_VERSION_SUPPORTED to 20 --- src/core/src/bootstrap/Constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/src/bootstrap/Constants.py b/src/core/src/bootstrap/Constants.py index 24dfcfc0..3c447d11 100644 --- a/src/core/src/bootstrap/Constants.py +++ b/src/core/src/bootstrap/Constants.py @@ -375,7 +375,7 @@ class EnvLayer(EnumBackport): class UbuntuProClientSettings(EnumBackport): FEATURE_ENABLED = True MINIMUM_PYTHON_VERSION_REQUIRED = (3, 5) # using tuple as we can compare this with sys.version_info. The comparison will happen in the same order. Major version checked first. Followed by Minor version. - MAX_OS_MAJOR_VERSION_SUPPORTED = 22 + MAX_OS_MAJOR_VERSION_SUPPORTED = 20 MINIMUM_CLIENT_VERSION = "27.14.4" class BufferMessage(EnumBackport): From 3b411bf00dbc24ea4ef387e700c24ca6b6e865cf Mon Sep 17 00:00:00 2001 From: Koshy John Date: Fri, 14 Mar 2025 10:56:49 -0700 Subject: [PATCH 8/9] Version Comparator Comments as Code on PR Branch (#296) --- src/core/src/bootstrap/Constants.py | 4 - src/core/src/core_logic/VersionComparator.py | 80 ++---------- .../src/package_managers/UbuntuProClient.py | 4 +- src/core/tests/Test_VersionComparator.py | 118 ++++-------------- src/extension/src/ActionHandler.py | 7 +- ...atorHandler.py => ExtVersionComparator.py} | 80 ++++-------- .../tests/Test_ExtVersionComparator.py | 65 ++++++++++ .../tests/Test_VersionComparatorHandler.py | 100 --------------- 8 files changed, 128 insertions(+), 330 deletions(-) rename src/extension/src/{VersionComparatorHandler.py => ExtVersionComparator.py} (66%) create mode 100644 src/extension/tests/Test_ExtVersionComparator.py delete mode 100644 src/extension/tests/Test_VersionComparatorHandler.py diff --git a/src/core/src/bootstrap/Constants.py b/src/core/src/bootstrap/Constants.py index 3c447d11..11a61985 100644 --- a/src/core/src/bootstrap/Constants.py +++ b/src/core/src/bootstrap/Constants.py @@ -382,7 +382,3 @@ class BufferMessage(EnumBackport): TRUE = 0 FALSE = 1 FLUSH = 2 - - class VersionComparator(EnumBackport): - LINUXPATCHEXTENSION = "LinuxPatchExtension" - diff --git a/src/core/src/core_logic/VersionComparator.py b/src/core/src/core_logic/VersionComparator.py index 7bf9958d..4faf2e76 100644 --- a/src/core/src/core_logic/VersionComparator.py +++ b/src/core/src/core_logic/VersionComparator.py @@ -13,15 +13,12 @@ # limitations under the License. # # Requires Python 2.7+ -import os.path import re -from core.src.bootstrap.Constants import Constants - class VersionComparator(object): - def compare_version_nums(self, version_a, version_b): + def compare_versions(self, version_a, version_b): # type (str, str) -> int """ Compare two versions with handling numeric and string parts, return -1 (less), +1 (greater), 0 (equal) """ @@ -38,28 +35,8 @@ def compare_version_nums(self, version_a, version_b): # If equal 27.13.4 vs 27.13.4, return 0 return (len(parse_version_a) > len(parse_version_b)) - (len(parse_version_a) < len(parse_version_b)) - def extract_lpe_path_version_num(self, lpe_path): - # type (str) -> str - """ - Extract the version part from a given lpe path. - Input Extracted Version - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25 "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250 "1.2.250" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501 "1.21.2501" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25. "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.. "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123 "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c "" - """ - - lpe_filename = os.path.basename(lpe_path) # Microsoft.CPlat.Core.LinuxPatchExtension-x.x.xx - lpe_version = re.search(r'(\d+(?:\.\d+)*)', lpe_filename) # extract numbers with optional dot-separated parts - return lpe_version.group(1).rstrip('.') if lpe_version else "" - - def extract_os_version_nums(self, os_version): + @staticmethod + def extract_version_from_os_version_nums(os_version): # type (str) -> str """ Extract the version part from a given os version. @@ -82,59 +59,22 @@ def extract_os_version_nums(self, os_version): version_num = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts return version_num.group(1) if version_num else str() - def sort_versions_desc_order(self, version_list): - # type (list[str]) -> list[str] - """ - Sort paths based on version numbers extracted from paths. - Lpe input: - ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100"] - Return: - ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] - - Os Version input: - ["32.101~18.01", - "32.101.15~18", - "34~18.04", - "32~18.04.01", - "32.1~18.04.01"] - - return: - ["34~18.04", - "32.101.15~18", - "32.101~18.01", - "32.1~18.04.01", - "32~18.04.01"] - """ - return sorted(version_list, key=self.__version_key, reverse=True) - def __version_key(self, version_input): # type (str) -> (int) """ Extract version number from input and return int tuple. - Lpe input: "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" - Return: (1.6.100) - os version input: "34~18.04" Return: (34) """ - if Constants.VersionComparator.LINUXPATCHEXTENSION in version_input: - version_numbers = self.extract_lpe_path_version_num(lpe_path=version_input) - else: - version_numbers = self.extract_os_version_nums(os_version=version_input) - + version_numbers = self.extract_version_from_os_version_nums(os_version=version_input) return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) - def __split_version_components(self, version): - # type (str) -> [any] - """ Split a version into numeric and non-numeric into components list: 27.13.4~18.04.1 -> [27][14][4]""" - return [int(x) if x.isdigit() else x for x in re.split(r'(\d+)', version) if x] - def __parse_version(self, version_components): # type (str) -> [[any]] - """ Parse the split version list into list [27][14][4] -> [[27], [14], [4]]""" + """ Parse the split version list into list [27][14][4] -> [[27], [14], [4]] """ return [self.__split_version_components(x) for x in version_components.split(".")] - + @staticmethod + def __split_version_components(version): + # type (str) -> [any] + """ Splits a version into numeric and non-numeric into components list: 27.13.4~18.04.1 -> [27][14][4] """ + return [int(x) if x.isdigit() else x for x in re.split(r'(\d+)', version) if x] diff --git a/src/core/src/package_managers/UbuntuProClient.py b/src/core/src/package_managers/UbuntuProClient.py index b7544d01..b445cc32 100644 --- a/src/core/src/package_managers/UbuntuProClient.py +++ b/src/core/src/package_managers/UbuntuProClient.py @@ -57,12 +57,12 @@ def is_pro_working(self): ubuntu_pro_client_version = version_result.installed_version # extract version from pro_client_verison 27.13.4~18.04.1 -> 27.13.4 - extracted_ubuntu_pro_client_version = self.version_comparator.extract_os_version_nums(ubuntu_pro_client_version) + extracted_ubuntu_pro_client_version = self.version_comparator.extract_version_from_os_version_nums(ubuntu_pro_client_version) self.composite_logger.log_debug("Ubuntu Pro Client current version: [ClientVersion={0}]".format(str(extracted_ubuntu_pro_client_version))) # use custom comparator output 0 (equal), -1 (less), +1 (greater) - is_minimum_ubuntu_pro_version_installed = self.version_comparator.compare_version_nums(extracted_ubuntu_pro_client_version, Constants.UbuntuProClientSettings.MINIMUM_CLIENT_VERSION) >= 0 + is_minimum_ubuntu_pro_version_installed = self.version_comparator.compare_versions(extracted_ubuntu_pro_client_version, Constants.UbuntuProClientSettings.MINIMUM_CLIENT_VERSION) >= 0 if ubuntu_pro_client_version is not None and is_minimum_ubuntu_pro_version_installed: is_ubuntu_pro_client_working = True diff --git a/src/core/tests/Test_VersionComparator.py b/src/core/tests/Test_VersionComparator.py index a42d8468..a53d0bd8 100644 --- a/src/core/tests/Test_VersionComparator.py +++ b/src/core/tests/Test_VersionComparator.py @@ -24,108 +24,34 @@ class TestVersionComparator(unittest.TestCase): def setUp(self): self.version_comparator = VersionComparator() - def test_linux_extension_version_extract_comparator(self): - """ Test extract version logic on Extension package """ - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), - "1.21.2501") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), - "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), - "1.2.25") - self.assertEqual(self.version_comparator.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") - - def test_linux_lpe_version_comparison(self): - """ Test compare versions logic lpe version with existing vm version """ - test_extracted_good_version = self.version_comparator.extract_os_version_nums( - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25") # return 1.2.25 - - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "1.2.25"), 0) # equal 1.2.25 == 1.2.25 - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "1.2.24"), 1) # greater 1.2.25 > 1.2.24 - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "1.19.25"), -1) # less 1.2.25 < 1.19.25, 19 > 2 - - test_extracted_bad_version = self.version_comparator.extract_os_version_nums( - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c") # return "" - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_bad_version, "1.2.25"), -1) # less "" != 1.2.25 - - def test_linux_extension_sort_comparator(self): - """ Test sorting comparator on linux patch extension """ - unsorted_lpe_versions = [ - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", - ] - - expected_sorted_lpe_versions = [ - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" - ] - - # validate sorted lpe versions - self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) - - def test_linux_os_version_extract_comparator(self): + def test_extract_version_from_os_version_nums(self): """ Test extract version logic on Ubuntuproclient version """ - self.assertEqual(self.version_comparator.extract_os_version_nums("34"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("34~18"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("34.~18.04"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("34.a+18.04.1"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("34abc-18.04"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("abc34~18.04"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("abc34~18.04.123"), "34") - self.assertEqual(self.version_comparator.extract_os_version_nums("34~25.1.2-18.04.1"), "34") - - self.assertEqual(self.version_comparator.extract_os_version_nums("34.1~18.04.1"), "34.1") - self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4"), "34.13.4") - self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4~18.04.1"), "34.13.4") - self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4-ab+18.04.1"), "34.13.4") - self.assertEqual(self.version_comparator.extract_os_version_nums("34.13.4abc-18.04.1"), "34.13.4") - self.assertEqual(self.version_comparator.extract_os_version_nums("abc.34.13.4!@abc"), "34.13.4") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34~18"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.~18.04"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.a+18.04.1"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34abc-18.04"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("abc34~18.04"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("abc34~18.04.123"), "34") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34~25.1.2-18.04.1"), "34") + + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.1~18.04.1"), "34.1") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.13.4"), "34.13.4") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.13.4~18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.13.4-ab+18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("34.13.4abc-18.04.1"), "34.13.4") + self.assertEqual(self.version_comparator.extract_version_from_os_version_nums("abc.34.13.4!@abc"), "34.13.4") def test_linux_os_version_comparison(self): """ Test compare versions logic Ubuntuproclient version with existing vm version """ - test_extracted_good_version = self.version_comparator.extract_os_version_nums("34.13.4~18.04.1") # return 34 - - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "34.13.4"), 0) # equal 34.13.4 == 34.13.4 - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "34.13.3"), 1) # greater 34.13.4 > 34.13.3 - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_good_version, "34.13.5"), -1) # less 34.13.4 < 34.13.5 - - test_extracted_bad_version = self.version_comparator.extract_os_version_nums("abc~18.04.1") # return "" - self.assertEqual(self.version_comparator.compare_version_nums(test_extracted_bad_version, "34.13.4"), -1) # less "" < 34.13.4 - - def test_os_version_sort_comparator(self): - """ Test sorting comparator on linux os version """ - unsorted_os_versions = [ - "32.101.~18.01", - "32.101.15~18", - "abc34~18.04", - "32~18.04.01", - "32.1~18.04.01" - ] + test_extracted_good_version = self.version_comparator.extract_version_from_os_version_nums("34.13.4~18.04.1") # return 34 - expected_sorted_os_versions = [ - "abc34~18.04", - "32.101.15~18", - "32.101.~18.01", - "32.1~18.04.01", - "32~18.04.01" - ] + self.assertEqual(self.version_comparator.compare_versions(test_extracted_good_version, "34.13.4"), 0) # equal 34.13.4 == 34.13.4 + self.assertEqual(self.version_comparator.compare_versions(test_extracted_good_version, "34.13.3"), 1) # greater 34.13.4 > 34.13.3 + self.assertEqual(self.version_comparator.compare_versions(test_extracted_good_version, "34.13.5"), -1) # less 34.13.4 < 34.13.5 - self.assertEqual(self.version_comparator.sort_versions_desc_order(unsorted_os_versions), expected_sorted_os_versions) + test_extracted_bad_version = self.version_comparator.extract_version_from_os_version_nums("abc~18.04.1") # return "" + self.assertEqual(self.version_comparator.compare_versions(test_extracted_bad_version, "34.13.4"), -1) # less "" < 34.13.4 if __name__ == '__main__': diff --git a/src/extension/src/ActionHandler.py b/src/extension/src/ActionHandler.py index 26e211f3..9e753c6d 100644 --- a/src/extension/src/ActionHandler.py +++ b/src/extension/src/ActionHandler.py @@ -23,8 +23,7 @@ from extension.src.Constants import Constants from extension.src.EnableCommandHandler import EnableCommandHandler from extension.src.InstallCommandHandler import InstallCommandHandler -from extension.src.Utility import Utility -from extension.src.VersionComparatorHandler import VersionComparatorHandler +from extension.src.ExtVersionComparator import ExtVersionComparator from extension.src.local_loggers.StdOutFileMirror import StdOutFileMirror @@ -49,7 +48,7 @@ def __init__(self, logger, env_layer, telemetry_writer, utility, runtime_context self.file_logger = None self.operation_id_substitute_for_all_actions_in_telemetry = str((datetime.datetime.utcnow()).strftime(Constants.UTC_DATETIME_FORMAT)) self.seq_no = self.ext_config_settings_handler.get_seq_no_from_env_var() - self.version_comparator_handler = VersionComparatorHandler() + self.ext_version_comparator = ExtVersionComparator() def determine_operation(self, command): switcher = { @@ -228,7 +227,7 @@ def update(self): self.logger.log("Fetching the extension version preceding current from all available versions...") # use custom sort logic to sort path based on version numbers - sorted_versions = self.version_comparator_handler.sort_versions_desc_order(paths_to_all_versions) + sorted_versions = self.ext_version_comparator.sort_ext_paths_desc_order(paths_to_all_versions) self.logger.log_debug("List of extension versions in descending order: [SortedVersion={0}]".format(sorted_versions)) preceding_version_path = sorted_versions[1] diff --git a/src/extension/src/VersionComparatorHandler.py b/src/extension/src/ExtVersionComparator.py similarity index 66% rename from src/extension/src/VersionComparatorHandler.py rename to src/extension/src/ExtVersionComparator.py index 1d669b7d..60036078 100644 --- a/src/extension/src/VersionComparatorHandler.py +++ b/src/extension/src/ExtVersionComparator.py @@ -16,56 +16,10 @@ import os.path import re -from extension.src.Constants import Constants +class ExtVersionComparator(object): -class VersionComparatorHandler(object): - - def extract_lpe_path_version_num(self, lpe_path): - # type (str) -> str - """ - Extract the version part from a given lpe path. - Input Extracted Version - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25 "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250 "1.2.250" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501 "1.21.2501" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25. "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.. "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123 "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" - /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c "" - """ - - lpe_filename = os.path.basename(lpe_path) # Microsoft.CPlat.Core.LinuxPatchExtension-x.x.xx - lpe_version = re.search(r'(\d+(?:\.\d+)*)', lpe_filename) # extract numbers with optional dot-separated parts - return lpe_version.group(1).rstrip('.') if lpe_version else "" - - def extract_os_version_nums(self, os_version): - # type (str) -> str - """ - Extract the version part from a given os version. - Input os version Extracted Version - 34 34 - 34~18 34 - 34.~18.04 34 - 34.a+18.04.1 34 - 34abc-18.04 34 - abc34~18.04 34 - abc34~18.04.123 34 - 34~25.1.2-18.04.1 34 - 34.1~18.04.1 34.1 - 34.13.4 34.13.4 - 34.13.4~18.04.1 34.13.4 - 34.13.4-ab+18.04.1 34.13.4 - 34.13.4abc-18.04.1 34.13.4 - abc.34.13.4!@abc 34.13.4 - """ - version_num = re.search(r'(\d+(?:\.\d+)*)', os_version) # extract numbers with optional dot-separated parts - return version_num.group(1) if version_num else str() - - def sort_versions_desc_order(self, version_list): + def sort_ext_paths_desc_order(self, ext_paths_with_versions): # type (list[str]) -> list[str] """ Sort paths based on version numbers extracted from paths. @@ -92,7 +46,29 @@ def sort_versions_desc_order(self, version_list): "32.1~18.04.01", "32~18.04.01"] """ - return sorted(version_list, key=self.__version_key,reverse=True) + return sorted(ext_paths_with_versions, key=self.__version_key, reverse=True) + + @staticmethod + def __extract_lpe_path_version_num(lpe_path): + # type (str) -> str + """ + Extract the version part from a given lpe path. + Input Extracted Version + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250 "1.2.250" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501 "1.21.2501" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25. "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.. "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123 "1.2.25" + /var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c "" + """ + + lpe_filename = os.path.basename(lpe_path) # Microsoft.CPlat.Core.LinuxPatchExtension-x.x.xx + lpe_version = re.search(r'(\d+(?:\.\d+)*)', lpe_filename) # extract numbers with optional dot-separated parts + return lpe_version.group(1).rstrip('.') if lpe_version else "" def __version_key(self, version_input): # type (str) -> (int) @@ -103,9 +79,5 @@ def __version_key(self, version_input): os version input: "34~18.04" Return: (34) """ - if Constants.VersionComparatorHandler.LINUXPATCHEXTENSION in version_input: - version_numbers = self.extract_lpe_path_version_num(lpe_path=version_input) - else: - version_numbers = self.extract_os_version_nums(os_version=version_input) - + version_numbers = self.__extract_lpe_path_version_num(lpe_path=version_input) return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0) diff --git a/src/extension/tests/Test_ExtVersionComparator.py b/src/extension/tests/Test_ExtVersionComparator.py new file mode 100644 index 00000000..699d023a --- /dev/null +++ b/src/extension/tests/Test_ExtVersionComparator.py @@ -0,0 +1,65 @@ +# Copyright 2024 Microsoft Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Requires Python 2.7+ + +import unittest +from extension.src.ExtVersionComparator import ExtVersionComparator + + +class TestVersionComparator(unittest.TestCase): + + def setUp(self): + self.ext_version_comparator = ExtVersionComparator() + + def test_linux_extension_version_extract_comparator(self): + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") + self.assertEqual(self.ext_version_comparator._ExtVersionComparator__extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") + + def test_linux_extension_sort_comparator(self): + """Test sorting comparator on linux extension versions """ + unsorted_lpe_versions = [ + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1000", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", + ] + + expected_sorted_lpe_versions = [ + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1000", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", + "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" + ] + + # validate sorted lpe versions + self.assertEqual(self.ext_version_comparator.sort_ext_paths_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) diff --git a/src/extension/tests/Test_VersionComparatorHandler.py b/src/extension/tests/Test_VersionComparatorHandler.py deleted file mode 100644 index fa220eb0..00000000 --- a/src/extension/tests/Test_VersionComparatorHandler.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright 2024 Microsoft Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Requires Python 2.7+ - -import unittest -from extension.src.VersionComparatorHandler import VersionComparatorHandler - - -class TestVersionComparatorHandler(unittest.TestCase): - - def setUp(self): - self.version_comparator_handler = VersionComparatorHandler() - - def test_linux_extension_version_extract_comparator_handler(self): - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.250"), "1.2.250") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.2501"), "1.21.2501") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25."), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.."), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25abc"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25.abc"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25+abc.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123"), "1.2.25") - self.assertEqual(self.version_comparator_handler.extract_lpe_path_version_num("/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-a.b.c"), "") - - def test_linux_extension_sort_comparator_handler(self): - """Test sorting comparator on linux extension versions """ - unsorted_lpe_versions = [ - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", - ] - - expected_sorted_lpe_versions = [ - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.99", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.9", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc+def.123", - "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.2.25-abc" - ] - - # validate sorted lpe versions - self.assertEqual(self.version_comparator_handler.sort_versions_desc_order(unsorted_lpe_versions), expected_sorted_lpe_versions) - - def test_linux_os_version_extract_comparator_handler(self): - """ Test extract version logic on Ubuntuproclient version """ - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34~18"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.~18.04"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.a+18.04.1"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34abc-18.04"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc34~18.04"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc34~18.04.123"), "34") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34~25.1.2-18.04.1"), "34") - - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.1~18.04.1"), "34.1") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4"), "34.13.4") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4~18.04.1"), "34.13.4") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4-ab+18.04.1"), "34.13.4") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("34.13.4abc-18.04.1"), "34.13.4") - self.assertEqual(self.version_comparator_handler.extract_os_version_nums("abc.34.13.4!@abc"), "34.13.4") - - def test_os_version_sort_comparator_handler(self): - """Test sorting comparator on linux os versions """ - unsorted_os_versions = [ - "32.101.~18.01", - "32.101.15~18", - "abc34~18.04", - "32~18.04.01", - "32.1~18.04.01" - ] - - expected_sorted_os_versions = [ - "abc34~18.04", - "32.101.15~18", - "32.101.~18.01", - "32.1~18.04.01", - "32~18.04.01" - ] - - self.assertEqual(self.version_comparator_handler.sort_versions_desc_order(unsorted_os_versions), expected_sorted_os_versions) - From a7222629afc33a69e7fa3875b371e2b6155747f5 Mon Sep 17 00:00:00 2001 From: john feng Date: Fri, 14 Mar 2025 11:10:26 -0700 Subject: [PATCH 9/9] remove linuxpatchextension constants and os version comments in handler --- src/extension/src/Constants.py | 3 --- src/extension/src/ExtVersionComparator.py | 19 ++----------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/extension/src/Constants.py b/src/extension/src/Constants.py index 335271c1..d0573e08 100644 --- a/src/extension/src/Constants.py +++ b/src/extension/src/Constants.py @@ -224,6 +224,3 @@ class AgentEnvVarStatusCode(EnumBackport): AGENT_ENABLED = "AGENT_ENABLED" FAILED_TO_GET_AGENT_SUPPORTED_FEATURES = "FAILED_TO_GET_AGENT_SUPPORTED_FEATURES" FAILED_TO_GET_TELEMETRY_KEY = "FAILED_TO_GET_TELEMETRY_KEY" - - class VersionComparatorHandler(EnumBackport): - LINUXPATCHEXTENSION = "LinuxPatchExtension" diff --git a/src/extension/src/ExtVersionComparator.py b/src/extension/src/ExtVersionComparator.py index 60036078..2a0842e0 100644 --- a/src/extension/src/ExtVersionComparator.py +++ b/src/extension/src/ExtVersionComparator.py @@ -31,21 +31,8 @@ def sort_ext_paths_desc_order(self, ext_paths_with_versions): ["/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.1001", "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.21.100", "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100"] - - Os Version input: - ["32.101~18.01", - "32.101.15~18", - "34~18.04", - "32~18.04.01", - "32.1~18.04.01"] - - return: - ["34~18.04", - "32.101.15~18", - "32.101~18.01", - "32.1~18.04.01", - "32~18.04.01"] """ + return sorted(ext_paths_with_versions, key=self.__version_key, reverse=True) @staticmethod @@ -75,9 +62,7 @@ def __version_key(self, version_input): """ Extract version number from input and return int tuple. Input: "/var/lib/waagent/Microsoft.CPlat.Core.LinuxPatchExtension-1.6.100" Return: (1.6.100) - - os version input: "34~18.04" - Return: (34) """ + version_numbers = self.__extract_lpe_path_version_num(lpe_path=version_input) return tuple(map(int, version_numbers.split('.'))) if version_numbers else (0, 0, 0)