instantiate sycn steps with openstack driver. Implement garbage collector and deleters
[plstackapi.git] / planetstack / observer / event_manager.py
1 import threading
2 import requests, json
3
4 from core.models import *
5 from planetstack.config import Config
6 from observer.deleters import deleters
7
8 import os
9 import base64
10 from fofum import Fofum
11 import json
12
13 # decorator that marks dispatachable event methods      
14 def event(func):
15         setattr(func, 'event', func.__name__)
16         return func              
17
18 class EventHandler:
19         # This code is currently not in use.
20         def __init__(self):
21         pass 
22
23         @staticmethod
24         def get_events():
25                 events = []
26                 for name in dir(EventHandler):
27                         attribute = getattr(EventHandler, name)
28                         if hasattr(attribute, 'event'):
29                                 events.append(getattr(attribute, 'event'))
30                 return events
31
32         def dispatch(self, event, *args, **kwds):
33                 if hasattr(self, event):
34                         return getattr(self, event)(*args, **kwds)
35                         
36                 
37 class EventSender:
38         def __init__(self,user=None,clientid=None):
39                 try:
40                         clid = Config().feefie_client_id
41                         user = Config().feefie_client_user
42                 except:
43                         clid = 'planetstack_core_team'
44                         user = 'pl'
45
46                 self.fofum = Fofum(user=user)
47                 self.fofum.make(clid)
48
49         def fire(self,**args):
50                 self.fofum.fire(json.dumps(args))
51
52 class EventListener:
53         def __init__(self,wake_up=None):
54                 self.handler = EventHandler()
55                 self.wake_up = wake_up
56
57         def handle_event(self, payload):
58                 payload_dict = json.loads(payload)
59
60                 try:
61                         deletion = payload_dict['deletion_flag']
62                         if (deletion):
63                                 model = payload_dict['model']
64                                 pk = payload_dict['pk']
65
66                                 for deleter in deleters[model]:
67                                         deleter(pk)
68                 except:
69                         deletion = False
70
71                 if (not deletion and self.wake_up):
72                         self.wake_up()
73                 
74
75         def run(self):
76                 # This is our unique client id, to be used when firing and receiving events
77                 # It needs to be generated once and placed in the config file
78
79                 try:
80                         clid = Config().feefie_client_id
81                         user = Config().feefie_client_user
82                 except:
83                         clid = 'planetstack_core_team'
84                         user = 'pl'
85
86                 f = Fofum(user=user)
87                 
88                 listener_thread = threading.Thread(target=f.listen_for_event,args=(clid,self.handle_event))
89                 listener_thread.start()