summaryrefslogtreecommitdiff
path: root/azurelinuxagent/ga/exthandlers.py
diff options
context:
space:
mode:
Diffstat (limited to 'azurelinuxagent/ga/exthandlers.py')
-rw-r--r--azurelinuxagent/ga/exthandlers.py116
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()