in src/core/src/service_interfaces/StatusHandler.py [0:0]
def __create_truncated_status_file(self, status_file_size_in_bytes, complete_status_file_payload_json):
""" Truncate substatus message patches when complete status file size is greater than 126kb """
self.composite_logger.log_verbose("Begin patches truncation: [StatusFileSizeInBytes={0}] [InternalFileSizeLimitInBytes={1}]".format(str(status_file_size_in_bytes), str(Constants.StatusTruncationConfig.INTERNAL_FILE_SIZE_LIMIT_IN_BYTES)))
truncated_status_file = json.loads(complete_status_file_payload_json) # reload payload into python object
low_pri_index = None
assessment_substatus_index, assessment_substatus_status = self.__get_substatus_index_and_status(Constants.PATCH_ASSESSMENT_SUMMARY, truncated_status_file['status']['substatus'])
installation_substatus_index, installation_substatus_status = self.__get_substatus_index_and_status(Constants.PATCH_INSTALLATION_SUMMARY, truncated_status_file['status']['substatus'])
if assessment_substatus_index is not None: # If assessment data exists
self.__assessment_substatus_msg_copy = self.__get_substatus_message(truncated_status_file, assessment_substatus_index)
self.__assessment_patches_copy = self.__assessment_substatus_msg_copy['patches']
if installation_substatus_index is not None: # If installation data exists
self.__installation_substatus_msg_copy = self.__get_substatus_message(truncated_status_file, installation_substatus_index)
self.__installation_patches_copy = self.__installation_substatus_msg_copy['patches']
low_pri_index = self.__get_installation_low_pri_index(self.__installation_patches_copy)
status_file_without_patches_size_in_bytes = self.__size_of_constant_status_data(copy.deepcopy(truncated_status_file), assessment_substatus_index, installation_substatus_index) # Deepcopy, fully copies the object to avoid reference modifications
max_allowed_patches_size_in_bytes = Constants.StatusTruncationConfig.INTERNAL_FILE_SIZE_LIMIT_IN_BYTES - status_file_without_patches_size_in_bytes
self.composite_logger.log_verbose("Status file limits evaluated. [FileSizeWithoutPatchesInBytes={0}] [MaxAllowedPatchesSizeInBytes={1}]".format(str(status_file_without_patches_size_in_bytes), str(max_allowed_patches_size_in_bytes)))
while status_file_size_in_bytes > Constants.StatusTruncationConfig.INTERNAL_FILE_SIZE_LIMIT_IN_BYTES:
# Start truncation process
patches_retained_in_assessment, self.__assessment_patches_removed, patches_retained_in_installation, self.__installation_patches_removed = \
self.__start_truncation_process(self.__assessment_patches_copy, self.__installation_patches_copy, max_allowed_patches_size_in_bytes, low_pri_index)
if len(self.__assessment_patches_removed) > 0:
assessment_tombstone_list = self.__create_assessment_tombstones_by_classification(self.__assessment_patches_removed)
patches_retained_in_assessment.extend(assessment_tombstone_list) # Add assessment tombstone list
self.composite_logger.log_verbose("Recomposing truncated status payload: [Substatus={0}]".format(Constants.PATCH_ASSESSMENT_SUMMARY))
truncated_status_file = self.__recompose_truncated_status_file(truncated_status_file=truncated_status_file, truncated_patches=patches_retained_in_assessment, count_total_errors=self.__assessment_total_error_count, substatus_message=self.__assessment_substatus_msg_copy, substatus_status=assessment_substatus_status, substatus_index=assessment_substatus_index)
if len(self.__installation_patches_removed) > 0:
patches_retained_in_installation.append(self.__create_installation_tombstone()) # Add installation tombstone records
self.composite_logger.log_verbose("Recomposing truncated status payload: [Substatus={0}]".format(Constants.PATCH_INSTALLATION_SUMMARY))
truncated_status_file = self.__recompose_truncated_status_file(truncated_status_file=truncated_status_file, truncated_patches=patches_retained_in_installation, count_total_errors=self.__installation_total_error_count, substatus_message=self.__installation_substatus_msg_copy, substatus_status=installation_substatus_status, substatus_index=installation_substatus_index)
status_file_size_in_bytes = self.__calc_status_size_on_disk(json.dumps(truncated_status_file))
status_file_agent_size_diff = status_file_size_in_bytes - Constants.StatusTruncationConfig.INTERNAL_FILE_SIZE_LIMIT_IN_BYTES
max_allowed_patches_size_in_bytes -= status_file_agent_size_diff # Reduce the max packages byte size by new error and new escape chars byte size
self.composite_logger.log_verbose("End patches truncation: [TruncatedStatusFileSizeInBytes={0}] [InternalFileSizeLimitInBytes={1}]".format(str(status_file_size_in_bytes), str(Constants.StatusTruncationConfig.INTERNAL_FILE_SIZE_LIMIT_IN_BYTES)))
return truncated_status_file