in azurelinuxagent/ga/exthandlers.py [0:0]
def handle_ext_handler(self, ext_handler_i, extension, goal_state_id):
"""
Execute the requested command for the handler and return if success
:param ext_handler_i: The ExtHandlerInstance object to execute the command on
:param extension: The extension settings on which to run the command on
:param goal_state_id: ID of the current GoalState
:return: True if the operation was successful, False if not
"""
try:
# Ensure the extension config was valid
if ext_handler_i.ext_handler.is_invalid_setting:
raise ExtensionsGoalStateError(ext_handler_i.ext_handler.invalid_setting_reason)
handler_state = ext_handler_i.ext_handler.state
# The Guest Agent currently only supports 1 installed version per extension on the VM.
# If the extension version is unregistered and the customers wants to uninstall the extension,
# we should let it go through even if the installed version doesnt exist in Handler manifest (PIR) anymore.
# If target state is enabled and version not found in manifest, do not process the extension.
if ext_handler_i.decide_version(target_state=handler_state, extension=extension, gs_activity_id=self._gs_activity_id) is None and handler_state == ExtensionRequestedState.Enabled:
handler_version = ext_handler_i.ext_handler.version
name = ext_handler_i.ext_handler.name
err_msg = "Unable to find version {0} in manifest for extension {1}".format(handler_version, name)
ext_handler_i.set_operation(WALAEventOperation.Download)
raise ExtensionError(msg=err_msg)
# Handle everything on an extension level rather than Handler level
ext_handler_i.logger.info("Target handler state: {0} [{1}]", handler_state, goal_state_id)
if handler_state == ExtensionRequestedState.Enabled:
self.handle_enable(ext_handler_i, extension)
elif handler_state == ExtensionRequestedState.Disabled:
# The "disabled" state is now deprecated. Send telemetry if it is still being used on any VMs
event.info(WALAEventOperation.RequestedStateDisabled, 'Goal State is requesting "disabled" state on {0} [Activity ID: {1}]', ext_handler_i.ext_handler.name, self._gs_activity_id)
self.handle_disable(ext_handler_i, extension)
elif handler_state == ExtensionRequestedState.Uninstall:
self.handle_uninstall(ext_handler_i, extension=extension)
else:
message = u"Unknown ext handler state:{0}".format(handler_state)
raise ExtensionError(message)
return True
except MultiConfigExtensionEnableError as error:
ext_name = ext_handler_i.get_extension_full_name(extension)
err_msg = "Error processing MultiConfig extension {0}: {1}".format(ext_name, ustr(error))
# This error is only thrown for enable operation on MultiConfig extension.
# Since these are maintained by the extensions, the expectation here is that they would update their status files appropriately with their errors.
# The extensions should already have a placeholder status file, but incase they dont, setting one here to fail fast.
ext_handler_i.create_status_file_if_not_exist(extension, status=ExtensionStatusValue.error, code=error.code,
operation=ext_handler_i.operation, message=err_msg)
add_event(name=ext_name, version=ext_handler_i.ext_handler.version, op=ext_handler_i.operation,
is_success=False, log_event=True, message=err_msg)
except ExtensionsGoalStateError as error:
# Catch and report Invalid ExtensionConfig errors here to fail fast rather than timing out after 90 min
err_msg = "Ran into config errors: {0}. \nPlease retry again as another operation with updated settings".format(
ustr(error))
self.__handle_and_report_ext_handler_errors(ext_handler_i, error,
report_op=WALAEventOperation.InvalidExtensionConfig,
message=err_msg, extension=extension)
except ExtensionUpdateError as error:
# Not reporting the error as it has already been reported from the old version
self.__handle_and_report_ext_handler_errors(ext_handler_i, error, ext_handler_i.operation, ustr(error),
report=False, extension=extension)
except ExtensionDownloadError as error:
msg = "Failed to download artifacts: {0}".format(ustr(error))
self.__handle_and_report_ext_handler_errors(ext_handler_i, error, report_op=WALAEventOperation.Download,
message=msg, extension=extension)
except ExtensionError as error:
self.__handle_and_report_ext_handler_errors(ext_handler_i, error, ext_handler_i.operation, ustr(error),
extension=extension)
except Exception as error:
error.code = -1
self.__handle_and_report_ext_handler_errors(ext_handler_i, error, ext_handler_i.operation, ustr(error),
extension=extension)
return False