Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 21 additions & 6 deletions src/core/src/package_managers/ZypperPackageManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,14 +158,29 @@ def invoke_package_manager(self, command):
else: # verbose diagnostic log
self.log_success_on_invoke(code, out)

if code == self.zypper_exitcode_zypper_updated:
self.composite_logger.log_debug(" - Package manager update detected. Patch installation run will be repeated.")
self.set_package_manager_setting(Constants.PACKAGE_MGR_SETTING_REPEAT_PATCH_OPERATION, True)
elif code == self.zypper_exitcode_reboot_required:
self.composite_logger.log_warning("Machine requires reboot after patch installation. Setting force_reboot flag to True.")
self.force_reboot = True
if code == self.zypper_exitcode_zypper_updated or code == self.zypper_exitcode_reboot_required:
self.__handle_zypper_updated_or_reboot_exit_codes(command, code)

return out

def __handle_zypper_updated_or_reboot_exit_codes(self, command, code):
""" Handles exit code 102 or 103 when returned from invoking package manager.
Does not repeat installation or reboot if it is a dry run. """
if "--dry-run" in command:
self.composite_logger.log_debug(
"Exit code {0} detected from command \"{1}\", but it was a dry run. Continuing execution without repeating installation or rebooting.".format(
str(code), command))
return

if code == self.zypper_exitcode_zypper_updated:
self.composite_logger.log_debug(
" - Package manager update detected. Patch installation run will be repeated.")
self.set_package_manager_setting(Constants.PACKAGE_MGR_SETTING_REPEAT_PATCH_OPERATION, True)
elif code == self.zypper_exitcode_reboot_required:
self.composite_logger.log_warning(
"Machine requires reboot after patch installation. Setting force_reboot flag to True.")
self.force_reboot = True

def modify_upgrade_or_patch_command_to_replacefiles(self, command):
""" Modifies a command to invoke_package_manager for update or patch to include a --replacefiles flag.
If it is a dry run or already has the flag, it returns None. Otherwise, returns the new command. """
Expand Down
31 changes: 31 additions & 0 deletions src/core/tests/Test_ZypperPackageManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,37 @@ def mock_run_command_output(cmd, no_output=False, chk_err=False):

package_manager.env_layer.run_command_output = backup_mocked_method

def test_package_manager_exit_reboot_required(self):
# AnotherSadPath returns code 102 for this command
package_manager = self.container.get('package_manager')
self.runtime.status_handler.set_current_operation(Constants.INSTALLATION)
self.runtime.set_legacy_test_type('AnotherSadPath')

cmd = "sudo LANG=en_US.UTF8 zypper --non-interactive patch --category security --dry-run"
package_manager.invoke_package_manager(cmd)
self.assertFalse(package_manager.force_reboot)

# AnotherSadPath returns code 102 on this command, but should actually set reboot flag
cmd = "sudo LANG=en_US.UTF8 zypper --non-interactive patch --category security"
package_manager.invoke_package_manager(cmd)
self.assertTrue(package_manager.force_reboot)

def test_package_manager_exit_repeat_operation(self):
# SadPath returns code 103 for this command
package_manager = self.container.get('package_manager')
self.runtime.status_handler.set_current_operation(Constants.INSTALLATION)
self.runtime.set_legacy_test_type('SadPath')

# Should not set reboot flag (as it is a dry run)
cmd = "sudo LANG=en_US.UTF8 zypper --non-interactive patch --category security --dry-run"
package_manager.invoke_package_manager(cmd)
self.assertFalse(package_manager.get_package_manager_setting(Constants.PACKAGE_MGR_SETTING_REPEAT_PATCH_OPERATION, False))

# Should set reboot flag
cmd = "sudo LANG=en_US.UTF8 zypper --non-interactive patch --category security"
package_manager.invoke_package_manager(cmd)
self.assertTrue(package_manager.get_package_manager_setting(Constants.PACKAGE_MGR_SETTING_REPEAT_PATCH_OPERATION, False))


if __name__ == '__main__':
unittest.main()
Expand Down
6 changes: 6 additions & 0 deletions src/core/tests/library/LegacyEnvLayerExtensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,9 @@ def run_command_output(self, cmd, no_output=False, chk_err=True):
elif cmd.find('sudo zypper refresh') > -1:
code = 7
output = 'System management is locked by the application with pid 7914 (/usr/bin/zypper).'
elif cmd.find('sudo LANG=en_US.UTF8 zypper --non-interactive patch --category security') > -1:
code = 103
output = ''
elif cmd.find("systemctl") > -1:
code = 1
output = ''
Expand Down Expand Up @@ -606,6 +609,9 @@ def run_command_output(self, cmd, no_output=False, chk_err=True):
elif cmd.find('sudo zypper --non-interactive update samba-libs=4.15.4+git.327.37e0a40d45f-3.57.1') > -1:
code = 8
output = ''
elif cmd.find('sudo LANG=en_US.UTF8 zypper --non-interactive patch --category security') > -1:
code = 102
output = ''
elif self.legacy_test_type == 'ExceptionPath':
code = -1
output = ''
Expand Down