Skip to content

Commit 20e8d7d

Browse files
authored
Merge pull request #847 from jettero/s3-access-denied
S3 access denied
2 parents 74b0ea9 + 454af71 commit 20e8d7d

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

hubblestack/extmods/utils/s3.py

+28-5
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,31 @@
2222
import salt.utils.files
2323
import salt.utils.hashutils
2424
import salt.utils.xmlutil as xml
25+
import time
2526
from salt._compat import ElementTree as ET
2627
from salt.exceptions import CommandExecutionError
2728
from salt.ext.six.moves.urllib.parse import quote as _quote # pylint: disable=import-error,no-name-in-module
2829
from salt.ext import six
2930

3031
log = logging.getLogger(__name__)
3132

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
3350
def query(key, keyid, method='GET', params=None, headers=None,
3451
requesturl=None, return_url=False, bucket=None, service_url=None,
3552
path='', return_bin=False, action=None, local_file=None,
@@ -243,11 +260,18 @@ def query(key, keyid, method='GET', params=None, headers=None,
243260
log.debug('Deleted bucket %s', bucket)
244261
return None
245262

263+
sortof_ok = ['SlowDown', 'ServiceUnavailable', 'RequestTimeTooSkewed',
264+
'RequestTimeout', 'OperationAborted', 'InternalError',
265+
'AccessDenied']
266+
246267
# This can be used to save a binary object to disk
247268
if local_file and method == 'GET':
248269
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
249273
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))
251275

252276
log.debug('Saving to local file: %s', local_file)
253277
with salt.utils.files.fopen(local_file, 'wb') as out:
@@ -256,9 +280,8 @@ def query(key, keyid, method='GET', params=None, headers=None,
256280
return 'Saved to local file: {0}'.format(local_file)
257281

258282
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)
262285
return None
263286
raise CommandExecutionError(
264287
'Failed s3 operation. {0}: {1}'.format(err_code, err_msg))

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ markupsafe
2525
mock
2626
msgpack
2727
ntplib
28+
objgraph
2829
patch==1.*
2930
pprint
3031
pycryptodome

0 commit comments

Comments
 (0)