From 175c2ac7094867c227aec31d2f71862f8153e72a Mon Sep 17 00:00:00 2001 From: john feng Date: Wed, 23 Apr 2025 11:18:14 -0700 Subject: [PATCH 01/12] add function to check image is rhel --- src/core/src/package_managers/YumPackageManager.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index 1773fb75..7154aa6f 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -184,7 +184,16 @@ def __is_image_rhel8_or_higher(self): return True return False + + def __is_image_rhel(self): + """ Check if image is RHEL return true else false """ + if self.env_layer.platform.linux_distribution() is not None: + if "Red Hat Enterprise Linux" in self.env_layer.platform.linux_distribution(): + self.composite_logger.log_debug("[YPM] RHEL image detected. Apply " ) + return True + return False + def set_max_patch_publish_date(self, max_patch_publish_date=str()): pass From be0ce8dfdcedd87941bdebbd3fc8c5668868329a Mon Sep 17 00:00:00 2001 From: john feng Date: Mon, 28 Apr 2025 08:44:47 -0700 Subject: [PATCH 02/12] add check for rhel iamge to perform ssl fix --- .../src/package_managers/YumPackageManager.py | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index 7154aa6f..51deab03 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -95,8 +95,6 @@ def __init__(self, env_layer, execution_config, composite_logger, telemetry_writ "Error: Cannot retrieve repository metadata (repomd.xml) for repository": self.fix_ssl_certificate_issue, "Error: Failed to download metadata for repo": self.fix_ssl_certificate_issue} - self.yum_update_client_package = "sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" - self.package_install_expected_avg_time_in_seconds = 90 # As per telemetry data, the average time to install package is around 90 seconds for yum. def refresh_repo(self): @@ -189,7 +187,7 @@ def __is_image_rhel(self): """ Check if image is RHEL return true else false """ if self.env_layer.platform.linux_distribution() is not None: if "Red Hat Enterprise Linux" in self.env_layer.platform.linux_distribution(): - self.composite_logger.log_debug("[YPM] RHEL image detected. Apply " ) + self.composite_logger.log_debug("[YPM] RHEL image detected. Attempting to fix SSL certificate issue by updating the client package...") return True return False @@ -902,11 +900,19 @@ def check_known_issues_and_attempt_fix(self, output): return False def fix_ssl_certificate_issue(self): - command = self.yum_update_client_package - self.composite_logger.log_debug("[Customer-environment-error] Updating client package to avoid errors from older certificates using command: [Command={0}]".format(str(command))) + """ Fixes the SSL certificate issue by updating the client package """ + if not self.__is_image_rhel(): + error_msg = 'Customer environment error (expired SSL certs)' + self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) + raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) + + # Image is rhel, attempt to update the client package + command = "sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" + self.composite_logger.log_debug("[YPM][Customer-environment-error] Updating client package to avoid errors from older certificates using command: [Command={0}]".format(str(command))) code, out = self.env_layer.run_command_output(command, False, False) + if code != self.yum_exitcode_no_applicable_packages: - error_msg = 'Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command,str(code)) + error_msg = 'Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command, str(code)) self.composite_logger.log_error("{0}[Out={1}]".format(error_msg, out)) self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) @@ -914,7 +920,7 @@ def fix_ssl_certificate_issue(self): self.composite_logger.log_verbose("\n\n==[SUCCESS]===============================================================") self.composite_logger.log_debug("Client package update complete. [Code={0}][Out={1}]".format(str(code), out)) self.composite_logger.log_verbose("==========================================================================\n\n") - + def log_error_mitigation_failure(self, output, raise_on_exception=True): self.composite_logger.log_error("[YPM] Customer Environment Error: Unable to auto-mitigate known issue. Please investigate and address. [Out={0}]".format(output)) if raise_on_exception: From f6b5da83be381842b35e8d03db2842c719d252df Mon Sep 17 00:00:00 2001 From: john feng Date: Mon, 28 Apr 2025 10:23:10 -0700 Subject: [PATCH 03/12] remove unused log --- src/core/src/package_managers/YumPackageManager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index 51deab03..beb60021 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -187,9 +187,7 @@ def __is_image_rhel(self): """ Check if image is RHEL return true else false """ if self.env_layer.platform.linux_distribution() is not None: if "Red Hat Enterprise Linux" in self.env_layer.platform.linux_distribution(): - self.composite_logger.log_debug("[YPM] RHEL image detected. Attempting to fix SSL certificate issue by updating the client package...") return True - return False def set_max_patch_publish_date(self, max_patch_publish_date=str()): From f9d6860e64fd8ade6c21b112b49cef000ef82cc8 Mon Sep 17 00:00:00 2001 From: john feng Date: Wed, 30 Apr 2025 16:29:06 -0700 Subject: [PATCH 04/12] add image details function and prints --- src/core/src/bootstrap/EnvLayer.py | 17 ++++++++++- .../src/package_managers/YumPackageManager.py | 30 +++++++++---------- src/core/tests/Test_YumPackageManager.py | 17 +++++++++++ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/core/src/bootstrap/EnvLayer.py b/src/core/src/bootstrap/EnvLayer.py index 1b351d92..0ea7cff6 100644 --- a/src/core/src/bootstrap/EnvLayer.py +++ b/src/core/src/bootstrap/EnvLayer.py @@ -298,7 +298,22 @@ def linux_distribution(self): else: code, output = self.__read_record(operation) return eval(output) - + + def linux_distribution_images_details(self): + """ + Extract os information: offer, version, code + Returns: + tuple: A tuple containing (os_offer, os_version, os_code). + """ + os_offer, os_version, os_code = None, None, None + if self.linux_distribution() is not None: + try: + os_offer, os_version, os_code = self.linux_distribution() + except (ValueError, TypeError): + print("Failed to extract linux image information") + + return os_offer, os_version, os_code + def system(self): # OS Type operation = "PLATFORM_SYSTEM" if not self.__emulator_enabled: diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index beb60021..987b02f9 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -174,20 +174,19 @@ def get_other_updates(self): def __is_image_rhel8_or_higher(self): """ Check if image is RHEL8+ return true else false """ - if self.env_layer.platform.linux_distribution() is not None: - os_offer, os_version, os_code = self.env_layer.platform.linux_distribution() - - if "Red Hat Enterprise Linux" in os_offer and int(os_version.split('.')[0]) >= 8: - self.composite_logger.log_debug("[YPM] RHEL version >= 8 detected. [DetectedVersion={0}]".format(str(os_version))) - return True - + os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() + if "Red Hat Enterprise Linux" in os_offer and int(os_version.split('.')[0]) >= 8: + self.composite_logger.log_debug("[YPM] RHEL version >= 8 detected. [DetectedVersion={0}]".format(str(os_version))) + return True return False def __is_image_rhel(self): """ Check if image is RHEL return true else false """ - if self.env_layer.platform.linux_distribution() is not None: - if "Red Hat Enterprise Linux" in self.env_layer.platform.linux_distribution(): - return True + print('what is linux distribution', self.env_layer.platform.linux_distribution()) + os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() + if "Red Hat Enterprise Linux" in os_offer: + print('did this get called3') + return True return False def set_max_patch_publish_date(self, max_patch_publish_date=str()): @@ -899,18 +898,19 @@ def check_known_issues_and_attempt_fix(self, output): def fix_ssl_certificate_issue(self): """ Fixes the SSL certificate issue by updating the client package """ - if not self.__is_image_rhel(): - error_msg = 'Customer environment error (expired SSL certs)' + if self.__is_image_rhel() is False: + print('did this called, __is_image_rhel', self.__is_image_rhel()) + error_msg = '[YMP] Customer environment error (expired SSL certs)' self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) - + print('did this called, __is_image_rhel outside') # Image is rhel, attempt to update the client package command = "sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" self.composite_logger.log_debug("[YPM][Customer-environment-error] Updating client package to avoid errors from older certificates using command: [Command={0}]".format(str(command))) code, out = self.env_layer.run_command_output(command, False, False) if code != self.yum_exitcode_no_applicable_packages: - error_msg = 'Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command, str(code)) + error_msg = '[YMP] Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command, str(code)) self.composite_logger.log_error("{0}[Out={1}]".format(error_msg, out)) self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) @@ -922,7 +922,7 @@ def fix_ssl_certificate_issue(self): def log_error_mitigation_failure(self, output, raise_on_exception=True): self.composite_logger.log_error("[YPM] Customer Environment Error: Unable to auto-mitigate known issue. Please investigate and address. [Out={0}]".format(output)) if raise_on_exception: - error_msg = 'Customer environment error (Unable to auto-mitigate known issue): [Out={0}]'.format(output) + error_msg = '[YMP] Customer environment error (Unable to auto-mitigate known issue): [Out={0}]'.format(output) self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) # endregion diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 08d40414..89f80d26 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -42,6 +42,9 @@ def mock_linux7_distribution_to_return_redhat(self): def mock_linux8_distribution_to_return_redhat(self): return ['Red Hat Enterprise Linux Server', '8', 'Ootpa'] + + def mock_is_rhel_image(self): + return ['Red Hat Enterprise Linux Server', '7', 'Maipo'] #endregion Mocks def mock_do_processes_require_restart_raise_exception(self): @@ -756,6 +759,20 @@ def test_get_dependent_list_yum_version_4_update_in_two_lines_with_unexpected_ou package_manager = self.container.get('package_manager') dependent_list = package_manager.get_dependent_list(["polkit.x86_64"]) self.assertEqual(len(dependent_list), 0) + + def test_fix_ssl_cert_issue_success(self): + self.runtime.set_legacy_test_type('SSLCertificateIssueType1HappyPathAfterFix') + + package_manager = self.runtime.container.get('package_manager') + self.assertIsNotNone(package_manager) + + self.runtime.env_layer.platform.linux_distribution = self.mock_is_rhel_image + result = package_manager.fix_ssl_certificate_issue() + + self.assertTrue(result) + + self.runtime.stop() + if __name__ == '__main__': unittest.main() From 199f1d1a2a5e7a83e7b604716380c7c08938b306 Mon Sep 17 00:00:00 2001 From: john feng Date: Wed, 30 Apr 2025 18:11:21 -0700 Subject: [PATCH 05/12] add ut for good ssl cert fix --- .../src/package_managers/YumPackageManager.py | 11 ++++-- src/core/tests/Test_YumPackageManager.py | 35 ++++++++++++++----- .../tests/library/LegacyEnvLayerExtensions.py | 3 ++ 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index 987b02f9..95268538 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -173,6 +173,7 @@ def get_other_updates(self): return other_packages, other_package_versions def __is_image_rhel8_or_higher(self): + # type: () -> bool """ Check if image is RHEL8+ return true else false """ os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() if "Red Hat Enterprise Linux" in os_offer and int(os_version.split('.')[0]) >= 8: @@ -181,6 +182,7 @@ def __is_image_rhel8_or_higher(self): return False def __is_image_rhel(self): + # type: () -> bool """ Check if image is RHEL return true else false """ print('what is linux distribution', self.env_layer.platform.linux_distribution()) os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() @@ -897,24 +899,27 @@ def check_known_issues_and_attempt_fix(self, output): return False def fix_ssl_certificate_issue(self): - """ Fixes the SSL certificate issue by updating the client package """ + # type: () -> None + """ Attempt to fix the SSL certificate issue by updating the client package """ if self.__is_image_rhel() is False: - print('did this called, __is_image_rhel', self.__is_image_rhel()) + print('did this called1, __is_image_rhel', self.__is_image_rhel()) error_msg = '[YMP] Customer environment error (expired SSL certs)' self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) - print('did this called, __is_image_rhel outside') + print('did this called2, __is_image_rhel outside') # Image is rhel, attempt to update the client package command = "sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" self.composite_logger.log_debug("[YPM][Customer-environment-error] Updating client package to avoid errors from older certificates using command: [Command={0}]".format(str(command))) code, out = self.env_layer.run_command_output(command, False, False) if code != self.yum_exitcode_no_applicable_packages: + print('did this called3, code:', code) error_msg = '[YMP] Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command, str(code)) self.composite_logger.log_error("{0}[Out={1}]".format(error_msg, out)) self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) else: + print('did this called4, code:', code) self.composite_logger.log_verbose("\n\n==[SUCCESS]===============================================================") self.composite_logger.log_debug("Client package update complete. [Code={0}][Out={1}]".format(str(code), out)) self.composite_logger.log_verbose("==========================================================================\n\n") diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 89f80d26..abba4bde 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -16,6 +16,13 @@ import json import os import unittest +import sys +# Conditional import for StringIO +try: + from StringIO import StringIO # Python 2 +except ImportError: + from io import StringIO # Python 3 + from core.src.bootstrap.Constants import Constants from core.tests.library.ArgumentComposer import ArgumentComposer from core.tests.library.LegacyEnvLayerExtensions import LegacyEnvLayerExtensions @@ -42,9 +49,6 @@ def mock_linux7_distribution_to_return_redhat(self): def mock_linux8_distribution_to_return_redhat(self): return ['Red Hat Enterprise Linux Server', '8', 'Ootpa'] - - def mock_is_rhel_image(self): - return ['Red Hat Enterprise Linux Server', '7', 'Maipo'] #endregion Mocks def mock_do_processes_require_restart_raise_exception(self): @@ -760,16 +764,31 @@ def test_get_dependent_list_yum_version_4_update_in_two_lines_with_unexpected_ou dependent_list = package_manager.get_dependent_list(["polkit.x86_64"]) self.assertEqual(len(dependent_list), 0) - def test_fix_ssl_cert_issue_success(self): + def test_apply_fix_ssl_cert_issue_success(self): + """ Test ssl expired cert issue with success on rhel images only.""" + # Set up and mocks + captured_output = StringIO() + original_output = sys.stdout + sys.stdout = captured_output # Redirect stdout to the StringIO object + + original_env_layer_platform_linux_distribution = self.runtime.env_layer.platform.linux_distribution + self.runtime.env_layer.platform.linux_distribution = self.mock_linux7_distribution_to_return_redhat self.runtime.set_legacy_test_type('SSLCertificateIssueType1HappyPathAfterFix') package_manager = self.runtime.container.get('package_manager') self.assertIsNotNone(package_manager) - - self.runtime.env_layer.platform.linux_distribution = self.mock_is_rhel_image - result = package_manager.fix_ssl_certificate_issue() - self.assertTrue(result) + # Act + package_manager.fix_ssl_certificate_issue() + + # Verify + output = captured_output.getvalue() + self.assertIn("[YPM][Customer-environment-error] Updating client package to avoid errors from older certificates using command", output) # Verify the log output contains the expected text # Verify the log output contains the expected text + self.assertIn("Client package update complete", output) # Verify the log output contains the expected text + + # Restore stdout, mock + sys.stdout = original_output + self.runtime.env_layer.platform.linux_distribution = original_env_layer_platform_linux_distribution self.runtime.stop() diff --git a/src/core/tests/library/LegacyEnvLayerExtensions.py b/src/core/tests/library/LegacyEnvLayerExtensions.py index 1a1cf24f..6fd42c97 100644 --- a/src/core/tests/library/LegacyEnvLayerExtensions.py +++ b/src/core/tests/library/LegacyEnvLayerExtensions.py @@ -27,6 +27,9 @@ def __init__(self, package_manager_name, test_type="HappyPath"): class LegacyPlatform(object): def linux_distribution(self): return ['Ubuntu', '16.04', 'Xenial'] + + def linux_distribution_images_details(self): + return ['Red Hat Enterprise Linux Server', '7', 'Maipo'] @staticmethod def system(): # OS Type From e44df802ff718b7ee133a44fc502ade0ecb74e8c Mon Sep 17 00:00:00 2001 From: john feng Date: Wed, 30 Apr 2025 23:29:11 -0700 Subject: [PATCH 06/12] add ut for ssl fix --- .../src/package_managers/YumPackageManager.py | 10 +--- src/core/tests/Test_YumPackageManager.py | 48 ++++++++++++++++++- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index 95268538..175c0ee1 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -184,10 +184,8 @@ def __is_image_rhel8_or_higher(self): def __is_image_rhel(self): # type: () -> bool """ Check if image is RHEL return true else false """ - print('what is linux distribution', self.env_layer.platform.linux_distribution()) os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() if "Red Hat Enterprise Linux" in os_offer: - print('did this get called3') return True return False @@ -902,24 +900,20 @@ def fix_ssl_certificate_issue(self): # type: () -> None """ Attempt to fix the SSL certificate issue by updating the client package """ if self.__is_image_rhel() is False: - print('did this called1, __is_image_rhel', self.__is_image_rhel()) - error_msg = '[YMP] Customer environment error (expired SSL certs)' + error_msg = 'Customer environment error (expired SSL certs)' self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) - print('did this called2, __is_image_rhel outside') # Image is rhel, attempt to update the client package command = "sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" self.composite_logger.log_debug("[YPM][Customer-environment-error] Updating client package to avoid errors from older certificates using command: [Command={0}]".format(str(command))) code, out = self.env_layer.run_command_output(command, False, False) if code != self.yum_exitcode_no_applicable_packages: - print('did this called3, code:', code) - error_msg = '[YMP] Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command, str(code)) + error_msg = 'Customer environment error (expired SSL certs): [Command={0}][Code={1}]'.format(command, str(code)) self.composite_logger.log_error("{0}[Out={1}]".format(error_msg, out)) self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) else: - print('did this called4, code:', code) self.composite_logger.log_verbose("\n\n==[SUCCESS]===============================================================") self.composite_logger.log_debug("Client package update complete. [Code={0}][Out={1}]".format(str(code), out)) self.composite_logger.log_verbose("==========================================================================\n\n") diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index abba4bde..1fa9227d 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -49,6 +49,9 @@ def mock_linux7_distribution_to_return_redhat(self): def mock_linux8_distribution_to_return_redhat(self): return ['Red Hat Enterprise Linux Server', '8', 'Ootpa'] + + def mock_ubuntu_distribution(self): + return ['Ubuntu', '20.04', 'Focal Fossa'] #endregion Mocks def mock_do_processes_require_restart_raise_exception(self): @@ -764,7 +767,7 @@ def test_get_dependent_list_yum_version_4_update_in_two_lines_with_unexpected_ou dependent_list = package_manager.get_dependent_list(["polkit.x86_64"]) self.assertEqual(len(dependent_list), 0) - def test_apply_fix_ssl_cert_issue_success(self): + def test_apply_fix_ssl_cert_issue_rhel_image_success(self): """ Test ssl expired cert issue with success on rhel images only.""" # Set up and mocks captured_output = StringIO() @@ -791,7 +794,50 @@ def test_apply_fix_ssl_cert_issue_success(self): self.runtime.env_layer.platform.linux_distribution = original_env_layer_platform_linux_distribution self.runtime.stop() + + def test_apply_fix_ssl_cert_issue_rhel_image_failed(self): + """ Test ssl expired cert issue failed to fix throw exception on rhel images only.""" + # Set up and mocks + original_env_layer_platform_linux_distribution = self.runtime.env_layer.platform.linux_distribution + self.runtime.env_layer.platform.linux_distribution = self.mock_linux7_distribution_to_return_redhat + self.runtime.set_legacy_test_type('SSLCertificateIssueType1SadPathAfterFix') + + package_manager = self.runtime.container.get('package_manager') + self.assertIsNotNone(package_manager) + + # Act + with self.assertRaises(Exception) as context: + package_manager.fix_ssl_certificate_issue() + + # Verify + self.assertTrue('Customer environment error (expired SSL certs)' in str(context.exception)) + self.assertTrue("sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" in str(context.exception)) + + # Restore mock + self.runtime.env_layer.platform.linux_distribution = original_env_layer_platform_linux_distribution + + self.runtime.stop() + + def test_apply_fix_ssl_cert_issue_non_rhel_img_failed(self): + """ Test ssl expired cert issue throw exception on non rhel images.""" + # Set up and mocks + self.runtime.set_legacy_test_type('SSLCertificateIssueType1SadPathAfterFix') + original_env_layer_platform_linux_distribution_images_details = self.runtime.env_layer.platform.linux_distribution_images_details + self.runtime.env_layer.platform.linux_distribution_images_details = self.mock_ubuntu_distribution + package_manager = self.runtime.container.get('package_manager') + self.assertIsNotNone(package_manager) + + # Act + with self.assertRaises(Exception) as context: + package_manager.fix_ssl_certificate_issue() + # Verify + self.assertTrue('Customer environment error (expired SSL certs)' in str(context.exception)) + + # Restore mock + self.runtime.env_layer.platform.linux_distribution_images_details = original_env_layer_platform_linux_distribution_images_details + self.runtime.stop() + if __name__ == '__main__': unittest.main() From eabe3c7c3711f5b37d7a930259d161e7668393be Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 1 May 2025 09:34:28 -0700 Subject: [PATCH 07/12] update test_rhel7/8_image_with_security_plugin tests --- src/core/tests/Test_YumPackageManager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 1fa9227d..445a8ecc 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -680,8 +680,8 @@ def test_obsolete_packages_should_not_considered_in_available_updates(self): def test_rhel7_image_with_security_plugin(self): """Unit test for yum package manager rhel images below 8 and Classification = Security""" # mock linux_distribution - backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution - LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution = self.mock_linux7_distribution_to_return_redhat + backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details + LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details = self.mock_linux7_distribution_to_return_redhat self.__assert_test_rhel8_image() @@ -691,8 +691,8 @@ def test_rhel7_image_with_security_plugin(self): def test_rhel8_image_higher_no_security_plugin(self): """Unit test for yum package manager rhel images >= 8 and Classification = Security""" # mock linux_distribution - backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution - LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution = self.mock_linux8_distribution_to_return_redhat + backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details + LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details = self.mock_linux8_distribution_to_return_redhat self.__assert_test_rhel8_image() From ddc355562623bdce2257580aa3a1323713c7538b Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 1 May 2025 09:56:57 -0700 Subject: [PATCH 08/12] add ut for extract_linux_distribution_os_info --- src/core/src/bootstrap/EnvLayer.py | 6 +-- .../src/package_managers/YumPackageManager.py | 4 +- src/core/tests/Test_EnvLayer.py | 42 ++++++++++++++++++- src/core/tests/Test_YumPackageManager.py | 6 +-- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/core/src/bootstrap/EnvLayer.py b/src/core/src/bootstrap/EnvLayer.py index 0ea7cff6..0300e22f 100644 --- a/src/core/src/bootstrap/EnvLayer.py +++ b/src/core/src/bootstrap/EnvLayer.py @@ -299,11 +299,11 @@ def linux_distribution(self): code, output = self.__read_record(operation) return eval(output) - def linux_distribution_images_details(self): + def extract_linux_distribution_os_info(self): + # type: () -> tuple """ Extract os information: offer, version, code - Returns: - tuple: A tuple containing (os_offer, os_version, os_code). + Returns: tuple: A tuple of (os_offer, os_version, os_code). """ os_offer, os_version, os_code = None, None, None if self.linux_distribution() is not None: diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index 175c0ee1..e9b9a848 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -175,7 +175,7 @@ def get_other_updates(self): def __is_image_rhel8_or_higher(self): # type: () -> bool """ Check if image is RHEL8+ return true else false """ - os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() + os_offer, os_version, os_code = self.env_layer.platform.extract_linux_distribution_os_info() if "Red Hat Enterprise Linux" in os_offer and int(os_version.split('.')[0]) >= 8: self.composite_logger.log_debug("[YPM] RHEL version >= 8 detected. [DetectedVersion={0}]".format(str(os_version))) return True @@ -184,7 +184,7 @@ def __is_image_rhel8_or_higher(self): def __is_image_rhel(self): # type: () -> bool """ Check if image is RHEL return true else false """ - os_offer, os_version, os_code = self.env_layer.platform.linux_distribution_images_details() + os_offer, os_version, os_code = self.env_layer.platform.extract_linux_distribution_os_info() if "Red Hat Enterprise Linux" in os_offer: return True return False diff --git a/src/core/tests/Test_EnvLayer.py b/src/core/tests/Test_EnvLayer.py index 231aee33..4206e9e1 100644 --- a/src/core/tests/Test_EnvLayer.py +++ b/src/core/tests/Test_EnvLayer.py @@ -85,7 +85,47 @@ def test_get_package_manager(self): self.envlayer.run_command_output = self.backup_run_command_output self.envlayer.platform.linux_distribution = self.backup_linux_distribution platform.system = self.backup_platform_system - + + def test_extract_linux_distribution_os_info_with_data(self): + """ Test linux_distribution_images_details returning tuples of os info. """ + # set up mocks + self.backup_platform_system = platform.system() + platform.system = self.mock_platform_system + self.backup_linux_distribution = self.envlayer.platform.linux_distribution + self.envlayer.platform.linux_distribution = self.mock_linux_distribution + + # Act + os_offer, os_version, os_name = self.envlayer.platform.extract_linux_distribution_os_info() + + # Verify + self.assertEqual(os_offer, 'test') + self.assertEqual(os_version, 'test') + self.assertEqual(os_name, 'test') + + # Restore mocks + self.envlayer.platform.linux_distribution = self.backup_linux_distribution + platform.system = self.backup_platform_system + + def test_extract_linux_distribution_os_info_no_data(self): + """ Test linux_distribution_images_details returning none. """ + # set up mocks + self.backup_platform_system = platform.system() + platform.system = self.mock_platform_system + self.backup_linux_distribution = self.envlayer.platform.linux_distribution + self.envlayer.platform.linux_distribution = lambda: None + + # Act + os_offer, os_version, os_name = self.envlayer.platform.extract_linux_distribution_os_info() + + # Verify + self.assertEqual(os_offer, None) + self.assertEqual(os_version, None) + self.assertEqual(os_name, None) + + # Restore mocks + self.envlayer.platform.linux_distribution = self.backup_linux_distribution + platform.system = self.backup_platform_system + if __name__ == '__main__': unittest.main() \ No newline at end of file diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 445a8ecc..84ffd9d9 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -822,8 +822,8 @@ def test_apply_fix_ssl_cert_issue_non_rhel_img_failed(self): """ Test ssl expired cert issue throw exception on non rhel images.""" # Set up and mocks self.runtime.set_legacy_test_type('SSLCertificateIssueType1SadPathAfterFix') - original_env_layer_platform_linux_distribution_images_details = self.runtime.env_layer.platform.linux_distribution_images_details - self.runtime.env_layer.platform.linux_distribution_images_details = self.mock_ubuntu_distribution + original_env_layer_platform_linux_distribution_images_details = self.runtime.env_layer.platform.extract_linux_distribution_os_info + self.runtime.env_layer.platform.extract_linux_distribution_os_info = self.mock_ubuntu_distribution package_manager = self.runtime.container.get('package_manager') self.assertIsNotNone(package_manager) @@ -835,7 +835,7 @@ def test_apply_fix_ssl_cert_issue_non_rhel_img_failed(self): self.assertTrue('Customer environment error (expired SSL certs)' in str(context.exception)) # Restore mock - self.runtime.env_layer.platform.linux_distribution_images_details = original_env_layer_platform_linux_distribution_images_details + self.runtime.env_layer.platform.extract_linux_distribution_os_info = original_env_layer_platform_linux_distribution_images_details self.runtime.stop() From b488dfcdce05ca579e3f07e7cd26bfcac55d8833 Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 1 May 2025 10:04:32 -0700 Subject: [PATCH 09/12] update files with extract_linux_distribution_os_info --- src/core/tests/Test_EnvLayer.py | 8 ++++---- src/core/tests/Test_YumPackageManager.py | 8 ++++---- src/core/tests/library/LegacyEnvLayerExtensions.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/tests/Test_EnvLayer.py b/src/core/tests/Test_EnvLayer.py index 4206e9e1..1cf80751 100644 --- a/src/core/tests/Test_EnvLayer.py +++ b/src/core/tests/Test_EnvLayer.py @@ -118,9 +118,9 @@ def test_extract_linux_distribution_os_info_no_data(self): os_offer, os_version, os_name = self.envlayer.platform.extract_linux_distribution_os_info() # Verify - self.assertEqual(os_offer, None) - self.assertEqual(os_version, None) - self.assertEqual(os_name, None) + self.assertIsNone(os_offer, None) + self.assertIsNone(os_version, None) + self.assertIsNone(os_name, None) # Restore mocks self.envlayer.platform.linux_distribution = self.backup_linux_distribution @@ -128,4 +128,4 @@ def test_extract_linux_distribution_os_info_no_data(self): if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 84ffd9d9..413e87bf 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -680,8 +680,8 @@ def test_obsolete_packages_should_not_considered_in_available_updates(self): def test_rhel7_image_with_security_plugin(self): """Unit test for yum package manager rhel images below 8 and Classification = Security""" # mock linux_distribution - backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details - LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details = self.mock_linux7_distribution_to_return_redhat + backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info + LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info = self.mock_linux7_distribution_to_return_redhat self.__assert_test_rhel8_image() @@ -691,8 +691,8 @@ def test_rhel7_image_with_security_plugin(self): def test_rhel8_image_higher_no_security_plugin(self): """Unit test for yum package manager rhel images >= 8 and Classification = Security""" # mock linux_distribution - backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details - LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution_images_details = self.mock_linux8_distribution_to_return_redhat + backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info + LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info = self.mock_linux8_distribution_to_return_redhat self.__assert_test_rhel8_image() diff --git a/src/core/tests/library/LegacyEnvLayerExtensions.py b/src/core/tests/library/LegacyEnvLayerExtensions.py index 6fd42c97..262d196b 100644 --- a/src/core/tests/library/LegacyEnvLayerExtensions.py +++ b/src/core/tests/library/LegacyEnvLayerExtensions.py @@ -28,7 +28,7 @@ class LegacyPlatform(object): def linux_distribution(self): return ['Ubuntu', '16.04', 'Xenial'] - def linux_distribution_images_details(self): + def extract_linux_distribution_os_info(self): return ['Red Hat Enterprise Linux Server', '7', 'Maipo'] @staticmethod From 86c349de730e36eb2ea8377dafe2e3b8846636ee Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 1 May 2025 16:11:24 -0700 Subject: [PATCH 10/12] reset env_layer files and refactor unt --- src/core/src/bootstrap/EnvLayer.py | 15 ------- .../src/package_managers/YumPackageManager.py | 20 +++++---- src/core/tests/Test_EnvLayer.py | 41 ------------------- src/core/tests/Test_YumPackageManager.py | 8 ++-- .../tests/library/LegacyEnvLayerExtensions.py | 3 -- 5 files changed, 15 insertions(+), 72 deletions(-) diff --git a/src/core/src/bootstrap/EnvLayer.py b/src/core/src/bootstrap/EnvLayer.py index 0300e22f..559af66f 100644 --- a/src/core/src/bootstrap/EnvLayer.py +++ b/src/core/src/bootstrap/EnvLayer.py @@ -298,21 +298,6 @@ def linux_distribution(self): else: code, output = self.__read_record(operation) return eval(output) - - def extract_linux_distribution_os_info(self): - # type: () -> tuple - """ - Extract os information: offer, version, code - Returns: tuple: A tuple of (os_offer, os_version, os_code). - """ - os_offer, os_version, os_code = None, None, None - if self.linux_distribution() is not None: - try: - os_offer, os_version, os_code = self.linux_distribution() - except (ValueError, TypeError): - print("Failed to extract linux image information") - - return os_offer, os_version, os_code def system(self): # OS Type operation = "PLATFORM_SYSTEM" diff --git a/src/core/src/package_managers/YumPackageManager.py b/src/core/src/package_managers/YumPackageManager.py index e9b9a848..ea2ee333 100644 --- a/src/core/src/package_managers/YumPackageManager.py +++ b/src/core/src/package_managers/YumPackageManager.py @@ -139,7 +139,6 @@ def get_security_updates(self): if not self.__is_image_rhel8_or_higher(): self.install_yum_security_prerequisite() - out = self.invoke_package_manager(self.yum_check_security) security_packages, security_package_versions = self.extract_packages_and_versions(out) @@ -175,18 +174,20 @@ def get_other_updates(self): def __is_image_rhel8_or_higher(self): # type: () -> bool """ Check if image is RHEL8+ return true else false """ - os_offer, os_version, os_code = self.env_layer.platform.extract_linux_distribution_os_info() - if "Red Hat Enterprise Linux" in os_offer and int(os_version.split('.')[0]) >= 8: - self.composite_logger.log_debug("[YPM] RHEL version >= 8 detected. [DetectedVersion={0}]".format(str(os_version))) - return True + if self.env_layer.platform.linux_distribution is not None: + os_offer, os_version, os_code = self.env_layer.platform.linux_distribution() + if "Red Hat Enterprise Linux" in os_offer and int(os_version.split('.')[0]) >= 8: + self.composite_logger.log_debug("[YPM] RHEL version >= 8 detected. [DetectedVersion={0}]".format(str(os_version))) + return True return False def __is_image_rhel(self): # type: () -> bool """ Check if image is RHEL return true else false """ - os_offer, os_version, os_code = self.env_layer.platform.extract_linux_distribution_os_info() - if "Red Hat Enterprise Linux" in os_offer: - return True + if self.env_layer.platform.linux_distribution is not None: + os_offer, os_version, os_code = self.env_layer.platform.linux_distribution() + if "Red Hat Enterprise Linux" in os_offer: + return True return False def set_max_patch_publish_date(self, max_patch_publish_date=str()): @@ -899,10 +900,11 @@ def check_known_issues_and_attempt_fix(self, output): def fix_ssl_certificate_issue(self): # type: () -> None """ Attempt to fix the SSL certificate issue by updating the client package """ - if self.__is_image_rhel() is False: + if not self.__is_image_rhel(): error_msg = 'Customer environment error (expired SSL certs)' self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.PACKAGE_MANAGER_FAILURE) raise Exception(error_msg, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS)) + # Image is rhel, attempt to update the client package command = "sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'" self.composite_logger.log_debug("[YPM][Customer-environment-error] Updating client package to avoid errors from older certificates using command: [Command={0}]".format(str(command))) diff --git a/src/core/tests/Test_EnvLayer.py b/src/core/tests/Test_EnvLayer.py index 1cf80751..ddfa4885 100644 --- a/src/core/tests/Test_EnvLayer.py +++ b/src/core/tests/Test_EnvLayer.py @@ -85,47 +85,6 @@ def test_get_package_manager(self): self.envlayer.run_command_output = self.backup_run_command_output self.envlayer.platform.linux_distribution = self.backup_linux_distribution platform.system = self.backup_platform_system - - def test_extract_linux_distribution_os_info_with_data(self): - """ Test linux_distribution_images_details returning tuples of os info. """ - # set up mocks - self.backup_platform_system = platform.system() - platform.system = self.mock_platform_system - self.backup_linux_distribution = self.envlayer.platform.linux_distribution - self.envlayer.platform.linux_distribution = self.mock_linux_distribution - - # Act - os_offer, os_version, os_name = self.envlayer.platform.extract_linux_distribution_os_info() - - # Verify - self.assertEqual(os_offer, 'test') - self.assertEqual(os_version, 'test') - self.assertEqual(os_name, 'test') - - # Restore mocks - self.envlayer.platform.linux_distribution = self.backup_linux_distribution - platform.system = self.backup_platform_system - - def test_extract_linux_distribution_os_info_no_data(self): - """ Test linux_distribution_images_details returning none. """ - # set up mocks - self.backup_platform_system = platform.system() - platform.system = self.mock_platform_system - self.backup_linux_distribution = self.envlayer.platform.linux_distribution - self.envlayer.platform.linux_distribution = lambda: None - - # Act - os_offer, os_version, os_name = self.envlayer.platform.extract_linux_distribution_os_info() - - # Verify - self.assertIsNone(os_offer, None) - self.assertIsNone(os_version, None) - self.assertIsNone(os_name, None) - - # Restore mocks - self.envlayer.platform.linux_distribution = self.backup_linux_distribution - platform.system = self.backup_platform_system - if __name__ == '__main__': unittest.main() diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 413e87bf..614d5f18 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -680,8 +680,8 @@ def test_obsolete_packages_should_not_considered_in_available_updates(self): def test_rhel7_image_with_security_plugin(self): """Unit test for yum package manager rhel images below 8 and Classification = Security""" # mock linux_distribution - backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info - LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info = self.mock_linux7_distribution_to_return_redhat + backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution + LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution = self.mock_linux7_distribution_to_return_redhat self.__assert_test_rhel8_image() @@ -691,8 +691,8 @@ def test_rhel7_image_with_security_plugin(self): def test_rhel8_image_higher_no_security_plugin(self): """Unit test for yum package manager rhel images >= 8 and Classification = Security""" # mock linux_distribution - backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info - LegacyEnvLayerExtensions.LegacyPlatform.extract_linux_distribution_os_info = self.mock_linux8_distribution_to_return_redhat + backup_envlayer_platform_linux_distribution = LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution + LegacyEnvLayerExtensions.LegacyPlatform.linux_distribution = self.mock_linux8_distribution_to_return_redhat self.__assert_test_rhel8_image() diff --git a/src/core/tests/library/LegacyEnvLayerExtensions.py b/src/core/tests/library/LegacyEnvLayerExtensions.py index 262d196b..1a1cf24f 100644 --- a/src/core/tests/library/LegacyEnvLayerExtensions.py +++ b/src/core/tests/library/LegacyEnvLayerExtensions.py @@ -27,9 +27,6 @@ def __init__(self, package_manager_name, test_type="HappyPath"): class LegacyPlatform(object): def linux_distribution(self): return ['Ubuntu', '16.04', 'Xenial'] - - def extract_linux_distribution_os_info(self): - return ['Red Hat Enterprise Linux Server', '7', 'Maipo'] @staticmethod def system(): # OS Type From 8a1d02e7481231ba4bf3c4b2dd2d1b9d68d74238 Mon Sep 17 00:00:00 2001 From: john feng Date: Thu, 1 May 2025 21:46:40 -0700 Subject: [PATCH 11/12] restore test_envlayer and test_yumpackagemanager --- src/core/tests/Test_EnvLayer.py | 3 ++- src/core/tests/Test_YumPackageManager.py | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/core/tests/Test_EnvLayer.py b/src/core/tests/Test_EnvLayer.py index ddfa4885..231aee33 100644 --- a/src/core/tests/Test_EnvLayer.py +++ b/src/core/tests/Test_EnvLayer.py @@ -86,5 +86,6 @@ def test_get_package_manager(self): self.envlayer.platform.linux_distribution = self.backup_linux_distribution platform.system = self.backup_platform_system + if __name__ == '__main__': - unittest.main() + unittest.main() \ No newline at end of file diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index 614d5f18..e5ec52dd 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -822,8 +822,8 @@ def test_apply_fix_ssl_cert_issue_non_rhel_img_failed(self): """ Test ssl expired cert issue throw exception on non rhel images.""" # Set up and mocks self.runtime.set_legacy_test_type('SSLCertificateIssueType1SadPathAfterFix') - original_env_layer_platform_linux_distribution_images_details = self.runtime.env_layer.platform.extract_linux_distribution_os_info - self.runtime.env_layer.platform.extract_linux_distribution_os_info = self.mock_ubuntu_distribution + original_env_layer_platform_linux_distribution = self.runtime.env_layer.platform.linux_distribution + self.runtime.env_layer.platform.linux_distribution = self.mock_ubuntu_distribution package_manager = self.runtime.container.get('package_manager') self.assertIsNotNone(package_manager) @@ -835,7 +835,7 @@ def test_apply_fix_ssl_cert_issue_non_rhel_img_failed(self): self.assertTrue('Customer environment error (expired SSL certs)' in str(context.exception)) # Restore mock - self.runtime.env_layer.platform.extract_linux_distribution_os_info = original_env_layer_platform_linux_distribution_images_details + self.runtime.env_layer.platform.extract_linux_distribution_os_info = original_env_layer_platform_linux_distribution self.runtime.stop() From 55e1046c05540ce9d51a2ea1d840df5304a5320c Mon Sep 17 00:00:00 2001 From: john feng Date: Fri, 2 May 2025 11:44:24 -0700 Subject: [PATCH 12/12] fix ut restore mock --- src/core/tests/Test_YumPackageManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tests/Test_YumPackageManager.py b/src/core/tests/Test_YumPackageManager.py index e5ec52dd..1646c233 100644 --- a/src/core/tests/Test_YumPackageManager.py +++ b/src/core/tests/Test_YumPackageManager.py @@ -835,7 +835,7 @@ def test_apply_fix_ssl_cert_issue_non_rhel_img_failed(self): self.assertTrue('Customer environment error (expired SSL certs)' in str(context.exception)) # Restore mock - self.runtime.env_layer.platform.extract_linux_distribution_os_info = original_env_layer_platform_linux_distribution + self.runtime.env_layer.platform.linux_distribution = original_env_layer_platform_linux_distribution self.runtime.stop()