diff options
Diffstat (limited to 'azurelinuxagent/ga/exthandlers.py')
-rw-r--r-- | azurelinuxagent/ga/exthandlers.py | 116 |
1 files changed, 32 insertions, 84 deletions
diff --git a/azurelinuxagent/ga/exthandlers.py b/azurelinuxagent/ga/exthandlers.py index cc1796b..fa51279 100644 --- a/azurelinuxagent/ga/exthandlers.py +++ b/azurelinuxagent/ga/exthandlers.py @@ -22,7 +22,6 @@ import glob import json import os import os.path -import random import re import shutil import stat @@ -33,22 +32,25 @@ import zipfile import azurelinuxagent.common.conf as conf import azurelinuxagent.common.logger as logger import azurelinuxagent.common.utils.fileutil as fileutil +import azurelinuxagent.common.utils.restutil as restutil +import azurelinuxagent.common.utils.shellutil as shellutil import azurelinuxagent.common.version as version -from azurelinuxagent.common.errorstate import ErrorState, ERROR_STATE_DELTA -from azurelinuxagent.common.event import add_event, WALAEventOperation, elapsed_milliseconds -from azurelinuxagent.common.exception import ExtensionError, ProtocolError, RestartError +from azurelinuxagent.common.event import add_event, WALAEventOperation +from azurelinuxagent.common.exception import ExtensionError, ProtocolError, HttpError from azurelinuxagent.common.future import ustr +from azurelinuxagent.common.version import AGENT_VERSION from azurelinuxagent.common.protocol.restapi import ExtHandlerStatus, \ ExtensionStatus, \ ExtensionSubStatus, \ + Extension, \ VMStatus, ExtHandler, \ get_properties, \ set_properties from azurelinuxagent.common.utils.flexible_version import FlexibleVersion +from azurelinuxagent.common.utils.textutil import Version from azurelinuxagent.common.protocol import get_protocol_util -from azurelinuxagent.common.version import AGENT_NAME, CURRENT_VERSION - +from azurelinuxagent.common.version import AGENT_NAME, CURRENT_AGENT, CURRENT_VERSION #HandlerEnvironment.json schema version HANDLER_ENVIRONMENT_VERSION = 1.0 @@ -174,12 +176,9 @@ class ExtHandlersHandler(object): self.protocol = None self.ext_handlers = None self.last_etag = None - self.last_upgrade_guids = {} + self.last_guids = {} self.log_report = False self.log_etag = True - self.log_process = False - - self.report_status_error_state = ErrorState() def run(self): self.ext_handlers, etag = None, None @@ -207,8 +206,6 @@ class ExtHandlersHandler(object): self.report_ext_handlers_status() self.cleanup_outdated_handlers() - except RestartError: - raise except Exception as e: msg = u"Exception processing extension handlers: {0}".format( ustr(e)) @@ -224,19 +221,11 @@ class ExtHandlersHandler(object): self.report_ext_handlers_status() return - def get_upgrade_guid(self, name): - return self.last_upgrade_guids.get(name, (None, False))[0] - - def get_log_upgrade_guid(self, ext_handler): - return self.last_upgrade_guids.get(ext_handler.name, (None, False))[1] - - def set_log_upgrade_guid(self, ext_handler, log_val): - guid = self.get_upgrade_guid(ext_handler.name) - if guid is not None: - self.last_upgrade_guids[ext_handler.name] = (guid, log_val) + def get_guid(self, name): + return self.last_guids.get(name, None) def is_new_guid(self, ext_handler): - last_guid = self.get_upgrade_guid(ext_handler.name) + last_guid = self.get_guid(ext_handler.name) if last_guid is None: return True return last_guid != ext_handler.properties.upgradeGuid @@ -330,23 +319,10 @@ class ExtHandlersHandler(object): if state == u"enabled" and \ ext_handler.properties.upgradeGuid is not None and \ not self.is_new_guid(ext_handler): - ext_handler_i.ext_handler.properties.version = ext_handler_i.get_installed_version() - ext_handler_i.set_logger() - if self.last_etag != etag: - self.set_log_upgrade_guid(ext_handler, True) - - msg = "New GUID is the same as the old GUID. Exiting without upgrading." - if self.get_log_upgrade_guid(ext_handler): - ext_handler_i.logger.info(msg) - self.set_log_upgrade_guid(ext_handler, False) - ext_handler_i.set_handler_state(ExtHandlerState.Enabled) - ext_handler_i.set_handler_status(status="Ready", message="No change") - ext_handler_i.set_operation(WALAEventOperation.SkipUpdate) - ext_handler_i.report_event(message=ustr(msg), is_success=True) + logger.info("New GUID is the same as the old GUID. Exiting without upgrading.") return - self.set_log_upgrade_guid(ext_handler, True) - ext_handler_i.decide_version(etag=etag, target_state=state) + ext_handler_i.decide_version(target_state=state) if not ext_handler_i.is_upgrade and self.last_etag == etag: if self.log_etag: ext_handler_i.logger.verbose("Version {0} is current for etag {1}", @@ -362,29 +338,23 @@ class ExtHandlersHandler(object): self.handle_enable(ext_handler_i) if ext_handler.properties.upgradeGuid is not None: ext_handler_i.logger.info("New Upgrade GUID: {0}", ext_handler.properties.upgradeGuid) - self.last_upgrade_guids[ext_handler.name] = (ext_handler.properties.upgradeGuid, True) + self.last_guids[ext_handler.name] = ext_handler.properties.upgradeGuid elif state == u"disabled": self.handle_disable(ext_handler_i) # Remove the GUID from the dictionary so that it is upgraded upon re-enable - self.last_upgrade_guids.pop(ext_handler.name, None) + self.last_guids.pop(ext_handler.name, None) elif state == u"uninstall": self.handle_uninstall(ext_handler_i) # Remove the GUID from the dictionary so that it is upgraded upon re-install - self.last_upgrade_guids.pop(ext_handler.name, None) + self.last_guids.pop(ext_handler.name, None) else: message = u"Unknown ext handler state:{0}".format(state) raise ExtensionError(message) - except RestartError: - ext_handler_i.logger.info("GoalState became stale during " - "processing. Restarting with new " - "GoalState") - raise except Exception as e: ext_handler_i.set_handler_status(message=ustr(e), code=-1) ext_handler_i.report_event(message=ustr(e), is_success=False) def handle_enable(self, ext_handler_i): - self.log_process = True old_ext_handler_i = ext_handler_i.get_installed_ext_handler() if old_ext_handler_i is not None and \ old_ext_handler_i.version_gt(ext_handler_i): @@ -411,7 +381,6 @@ class ExtHandlersHandler(object): ext_handler_i.enable() def handle_disable(self, ext_handler_i): - self.log_process = True handler_state = ext_handler_i.get_handler_state() ext_handler_i.logger.info("[Disable] current handler state is: {0}", handler_state.lower()) @@ -419,7 +388,6 @@ class ExtHandlersHandler(object): ext_handler_i.disable() def handle_uninstall(self, ext_handler_i): - self.log_process = True handler_state = ext_handler_i.get_handler_state() ext_handler_i.logger.info("[Uninstall] current handler state is: {0}", handler_state.lower()) @@ -428,7 +396,7 @@ class ExtHandlersHandler(object): ext_handler_i.disable() ext_handler_i.uninstall() ext_handler_i.rm_ext_handler_dir() - + def report_ext_handlers_status(self): """Go through handler_state dir, collect and report status""" vm_status = VMStatus(status="Ready", message="Guest Agent is running") @@ -449,9 +417,7 @@ class ExtHandlersHandler(object): self.protocol.report_vm_status(vm_status) if self.log_report: logger.verbose("Completed vm agent status report") - self.report_status_error_state.reset() except ProtocolError as e: - self.report_status_error_state.incr() message = "Failed to report vm agent status: {0}".format(e) add_event(AGENT_NAME, version=CURRENT_VERSION, @@ -459,25 +425,13 @@ class ExtHandlersHandler(object): is_success=False, message=message) - if self.report_status_error_state.is_triggered(): - message = "Failed to report vm agent status for more than {0}"\ - .format(ERROR_STATE_DELTA) - - add_event(AGENT_NAME, - version=CURRENT_VERSION, - op=WALAEventOperation.ExtensionProcessing, - is_success=False, - message=message) - - self.report_status_error_state.reset() - def report_ext_handler_status(self, vm_status, ext_handler): ext_handler_i = ExtHandlerInstance(ext_handler, self.protocol) handler_status = ext_handler_i.get_handler_status() if handler_status is None: return - guid = self.get_upgrade_guid(ext_handler.name) + guid = self.get_guid(ext_handler.name) if guid is not None: handler_status.upgradeGuid = guid @@ -507,7 +461,9 @@ class ExtHandlerInstance(object): self.pkg = None self.pkg_file = None self.is_upgrade = False - self.set_logger() + + prefix = "[{0}]".format(self.get_full_name()) + self.logger = logger.Logger(logger.DEFAULT_LOGGER, prefix) try: fileutil.mkdir(self.get_log_dir(), mode=0o755) @@ -518,9 +474,12 @@ class ExtHandlerInstance(object): self.logger.add_appender(logger.AppenderType.FILE, logger.LogLevel.INFO, log_file) - def decide_version(self, etag, target_state=None): + def decide_version(self, target_state=None): self.logger.verbose("Decide which version to use") - pkg_list = self.protocol.get_ext_handler_pkgs(self.ext_handler, etag) + try: + pkg_list = self.protocol.get_ext_handler_pkgs(self.ext_handler) + except ProtocolError as e: + raise ExtensionError("Failed to get ext handler pkgs", e) # Determine the desired and installed versions requested_version = FlexibleVersion( @@ -627,13 +586,8 @@ class ExtHandlerInstance(object): raise ExtensionError("Failed to find any valid extension package") self.logger.verbose("Use version: {0}", self.pkg.version) - self.set_logger() return - def set_logger(self): - prefix = "[{0}]".format(self.get_full_name()) - self.logger = logger.Logger(logger.DEFAULT_LOGGER, prefix) - def version_gt(self, other): self_version = self.ext_handler.properties.version other_version = other.ext_handler.properties.version @@ -693,22 +647,19 @@ class ExtHandlerInstance(object): def set_operation(self, op): self.operation = op - def report_event(self, message="", is_success=True, duration=0): + def report_event(self, message="", is_success=True): version = self.ext_handler.properties.version add_event(name=self.ext_handler.name, version=version, message=message, - op=self.operation, is_success=is_success, duration=duration) + op=self.operation, is_success=is_success) def download(self): - begin_utc = datetime.datetime.utcnow() self.logger.verbose("Download extension package") self.set_operation(WALAEventOperation.Download) if self.pkg is None: raise ExtensionError("No package uri found") package = None - uris_shuffled = self.pkg.uris - random.shuffle(uris_shuffled) - for uri in uris_shuffled: + for uri in self.pkg.uris: try: package = self.protocol.download_ext_handler_pkg(uri.uri) if package is not None: @@ -734,8 +685,7 @@ class ExtHandlerInstance(object): for file in fileutil.get_all_files(self.get_base_dir()): fileutil.chmod(file, os.stat(file).st_mode | stat.S_IXUSR) - duration = elapsed_milliseconds(begin_utc) - self.report_event(message="Download succeeded", duration=duration) + self.report_event(message="Download succeeded") self.logger.info("Initialize extension directory") #Save HandlerManifest.json @@ -942,7 +892,6 @@ class ExtHandlerInstance(object): return last_update <= 600 # updated within the last 10 min def launch_command(self, cmd, timeout=300): - begin_utc = datetime.datetime.utcnow() self.logger.verbose("Launch command: [{0}]", cmd) base_dir = self.get_base_dir() try: @@ -968,8 +917,7 @@ class ExtHandlerInstance(object): if ret == None or ret != 0: raise ExtensionError("Non-zero exit code: {0}, {1}".format(ret, cmd)) - duration = elapsed_milliseconds(begin_utc) - self.report_event(message="Launch command succeeded: {0}".format(cmd), duration=duration) + self.report_event(message="Launch command succeeded: {0}".format(cmd)) def load_manifest(self): man_file = self.get_manifest_file() |