10224: Choose a recent-event threshold without querying the entire event history.
[arvados.git] / sdk / python / arvados / keep.py
index 5416379ad03bac620d669f10a53769a980523dbb..db7835be3746f8f67eddd61d2aac505356e601f4 100644 (file)
@@ -12,6 +12,7 @@ import ssl
 import sys
 import threading
 import timer
+import urlparse
 
 import arvados
 import arvados.config as config
@@ -635,8 +636,9 @@ class KeepClient(object):
         :proxy:
           If specified, this KeepClient will send requests to this Keep
           proxy.  Otherwise, KeepClient will fall back to the setting of the
-          ARVADOS_KEEP_PROXY configuration setting.  If you want to ensure
-          KeepClient does not use a proxy, pass in an empty string.
+          ARVADOS_KEEP_SERVICES or ARVADOS_KEEP_PROXY configuration settings.
+          If you want to KeepClient does not use a proxy, pass in an empty
+          string.
 
         :timeout:
           The initial timeout (in seconds) for HTTP requests to Keep
@@ -678,11 +680,11 @@ class KeepClient(object):
           put() are called.  Default 0.
         """
         self.lock = threading.Lock()
-        if config.get('ARVADOS_KEEP_SERVICES'):
-            # ARVADOS_KEEP_SERVICES overrides proxy settings
-            proxy = config.get('ARVADOS_KEEP_SERVICES')
-        elif proxy is None:
-            proxy = config.get('ARVADOS_KEEP_PROXY')
+        if proxy is None:
+            if config.get('ARVADOS_KEEP_SERVICES'):
+                proxy = config.get('ARVADOS_KEEP_SERVICES')
+            else:
+                proxy = config.get('ARVADOS_KEEP_PROXY')
         if api_token is None:
             if api_client is None:
                 api_token = config.get('ARVADOS_API_TOKEN')
@@ -713,17 +715,21 @@ class KeepClient(object):
             self.num_retries = num_retries
             self.max_replicas_per_service = None
             if proxy:
-                proxy_uris = proxy.split(' ')
+                proxy_uris = proxy.split()
                 for i in range(len(proxy_uris)):
                     if not proxy_uris[i].endswith('/'):
                         proxy_uris[i] += '/'
+                    # URL validation
+                    url = urlparse.urlparse(proxy_uris[i])
+                    if not (url.scheme and url.netloc):
+                        raise arvados.errors.ArgumentError("Invalid proxy URI: {}".format(proxy_uris[i]))
                 self.api_token = api_token
                 self._gateway_services = {}
                 self._keep_services = [{
-                    'uuid': "00000-bi6l4-%015d" % proxy_uris.index(uri),
+                    'uuid': "00000-bi6l4-%015d" % idx,
                     'service_type': 'proxy',
                     '_service_root': uri,
-                    } for uri in proxy_uris]
+                    } for idx, uri in enumerate(proxy_uris)]
                 self._writable_services = self._keep_services
                 self.using_proxy = True
                 self._static_services_list = True