You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
5.5 KiB
188 lines
5.5 KiB
class SystemEvent(object):
|
|
|
|
def __init__(self, name=None):
|
|
import logging
|
|
|
|
self.logger = logging.getLogger()
|
|
self.hub = None
|
|
self.messages = []
|
|
self.name = name
|
|
self.id = None
|
|
self.waiting = None
|
|
self.success = None
|
|
|
|
def __repr__(self):
|
|
if self.id:
|
|
return "<SystemEvent:%s>" % self.id
|
|
else:
|
|
return "<SystemEvent>"
|
|
|
|
def dict_repr(self):
|
|
from time import time
|
|
return {
|
|
"id": self.id,
|
|
"type": type(self).__name__,
|
|
"timestamp": time(),
|
|
"messages": self.messages,
|
|
"waiting": self.waiting,
|
|
"success": self.success
|
|
}
|
|
|
|
def register_hub(self, hub):
|
|
self.hub = hub
|
|
|
|
def register_message(self, message, level="INFO"):
|
|
self.messages.append(message)
|
|
self.hub.notify_observers(type="event-updated", event=self.dict_repr())
|
|
|
|
def set_id(self, id):
|
|
self.id = id
|
|
|
|
def get_id(self):
|
|
return self.id
|
|
|
|
def set_waiting(self, value):
|
|
self.waiting = value
|
|
self.hub.notify_observers(type="event-updated", event=self.dict_repr())
|
|
|
|
def set_success(self, value):
|
|
self.success = value
|
|
self.hub.notify_observers(type="event-updated", event=self.dict_repr())
|
|
self.hub.notify_observers(type="event-success", id=self.id, success=value)
|
|
|
|
def log_debug(self, message):
|
|
self.logger.debug(message)
|
|
self.register_message(message, "DEBUG")
|
|
|
|
def log_info(self, message):
|
|
self.logger.info(message)
|
|
self.register_message(message, "INFO")
|
|
|
|
def log_warning(self, message):
|
|
self.logger.warning(message)
|
|
self.register_message(message, "WARNING")
|
|
|
|
def log_error(self, message):
|
|
self.logger.error(message)
|
|
self.register_message(message, "ERROR")
|
|
|
|
def log_critical(self, message):
|
|
self.logger.critical(message)
|
|
self.register_message(message, "CRITICAL")
|
|
|
|
#def update(self):
|
|
# self.hub.notify_observers(type="event-updated", event=self.dict_repr())
|
|
|
|
|
|
class WebhookAction(SystemEvent):
|
|
"""Represents a webhook request event and keeps a copy of all incoming and outgoing data for monitoring purposes."""
|
|
|
|
def __init__(self, client_address, request_headers, request_body):
|
|
self.client_address = client_address
|
|
self.request_headers = request_headers
|
|
self.request_body = request_body
|
|
super(WebhookAction, self).__init__()
|
|
|
|
def __repr__(self):
|
|
return "<WebhookAction>"
|
|
|
|
def dict_repr(self):
|
|
data = super(WebhookAction, self).dict_repr()
|
|
data['client-address'] = self.client_address[0]
|
|
data['client-port'] = self.client_address[1]
|
|
data['request-headers'] = self.request_headers
|
|
data['request-body'] = self.request_body
|
|
return data
|
|
|
|
|
|
class DeployEvent(SystemEvent):
|
|
|
|
def __init__(self, project):
|
|
self.project = project
|
|
super(DeployEvent, self).__init__()
|
|
|
|
def __repr__(self):
|
|
return "<WebhookAction>"
|
|
|
|
def dict_repr(self):
|
|
data = super(DeployEvent, self).dict_repr()
|
|
data['name'] = self.project.get_name()
|
|
return data
|
|
|
|
|
|
class StartupEvent(SystemEvent):
|
|
|
|
def __init__(self, http_address=None, http_port=None, ws_address=None, ws_port=None):
|
|
self.http_address = http_address
|
|
self.http_port = http_port
|
|
self.http_started = None
|
|
self.ws_address = ws_address
|
|
self.ws_port = ws_port
|
|
self.ws_started = None
|
|
self.waiting = True
|
|
super(StartupEvent, self).__init__()
|
|
|
|
def __repr__(self):
|
|
return "<StartupEvent>"
|
|
|
|
def dict_repr(self):
|
|
data = super(StartupEvent, self).dict_repr()
|
|
data['http-address'] = self.http_address
|
|
data['http-port'] = self.http_port
|
|
data['http-started'] = self.http_started
|
|
data['ws-address'] = self.ws_address
|
|
data['ws-port'] = self.ws_port
|
|
data['ws-started'] = self.ws_started
|
|
return data
|
|
|
|
def set_http_started(self, value):
|
|
self.http_started = value
|
|
self.hub.notify_observers(type="event-updated", event=self.dict_repr())
|
|
self.validate_success()
|
|
|
|
def set_ws_started(self, value):
|
|
self.ws_started = value
|
|
self.hub.notify_observers(type="event-updated", event=self.dict_repr())
|
|
self.validate_success()
|
|
|
|
def validate_success(self):
|
|
if self.http_started is not False and self.ws_started is not False:
|
|
self.set_waiting(False)
|
|
self.set_success(True)
|
|
|
|
|
|
class EventStore(object):
|
|
|
|
def __init__(self):
|
|
self.actions = []
|
|
self.observers = []
|
|
self.next_id = 0
|
|
|
|
def register_observer(self, observer):
|
|
self.observers.append(observer)
|
|
|
|
def unregister_observer(self, observer):
|
|
if observer in self.observers:
|
|
self.observers.remove(observer)
|
|
|
|
def notify_observers(self, *args, **kwargs):
|
|
for observer in self.observers:
|
|
observer.update(*args, **kwargs)
|
|
|
|
def register_action(self, event):
|
|
event.set_id(self.next_id)
|
|
event.register_hub(self)
|
|
self.next_id = self.next_id + 1
|
|
self.actions.append(event)
|
|
self.notify_observers(type="new-event", event=event.dict_repr())
|
|
|
|
# Store max 100 actions
|
|
if len(self.actions) > 100:
|
|
self.actions.pop(0)
|
|
|
|
def dict_repr(self):
|
|
action_repr = []
|
|
for action in self.actions:
|
|
action_repr.append(action.dict_repr())
|
|
return action_repr
|