We cache tokens to prevent excess calls to external registries. Most public registries include an expire time in the header so we assumed it's always there. It isn't so the code blows up when expires_in is missing.
"""
Traceback (most recent call last):
File "/usr/lib64/python3.6/concurrent/futures/process.py", line 175, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
File "/usr/lib64/python3.6/concurrent/futures/process.py", line 153, in _process_chunk
return [fn(*args) for args in chunk]
File "/usr/lib64/python3.6/concurrent/futures/process.py", line 153, in <listcomp>
return [fn(*args) for args in chunk]
File "/usr/lib/python3.6/site-packages/tripleo_common/image/image_uploader.py", line 2678, in upload_task
return uploader.upload_image(task)
File "/usr/lib/python3.6/site-packages/tripleo_common/image/image_uploader.py", line 1564, in upload_image
password=target_password
File "/usr/lib/python3.6/site-packages/tenacity/__init__.py", line 292, in wrapped_f
return self.call(f, *args, **kw)
File "/usr/lib/python3.6/site-packages/tenacity/__init__.py", line 358, in call
do = self.iter(retry_state=retry_state)
File "/usr/lib/python3.6/site-packages/tenacity/__init__.py", line 319, in iter
return fut.result()
File "/usr/lib64/python3.6/concurrent/futures/_base.py", line 425, in result
return self.__get_result()
File "/usr/lib64/python3.6/concurrent/futures/_base.py", line 384, in __get_result
raise self._exception
File "/usr/lib/python3.6/site-packages/tenacity/__init__.py", line 361, in call
result = fn(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/tripleo_common/image/image_uploader.py", line 732, in authenticate
get_cached_bearer_token(self.lock, scope)
File "/usr/lib/python3.6/site-packages/tripleo_common/image/image_uploader.py", line 316, in get_cached_bearer_token
if (now - token_time).seconds < data.get('expires_in'):
TypeError: '<' not supported between instances of 'int' and 'NoneType'
"""
https:/ /review. opendev. org/c/openstack /tripleo- common/ +/771842