22
22
import salt .utils .files
23
23
import salt .utils .hashutils
24
24
import salt .utils .xmlutil as xml
25
+ import time
25
26
from salt ._compat import ElementTree as ET
26
27
from salt .exceptions import CommandExecutionError
27
28
from salt .ext .six .moves .urllib .parse import quote as _quote # pylint: disable=import-error,no-name-in-module
28
29
from salt .ext import six
29
30
30
31
log = logging .getLogger (__name__ )
31
32
32
-
33
+ def thirty_second_memoize (f ):
34
+ memo = dict ()
35
+ def inner (* a , ** kw ):
36
+ k = '-' .join ([ str (x ) for x in a ] + [ str (kw [x ]) for x in sorted (kw ) ])
37
+ now = time .time ()
38
+ if k in memo :
39
+ v ,t = memo [k ]
40
+ if now - t < 30 :
41
+ log_k = kw .get ('path' , k )
42
+ log .info ('returning memoized result for %s' , log_k )
43
+ return v
44
+ v = f (* a , ** kw )
45
+ memo [k ] = (v ,now )
46
+ return v
47
+ return inner
48
+
49
+ @thirty_second_memoize
33
50
def query (key , keyid , method = 'GET' , params = None , headers = None ,
34
51
requesturl = None , return_url = False , bucket = None , service_url = None ,
35
52
path = '' , return_bin = False , action = None , local_file = None ,
@@ -243,11 +260,18 @@ def query(key, keyid, method='GET', params=None, headers=None,
243
260
log .debug ('Deleted bucket %s' , bucket )
244
261
return None
245
262
263
+ sortof_ok = ['SlowDown' , 'ServiceUnavailable' , 'RequestTimeTooSkewed' ,
264
+ 'RequestTimeout' , 'OperationAborted' , 'InternalError' ,
265
+ 'AccessDenied' ]
266
+
246
267
# This can be used to save a binary object to disk
247
268
if local_file and method == 'GET' :
248
269
if result .status_code < 200 or result .status_code >= 300 :
270
+ if err_code in sortof_ok :
271
+ log .error ('Failed to get file=%s. %s: %s' , path , err_code , err_msg )
272
+ return None
249
273
raise CommandExecutionError (
250
- 'Failed to get file. {0}: {1}' .format (err_code , err_msg ))
274
+ 'Failed to get file=%s . {0}: {1}' .format (path , err_code , err_msg ))
251
275
252
276
log .debug ('Saving to local file: %s' , local_file )
253
277
with salt .utils .files .fopen (local_file , 'wb' ) as out :
@@ -256,9 +280,8 @@ def query(key, keyid, method='GET', params=None, headers=None,
256
280
return 'Saved to local file: {0}' .format (local_file )
257
281
258
282
if result .status_code < 200 or result .status_code >= 300 :
259
- if err_code in ['SlowDown' , 'ServiceUnavailable' , 'RequestTimeTooSkewed' ,
260
- 'RequestTimeout' , 'OperationAborted' , 'InternalError' ]:
261
- log .error ('Failed s3 operation: %s, %s' , err_code , err_msg )
283
+ if err_code in sortof_ok :
284
+ log .error ('Failed s3 operation. %s: %s' , err_code , err_msg )
262
285
return None
263
286
raise CommandExecutionError (
264
287
'Failed s3 operation. {0}: {1}' .format (err_code , err_msg ))
0 commit comments