def __create_truncated_status_file()

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