in src/core/src/core_logic/PatchAssessor.py [0:0]
def start_assessment(self):
""" Start a patch assessment """
self.status_handler.set_current_operation(Constants.ASSESSMENT)
self.raise_if_telemetry_unsupported()
self.raise_if_min_python_version_not_met()
if self.execution_config.exec_auto_assess_only and not self.should_auto_assessment_run():
self.composite_logger.log("\nSkipping automatic patch assessment... [ShouldAutoAssessmentRun=False]\n")
self.lifecycle_manager.lifecycle_status_check()
return True
self.composite_logger.log("\nStarting patch assessment... [MachineId: " + self.env_layer.platform.vm_name() + "][ActivityId: " + self.execution_config.activity_id + "][StartTime: " + self.execution_config.start_time + "]")
self.write_assessment_state() # success / failure does not matter, only that an attempt started
self.stopwatch.start()
self.status_handler.set_assessment_substatus_json(status=Constants.STATUS_TRANSITIONING)
retry_count = 0
for i in range(0, Constants.MAX_ASSESSMENT_RETRY_COUNT):
try:
self.composite_logger.log("\n\nGetting available patches...")
self.package_manager.refresh_repo()
self.status_handler.reset_assessment_data()
if self.lifecycle_manager is not None:
self.lifecycle_manager.lifecycle_status_check() # may terminate the code abruptly, as designed
# All updates
retry_count = retry_count + 1
# All updates
packages, package_versions = self.package_manager.get_all_updates()
self.telemetry_writer.write_event("Full assessment: " + str(packages), Constants.TelemetryEventLevel.Verbose)
self.status_handler.set_package_assessment_status(packages, package_versions)
if self.lifecycle_manager is not None:
self.lifecycle_manager.lifecycle_status_check() # may terminate the code abruptly, as designed
sec_packages, sec_package_versions = self.package_manager.get_security_updates()
# Tag security updates
self.telemetry_writer.write_event("Security assessment: " + str(sec_packages), Constants.TelemetryEventLevel.Verbose)
self.status_handler.set_package_assessment_status(sec_packages, sec_package_versions, Constants.PackageClassification.SECURITY)
# Set the security-esm packages in status.
self.package_manager.set_security_esm_package_status(Constants.ASSESSMENT, packages=[])
# ensure reboot status is set
reboot_pending = self.package_manager.is_reboot_pending()
self.status_handler.set_reboot_pending(reboot_pending)
self.status_handler.set_assessment_substatus_json(status=Constants.STATUS_SUCCESS)
break # avoid retries for success
except Exception as error:
if i < Constants.MAX_ASSESSMENT_RETRY_COUNT - 1:
error_msg = 'Retriable error retrieving available patches: ' + repr(error)
self.composite_logger.log_warning(error_msg)
self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.DEFAULT_ERROR)
time.sleep(2*(i + 1))
else:
error_msg = 'Error retrieving available patches: ' + repr(error)
self.composite_logger.log_error(error_msg)
self.write_assessment_perf_logs(retry_count, Constants.TaskStatus.FAILED, error_msg)
self.status_handler.add_error_to_status(error_msg, Constants.PatchOperationErrorCodes.DEFAULT_ERROR)
if Constants.ERROR_ADDED_TO_STATUS not in repr(error):
error.args = (error.args, "[{0}]".format(Constants.ERROR_ADDED_TO_STATUS))
self.status_handler.set_assessment_substatus_json(status=Constants.STATUS_ERROR)
raise
self.write_assessment_perf_logs(retry_count, Constants.TaskStatus.SUCCEEDED, "")
self.composite_logger.log("\nPatch assessment completed.\n")
return True