Merge branch 'master' into 4904-arv-web
authorPeter Amstutz <peter.amstutz@curoverse.com>
Wed, 11 Feb 2015 21:01:24 +0000 (16:01 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Wed, 11 Feb 2015 21:01:24 +0000 (16:01 -0500)
Conflicts:
sdk/python/arvados/events.py

1  2 
doc/_config.yml
sdk/python/arvados/events.py
services/fuse/arvados_fuse/__init__.py

diff --cc doc/_config.yml
Simple merge
index a26c70a38bb700ca4608b3c1a30c0ed407ca4254,268692637afb7a45721322f1617b3aea50788d60..09f2a871a966522201f5808e09fb37a820b1baf5
@@@ -58,6 -65,6 +65,7 @@@ class PollClient(threading.Thread)
              self.filters = [[]]
          self.on_event = on_event
          self.poll_time = poll_time
++        self.daemon = True
          self.stop = threading.Event()
  
      def run(self):
          del self.filters[self.filters.index(filters)]
  
  
+ def _subscribe_websocket(api, filters, on_event):
+     endpoint = api._rootDesc.get('websocketUrl', None)
+     if not endpoint:
+         raise errors.FeatureNotEnabledError(
+             "Server does not advertise a websocket endpoint")
+     uri_with_token = "{}?api_token={}".format(endpoint, api.api_token)
+     client = EventClient(uri_with_token, filters, on_event)
+     ok = False
+     try:
+         client.connect()
+         ok = True
+         return client
+     finally:
+         if not ok:
+             client.close_connection()
  def subscribe(api, filters, on_event, poll_fallback=15):
--    '''
-     api: Must be a newly created from arvados.api(cache=False), not shared with the caller, as it may be used by a background thread.
 -    api: a client object retrieved from arvados.api(). The caller should not use this client object for anything else after calling subscribe().
--    filters: Initial subscription filters.
-     on_event: The callback when a message is received
 -    on_event: The callback when a message is received.
--    poll_fallback: If websockets are not available, fall back to polling every N seconds.  If poll_fallback=False, this will return None if websockets are not available.
--    '''
-     ws = None
-     if 'websocketUrl' in api._rootDesc:
-         try:
-             url = "{}?api_token={}".format(api._rootDesc['websocketUrl'], api.api_token)
-             ws = EventClient(url, filters, on_event)
-             ws.connect()
-             return ws
-         except Exception as e:
-             _logger.warn("Got exception %s trying to connect to websockets at %s" % (e, api._rootDesc['websocketUrl']))
-             if ws:
-                 ws.close_connection()
-     if poll_fallback:
-         _logger.warn("Websockets not available, falling back to log table polling")
-         p = PollClient(api, filters, on_event, poll_fallback)
-         p.daemon = True
-         p.start()
-         return p
-     else:
-         _logger.error("Websockets not available")
-         return None
++    """
++    :api:
++      a client object retrieved from arvados.api(). The caller should not use this client object for anything else after calling subscribe().
++    :filters:
++      Initial subscription filters.
++    :on_event:
++      The callback when a message is received.
++    :poll_fallback:
++      If websockets are not available, fall back to polling every N seconds.  If poll_fallback=False, this will return None if websockets are not available.
++    """
++
+     if not poll_fallback:
+         return _subscribe_websocket(api, filters, on_event)
+     try:
+         return _subscribe_websocket(api, filters, on_event)
+     except Exception as e:
+         _logger.warn("Falling back to polling after websocket error: %s" % e)
+     p = PollClient(api, filters, on_event, poll_fallback)
+     p.start()
+     return p