cleanup
[plstackapi.git] / planetstack / openstack / event_listener.py
1 import threading
2 import requests, json
3 from core.models import *
4 from openstack.manager import OpenStackManager
5
6 # decorator that marks dispatachable event methods  
7 def event(func):
8     setattr(func, 'event', func.__name__)
9     return func      
10
11 class EventHandler:
12
13     def __init__(self):
14         self.manager = OpenStackManager()
15
16     @staticmethod
17     def get_events():
18         events = []
19         for name in dir(EventHandler):
20             attribute = getattr(EventHandler, name)
21             if hasattr(attribute, 'event'):
22                 events.append(getattr(attribute, 'event'))
23         return events
24
25     def dispatch(self, event, *args, **kwds):
26         if hasattr(self, event):
27             return getattr(self, event)(*args, **kwds)
28             
29         
30     @event
31     def save_site(self, id):
32         sites = Site.objects.filter(id=id)
33         if sites:
34             self.manager.save_site(sites[0])
35     
36     @event
37     def delete_site(self, tenant_id):
38         self.manager.driver.delete_tenant(tenant_id)
39
40     @event
41     def save_site_privilege(self, id):
42         site_privileges = SitePrivilege.objects.filter(id=id)
43         if site_privileges:
44             site_priv = self.manager.save_site_privilege(site_privileges[0])
45
46     @event
47     def delete_site_privilege(self, kuser_id, tenant_id, role_type):
48         self.manager.driver.delete_user_role(kuser_id, tenant_id, role_type)
49
50     @event
51     def save_slice(self, id):
52         slices = Slice.objects.filter(id=id)
53         if slices:
54             self.manager.save_slice(slices[0])
55     
56     @event
57     def delete_slice(self, tenant_id, network_id, router_id, subnet_id):
58         self.manager._delete_slice(tenant_id, network_id, router_id, subnet_id)
59
60     @event
61     def save_user(self, id):
62         users = User.objects.filter(id=id)
63         if users:
64             self.manager.save_user(users[0])
65         
66     @event
67     def delete_user(self, kuser_id):
68         self.manager.driver.delete_user(kuser_id)
69     
70     @event
71     def save_sliver(self, id):
72         slivers = Sliver.objects.filter(id=id)
73         if slivers:
74             self.manager.save_sliver(slivers[0])
75
76     @event
77     def delete_sliver(self, instance_id):
78         self.manager.destroy_instance(instance_id)                            
79
80     
81
82 class EventListener:
83
84     def __init__(self):
85         self.handler = EventHandler()
86
87     def listen_for_event(self, event, hash):
88         url = 'http://www.feefie.com/command'
89         params = {'action': 'subscribe',
90                   'hash': hash,
91                   'htm': 1}
92         while True:
93             r = requests.get(url, params=params)
94             r_data = json.loads(r)
95             payload = r_data.get('payload')
96             self.handler.dispatch(event, **payload)
97
98
99     def run(self):
100         # register events
101         event_names = [{'title': name} for name in EventHandler.get_events()]
102         url = 'http://www.feefie.com/command'
103         params = {'action': 'add',
104                   'u': 'pl',
105                   'events': json.dumps(event_names)}
106         r = requests.get(url, params=params)
107         r_data = json.loads(r)
108         events = r_data.get('events', [])
109         # spanw a  thread for each event
110         for event in events:
111             args = (event['title'], event['hash'])
112             listener_thread = threading.Thread(target=self.listen_for_event, args=args)
113             listener_tread.start()
114