2800: Allow api() caller to specify api host and token.
[arvados.git] / sdk / python / arvados / events.py
1 from ws4py.client.threadedclient import WebSocketClient
2 import thread
3 import json
4 import os
5 import time
6 import ssl
7 import re
8 import config
9 import logging
10
11 class EventClient(WebSocketClient):
12     def __init__(self, url, filters, on_event):
13         ssl_options = None
14         if re.match(r'(?i)^(true|1|yes)$',
15                     config.get('ARVADOS_API_HOST_INSECURE', 'no')):
16             ssl_options={'cert_reqs': ssl.CERT_NONE}
17         else:
18             ssl_options={'cert_reqs': ssl.CERT_REQUIRED}
19
20         super(EventClient, self).__init__(url, ssl_options)
21         self.filters = filters
22         self.on_event = on_event
23
24     def opened(self):
25         self.send(json.dumps({"method": "subscribe", "filters": self.filters}))
26
27     def received_message(self, m):
28         self.on_event(json.loads(str(m)))
29
30     def close_connection(self):
31         try:
32             self.sock.shutdown(socket.SHUT_RDWR)
33             self.sock.close()
34         except:
35             pass
36
37 def subscribe(api, filters, on_event):
38     ws = None
39     try:
40         url = "{}?api_token={}".format(api._rootDesc['websocketUrl'], config.get('ARVADOS_API_TOKEN'))
41         ws = EventClient(url, filters, on_event)
42         ws.connect()
43         return ws
44     except:
45         logging.exception('')
46         if (ws):
47           ws.close_connection()        
48         raise