Merge branch '4434-collation' closes #4434
[arvados.git] / sdk / python / arvados / retry.py
index 5dc31aefa74919e165ba0b725c53debb0d5fbb4b..52a68faa6f6b511bf78378cc944aa6e4c5914c33 100644 (file)
@@ -1,5 +1,7 @@
 #!/usr/bin/env python
 
+import functools
+import inspect
 import time
 
 from collections import deque
@@ -108,11 +110,11 @@ class RetryLoop(object):
 
 
 def check_http_response_success(result):
-    """Convert an httplib2 request result to a loop control flag.
+    """Convert a 'requests' response to a loop control flag.
 
-    Pass this method the 2-tuple returned by httplib2.Http.request.  It
-    returns True if the response indicates success, None if it indicates
-    temporary failure, and False otherwise.  You can use this as the
+    Pass this method a requests.Response object.  It returns True if
+    the response indicates success, None if it indicates temporary
+    failure, and False otherwise.  You can use this as the
     success_check for a RetryLoop.
 
     Implementation details:
@@ -127,7 +129,7 @@ def check_http_response_success(result):
       retry those requests verbatim.
     """
     try:
-        status = int(result[0].status)
+        status = result.status_code
     except Exception:
         return None
     if status in _HTTP_SUCCESSES:
@@ -138,3 +140,19 @@ def check_http_response_success(result):
         return False
     else:
         return None  # Get well soon, server.
+
+def retry_method(orig_func):
+    """Provide a default value for a method's num_retries argument.
+
+    This is a decorator for instance and class methods that accept a
+    num_retries argument, with a None default.  When the method is called
+    without a value for num_retries, it will be set from the underlying
+    instance or class' num_retries attribute.
+    """
+    @functools.wraps(orig_func)
+    def num_retries_setter(self, *args, **kwargs):
+        arg_vals = inspect.getcallargs(orig_func, self, *args, **kwargs)
+        if arg_vals['num_retries'] is None:
+            kwargs['num_retries'] = self.num_retries
+        return orig_func(self, *args, **kwargs)
+    return num_retries_setter