diff options
author | Ćukasz 'sil2100' Zemczak <lukasz.zemczak@ubuntu.com> | 2017-09-04 10:27:07 +0200 |
---|---|---|
committer | usd-importer <ubuntu-server@lists.ubuntu.com> | 2017-09-04 09:38:24 +0000 |
commit | 185ceb32fea5d5c2a43d7b6ee2a40228489055f4 (patch) | |
tree | 2e1c9cc42510c4a922cf63fa265ec0e1945ec14b /azurelinuxagent/common/event.py | |
parent | 43bdf9debe5377216aed0086bff2aad864f6ba82 (diff) | |
download | vyos-walinuxagent-185ceb32fea5d5c2a43d7b6ee2a40228489055f4.tar.gz vyos-walinuxagent-185ceb32fea5d5c2a43d7b6ee2a40228489055f4.zip |
Import patches-unapplied version 2.2.16-0ubuntu1 to ubuntu/artful-proposed
Imported using git-ubuntu import.
Changelog parent: 43bdf9debe5377216aed0086bff2aad864f6ba82
New changelog entries:
* New upstream release (LP: #1714299).
Diffstat (limited to 'azurelinuxagent/common/event.py')
-rw-r--r-- | azurelinuxagent/common/event.py | 127 |
1 files changed, 105 insertions, 22 deletions
diff --git a/azurelinuxagent/common/event.py b/azurelinuxagent/common/event.py index 723b8bf..e62a925 100644 --- a/azurelinuxagent/common/event.py +++ b/azurelinuxagent/common/event.py @@ -27,6 +27,7 @@ import platform from datetime import datetime, timedelta +import azurelinuxagent.common.conf as conf import azurelinuxagent.common.logger as logger from azurelinuxagent.common.exception import EventError, ProtocolError @@ -39,13 +40,15 @@ from azurelinuxagent.common.version import DISTRO_NAME, DISTRO_VERSION, \ DISTRO_CODE_NAME, AGENT_VERSION, \ CURRENT_AGENT, CURRENT_VERSION -_EVENT_MSG = "Event: name={0}, op={1}, message={2}" +_EVENT_MSG = "Event: name={0}, op={1}, message={2}, duration={3}" class WALAEventOperation: ActivateResourceDisk = "ActivateResourceDisk" + AutoUpdate = "AutoUpdate" Disable = "Disable" Download = "Download" Enable = "Enable" + Firewall = "Firewall" HealthCheck = "HealthCheck" HeartBeat = "HeartBeat" HostPlugin = "HostPlugin" @@ -60,13 +63,70 @@ class WALAEventOperation: Upgrade = "Upgrade" Update = "Update" -def _log_event(name, op, message, is_success=True): + +class EventStatus(object): + EVENT_STATUS_FILE = "event_status.json" + + def __init__(self, status_dir=conf.get_lib_dir()): + self._path = None + self._status = {} + + def clear(self): + self._status = {} + self._save() + + def event_marked(self, name, version, op): + return self._event_name(name, version, op) in self._status + + def event_succeeded(self, name, version, op): + event = self._event_name(name, version, op) + if event not in self._status: + return True + return self._status[event] == True + + def initialize(self, status_dir=conf.get_lib_dir()): + self._path = os.path.join(status_dir, EventStatus.EVENT_STATUS_FILE) + self._load() + + def mark_event_status(self, name, version, op, status): + event = self._event_name(name, version, op) + self._status[event] = (status == True) + self._save() + + def _event_name(self, name, version, op): + return "{0}-{1}-{2}".format(name, version, op) + + def _load(self): + try: + self._status = {} + if os.path.isfile(self._path): + with open(self._path, 'r') as f: + self._status = json.load(f) + except Exception as e: + logger.warn("Exception occurred loading event status: {0}".format(e)) + self._status = {} + + def _save(self): + try: + with open(self._path, 'w') as f: + json.dump(self._status, f) + except Exception as e: + logger.warn("Exception occurred saving event status: {0}".format(e)) + +__event_status__ = EventStatus() +__event_status_operations__ = [ + WALAEventOperation.AutoUpdate, + WALAEventOperation.ReportStatus + ] + + +def _log_event(name, op, message, duration, is_success=True): global _EVENT_MSG if not is_success: - logger.error(_EVENT_MSG, name, op, message) + logger.error(_EVENT_MSG, name, op, message, duration) else: - logger.info(_EVENT_MSG, name, op, message) + logger.info(_EVENT_MSG, name, op, message, duration) class EventLogger(object): @@ -76,7 +136,7 @@ class EventLogger(object): def save_event(self, data): if self.event_dir is None: - logger.warn("Event reporter is not initialized.") + logger.warn("Cannot save event -- Event reporter is not initialized.") return if not os.path.exists(self.event_dir): @@ -104,11 +164,11 @@ class EventLogger(object): raise EventError("Failed to write events to file:{0}", e) def reset_periodic(self): - self.periodic_messages = {} + self.periodic_events = {} def is_period_elapsed(self, delta, h): - return h not in self.periodic_messages or \ - (self.periodic_messages[h] + delta) <= datetime.now() + return h not in self.periodic_events or \ + (self.periodic_events[h] + delta) <= datetime.now() def add_periodic(self, delta, name, op="", is_success=True, duration=0, @@ -122,13 +182,21 @@ class EventLogger(object): op=op, is_success=is_success, duration=duration, version=version, message=message, evt_type=evt_type, is_internal=is_internal, log_event=log_event) - self.periodic_messages[h] = datetime.now() + self.periodic_events[h] = datetime.now() - def add_event(self, name, op="", is_success=True, duration=0, + def add_event(self, + name, + op="", + is_success=True, + duration=0, version=CURRENT_VERSION, - message="", evt_type="", is_internal=False, log_event=True): + message="", + evt_type="", + is_internal=False, + log_event=True): + if not is_success or log_event: - _log_event(name, op, message, is_success=is_success) + _log_event(name, op, message, duration, is_success=is_success) event = TelemetryEvent(1, "69B669B9-4AF8-4C50-BDC4-6006FA76E975") event.parameters.append(TelemetryEventParam('Name', name)) @@ -176,22 +244,24 @@ def add_event(name, op="", is_success=True, duration=0, version=CURRENT_VERSION, message="", evt_type="", is_internal=False, log_event=True, reporter=__event_logger__): if reporter.event_dir is None: - logger.warn("Event reporter is not initialized.") - _log_event(name, op, message, is_success=is_success) + logger.warn("Cannot add event -- Event reporter is not initialized.") + _log_event(name, op, message, duration, is_success=is_success) return - reporter.add_event( - name, op=op, is_success=is_success, duration=duration, - version=str(version), message=message, evt_type=evt_type, - is_internal=is_internal, log_event=log_event) + if should_emit_event(name, version, op, is_success): + mark_event_status(name, version, op, is_success) + reporter.add_event( + name, op=op, is_success=is_success, duration=duration, + version=str(version), message=message, evt_type=evt_type, + is_internal=is_internal, log_event=log_event) def add_periodic( delta, name, op="", is_success=True, duration=0, version=CURRENT_VERSION, message="", evt_type="", is_internal=False, log_event=True, force=False, reporter=__event_logger__): if reporter.event_dir is None: - logger.warn("Event reporter is not initialized.") - _log_event(name, op, message, is_success=is_success) + logger.warn("Cannot add periodic event -- Event reporter is not initialized.") + _log_event(name, op, message, duration, is_success=is_success) return reporter.add_periodic( @@ -199,9 +269,22 @@ def add_periodic( version=str(version), message=message, evt_type=evt_type, is_internal=is_internal, log_event=log_event, force=force) -def init_event_logger(event_dir, reporter=__event_logger__): - reporter.event_dir = event_dir +def mark_event_status(name, version, op, status): + if op in __event_status_operations__: + __event_status__.mark_event_status(name, version, op, status) + +def should_emit_event(name, version, op, status): + return \ + op not in __event_status_operations__ or \ + __event_status__ is None or \ + not __event_status__.event_marked(name, version, op) or \ + __event_status__.event_succeeded(name, version, op) != status + +def init_event_logger(event_dir): + __event_logger__.event_dir = event_dir +def init_event_status(status_dir): + __event_status__.initialize(status_dir) def dump_unhandled_err(name): if hasattr(sys, 'last_type') and hasattr(sys, 'last_value') and \ |