in azurelinuxagent/ga/exthandlers.py [0:0]
def collect_ext_status(self, ext):
self.logger.verbose("Collect extension status for {0}".format(self.get_extension_full_name(ext)))
seq_no, ext_status_file = self.get_status_file_path(ext)
# We should never try to read any status file if the handler has no settings, returning None in that case
if seq_no == -1 or ext is None:
return None
data = None
data_str = None
# Extension.name contains the extension name in case of MC and Handler name in case of Single Config.
ext_status = ExtensionStatus(name=ext.name, seq_no=seq_no)
try:
data_str, data = self._read_status_file(ext_status_file)
except ExtensionStatusError as e:
msg = ""
ext_status.status = ExtensionStatusValue.error
if e.code == ExtensionStatusError.CouldNotReadStatusFile:
ext_status.code = ExtensionErrorCodes.PluginUnknownFailure
msg = u"We couldn't read any status for {0} extension, for the sequence number {1}. It failed due" \
u" to {2}".format(self.get_full_name(ext), seq_no, ustr(e))
elif e.code == ExtensionStatusError.InvalidJsonFile:
ext_status.code = ExtensionErrorCodes.PluginSettingsStatusInvalid
msg = u"The status reported by the extension {0}(Sequence number {1}), was in an " \
u"incorrect format and the agent could not parse it correctly. Failed due to {2}" \
.format(self.get_full_name(ext), seq_no, ustr(e))
elif e.code == ExtensionStatusError.FileNotExists:
msg = "This status is being reported by the Guest Agent since no status file was " \
"reported by extension {0}: {1}".format(self.get_extension_full_name(ext), ustr(e))
# Reporting a success code and transitioning status to keep in accordance with existing code that
# creates default status placeholder file
ext_status.code = ExtensionErrorCodes.PluginSuccess
ext_status.status = ExtensionStatusValue.transitioning
# This log is periodic due to the verbose nature of the status check. Please make sure that the message
# constructed above does not change very frequently and includes important info such as sequence number,
# extension name to make sure that the log reflects changes in the extension sequence for which the
# status is being sent.
logger.periodic_warn(logger.EVERY_HALF_HOUR, u"[PERIODIC] " + msg)
add_periodic(delta=logger.EVERY_HALF_HOUR, name=self.get_extension_full_name(ext),
version=self.ext_handler.version,
op=WALAEventOperation.StatusProcessing, is_success=False, message=msg,
log_event=False)
ext_status.message = msg
return ext_status
# We did not encounter InvalidJsonFile/CouldNotReadStatusFile and thus the status file was correctly written
# and has valid json.
try:
parse_ext_status(ext_status, data)
if len(data_str) > _MAX_STATUS_FILE_SIZE_IN_BYTES:
raise ExtensionStatusError(msg="For Extension Handler {0} for the sequence number {1}, the status "
"file {2} of size {3} bytes is too big. Max Limit allowed is {4} bytes"
.format(self.get_full_name(ext), seq_no,
ext_status_file, len(data_str), _MAX_STATUS_FILE_SIZE_IN_BYTES),
code=ExtensionStatusError.MaxSizeExceeded)
except ExtensionStatusError as e:
msg = u"For Extension Handler {0} for the sequence number {1}, the status file {2}. " \
u"Encountered the following error: {3}".format(self.get_full_name(ext), seq_no,
ext_status_file, ustr(e))
logger.periodic_warn(logger.EVERY_DAY, u"[PERIODIC] " + msg)
add_periodic(delta=logger.EVERY_HALF_HOUR, name=self.get_extension_full_name(ext),
version=self.ext_handler.version,
op=WALAEventOperation.StatusProcessing, is_success=False, message=msg, log_event=False)
if e.code == ExtensionStatusError.MaxSizeExceeded:
ext_status.message, field_size = self._truncate_message(ext_status.message, _MAX_STATUS_MESSAGE_LENGTH)
ext_status.substatusList = self._process_substatus_list(ext_status.substatusList, field_size)
elif e.code == ExtensionStatusError.StatusFileMalformed:
ext_status.message = "Could not get a valid status from the extension {0}. Encountered the " \
"following error: {1}".format(self.get_full_name(ext), ustr(e))
ext_status.code = ExtensionErrorCodes.PluginSettingsStatusInvalid
ext_status.status = ExtensionStatusValue.error
return ext_status