@@ -40,6 +40,7 @@ def __init__(self, env_layer, execution_config, composite_logger, telemetry_writ
40
40
# Repo refresh
41
41
self .repo_clean = 'sudo zypper clean -a'
42
42
self .repo_refresh = 'sudo zypper refresh'
43
+ self .repo_refresh_services = 'sudo zypper refresh --services'
43
44
44
45
# Support to get updates and their dependencies
45
46
self .zypper_check = 'sudo LANG=en_US.UTF8 zypper list-updates'
@@ -54,11 +55,14 @@ def __init__(self, env_layer, execution_config, composite_logger, telemetry_writ
54
55
55
56
# Package manager exit code(s)
56
57
self .zypper_exitcode_ok = 0
58
+ self .zypper_exitcode_zypp_lib_exit_err = 4
59
+ self .zypper_exitcode_no_repos = 6
60
+ self .zypper_exitcode_zypp_locked = 7
57
61
self .zypper_exitcode_reboot_required = 102
58
62
self .zypper_exitcode_zypper_updated = 103
59
- self .zypper_exitcode_zypp_locked = 7
60
- self .zypper_exitcode_zypp_lib_exit_err = 4
63
+ self .zypper_exitcode_repos_skipped = 106
61
64
self .zypper_success_exit_codes = [self .zypper_exitcode_ok , self .zypper_exitcode_zypper_updated , self .zypper_exitcode_reboot_required ]
65
+ self .zypper_retriable_exit_codes = [self .zypper_exitcode_zypp_locked , self .zypper_exitcode_zypp_lib_exit_err , self .zypper_exitcode_repos_skipped ]
62
66
63
67
# Support to check for processes requiring restart
64
68
self .zypper_ps = "sudo zypper ps -s"
@@ -67,7 +71,6 @@ def __init__(self, env_layer, execution_config, composite_logger, telemetry_writ
67
71
self .set_package_manager_setting (Constants .PKG_MGR_SETTING_IDENTITY , Constants .ZYPPER )
68
72
self .zypper_get_process_tree_cmd = 'ps --forest -o pid,cmd -g $(ps -o sid= -p {})'
69
73
self .package_manager_max_retries = 5
70
- self .error_codes_to_retry = [self .zypper_exitcode_zypp_locked , self .zypper_exitcode_zypp_lib_exit_err ]
71
74
self .zypp_lock_timeout_backup = None
72
75
73
76
# auto OS updates
@@ -89,11 +92,24 @@ def refresh_repo(self):
89
92
# Reboot if not already done
90
93
if self .status_handler .get_installation_reboot_status () == Constants .RebootStatus .COMPLETED :
91
94
self .composite_logger .log_warning ("Unable to refresh repo (retries exhausted after reboot)." )
95
+ raise
92
96
else :
93
97
self .composite_logger .log_warning ("Setting force_reboot flag to True." )
94
98
self .force_reboot = True
95
-
96
- raise
99
+
100
+ def __refresh_repo_services (self ):
101
+ """ Similar to refresh_repo, but refreshes services in case no repos are defined. """
102
+ self .composite_logger .log ("Refreshing local repo services..." )
103
+ try :
104
+ self .invoke_package_manager (self .repo_refresh_services )
105
+ except Exception as error :
106
+ # Reboot if not already done
107
+ if self .status_handler .get_installation_reboot_status () == Constants .RebootStatus .COMPLETED :
108
+ self .composite_logger .log_warning ("Unable to refresh repo services (retries exhausted after reboot)." )
109
+ raise
110
+ else :
111
+ self .composite_logger .log_warning ("Setting force_reboot flag to True after refreshing repo services." )
112
+ self .force_reboot = True
97
113
98
114
# region Get Available Updates
99
115
def invoke_package_manager (self , command ):
@@ -106,12 +122,18 @@ def invoke_package_manager(self, command):
106
122
self .restore_original_lock_timeout ()
107
123
108
124
if code not in self .zypper_success_exit_codes : # more known return codes should be added as appropriate
125
+ # Refresh repo services if no repos are defined
126
+ if code == self .zypper_exitcode_no_repos and command != self .repo_refresh_services :
127
+ self .composite_logger .log_warning ("Warning: no repos defined on command: {0}" .format (str (command )))
128
+ self .__refresh_repo_services ()
129
+ continue
130
+
109
131
self .log_errors_on_invoke (command , out , code )
110
132
error_msg = 'Unexpected return code (' + str (code ) + ') from package manager on command: ' + command
111
133
self .status_handler .add_error_to_status (error_msg , Constants .PatchOperationErrorCodes .PACKAGE_MANAGER_FAILURE )
112
134
113
135
# Not a retriable error code, so raise an exception
114
- if code not in self .error_codes_to_retry :
136
+ if code not in self .zypper_retriable_exit_codes :
115
137
raise Exception (error_msg , "[{0}]" .format (Constants .ERROR_ADDED_TO_STATUS ))
116
138
117
139
# Retriable error code, so check number of retries and wait then retry if applicable; otherwise, raise error after max retries
0 commit comments