From 66f4e61148ac4d3d694112f9174422f36cce96d0 Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Tue, 2 Jul 2013 12:12:38 -0400 Subject: [PATCH] Integration with Feefie/Fofum for waking up the observer in a timely manner --- planetstack/core/models/plcorebase.py | 6 +++ planetstack/openstack/backend.py | 8 ++-- .../{event_listener.py => event_manager.py} | 38 ++++++++++++++++--- planetstack/openstack/observer.py | 19 +++++++++- 4 files changed, 61 insertions(+), 10 deletions(-) rename planetstack/openstack/{event_listener.py => event_manager.py} (73%) diff --git a/planetstack/core/models/plcorebase.py b/planetstack/core/models/plcorebase.py index 709fdc6..30d4df3 100644 --- a/planetstack/core/models/plcorebase.py +++ b/planetstack/core/models/plcorebase.py @@ -1,6 +1,8 @@ import os from django.db import models from django.forms.models import model_to_dict +from openstack.event_manager import EventSender + class PlCoreBase(models.Model): @@ -36,6 +38,10 @@ class PlCoreBase(models.Model): def save(self, *args, **kwargs): super(PlCoreBase, self).save(*args, **kwargs) + + # Tell the observer that the source database has been updated + EventSender().fire() + self.__initial = self._dict @property diff --git a/planetstack/openstack/backend.py b/planetstack/openstack/backend.py index 43afba7..2f4aa71 100644 --- a/planetstack/openstack/backend.py +++ b/planetstack/openstack/backend.py @@ -1,6 +1,6 @@ import threading from openstack.observer import OpenStackObserver -from openstack.event_listener import EventListener +from openstack.event_manager import EventListener class Backend: @@ -11,7 +11,7 @@ class Backend: observer_thread.start() # start event listene - event_listener = EventListener() - event_listener_thread = threading.Thread(target=event_listener.run) - event_listener_thread.start() + event_manager = EventListener(wake_up=observer.wake_up) + event_manager_thread = threading.Thread(target=event_manager.run) + event_manager_thread.start() diff --git a/planetstack/openstack/event_listener.py b/planetstack/openstack/event_manager.py similarity index 73% rename from planetstack/openstack/event_listener.py rename to planetstack/openstack/event_manager.py index e5c8909..d7102b6 100644 --- a/planetstack/openstack/event_listener.py +++ b/planetstack/openstack/event_manager.py @@ -1,7 +1,9 @@ import threading import requests, json + from core.models import * from openstack.manager import OpenStackManager +from planetstack.config import Config import os import base64 @@ -13,7 +15,7 @@ def event(func): return func class EventHandler: - + # This code is currently not in use. def __init__(self): self.manager = OpenStackManager() @@ -82,10 +84,25 @@ class EventHandler: self.manager.destroy_instance(instance_id) +class EventSender: + def __init__(self,user=None,clientid=None): + try: + clid = Config().feefie_client_id + user = Config().feefie_client_user + except: + clid = 'planetstack_core_team' + user = 'pl' + + self.fofum = Fofum(user=user) + self.fofum.make(clid) + + def fire(self): + self.fofum.fire() class EventListener: - def __init__(self): + def __init__(self,wake_up=None): self.handler = EventHandler() + self.wake_up = wake_up() def handle_event(self, payload): payload_dict = json.loads(payload) @@ -93,11 +110,22 @@ class EventListener: ctx = payload_dict['ctx'] self.handler.dispatch(event,**ctx) + if (self.wake_up): + self.wake_up() + + def run(self): # This is our unique client id, to be used when firing and receiving events - clid = base64.urlsafe_b64encode(os.urandom(12)) + # It needs to be generated once and placed in the config file + + try: + clid = Config().feefie_client_id + user = Config().feefie_client_user + except: + clid = 'planetstack_core_team' + user = 'pl' - f = Fofum() + f = Fofum(user=user) - listener_thread = threading.Thread(target=f.listen_on_event,args=(clid,self.handle_event)) + listener_thread = threading.Thread(target=f.listen_for_event,args=(clid,self.handle_event)) listener_thread.start() diff --git a/planetstack/openstack/observer.py b/planetstack/openstack/observer.py index b59530e..dce26aa 100644 --- a/planetstack/openstack/observer.py +++ b/planetstack/openstack/observer.py @@ -1,12 +1,15 @@ import time import traceback import commands +import threading + from datetime import datetime from collections import defaultdict from core.models import * from django.db.models import F, Q from openstack.manager import OpenStackManager from util.logger import Logger, logging +from timeout import timeout logger = Logger(logfile='observer.log', level=logging.INFO) @@ -15,6 +18,18 @@ class OpenStackObserver: def __init__(self): self.manager = OpenStackManager() + # The Condition object that gets signalled by Feefie events + self.event_cond = threading.Condition() + + def wait_for_event(self, timeout): + self.event_cond.acquire() + self.event_cond.wait(timeout) + self.event_cond.release() + + def wake_up(self): + self.event_cond.acquire() + self.event_cond.notify() + self.event_cond.release() def run(self): if not self.manager.enabled or not self.manager.has_openstack: @@ -28,7 +43,9 @@ class OpenStackObserver: self.sync_slivers() self.sync_sliver_ips() self.sync_external_routes() - time.sleep(10) + + self.wait_for_event(timeout=30) + except: traceback.print_exc() -- 2.43.0