If the date values returned from keystone include milliseconds, it currently fails to parse.
e.g. 2011-12-14T23:42:07.890+0000 gives
2011-12-13 23:39:30,863 ERROR nova.api.openstack.v2 [-] Caught error: invalid literal for int() with base 10: '890+00'
(nova.api.openstack.v2): TRACE: Traceback (most recent call last):
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/site-packages/nova-2012.1-py2.6.egg/nova/api/openstack/v2/__init__.py", line 61, in __call__
(nova.api.openstack.v2): TRACE: return req.get_response(self.application)
(nova.api.openstack.v2): TRACE: File "build/bdist.solaris-2.11-i86pc/egg/webob/request.py", line 1053, in get_response
(nova.api.openstack.v2): TRACE: application, catch_exc_info=False)
(nova.api.openstack.v2): TRACE: File "build/bdist.solaris-2.11-i86pc/egg/webob/request.py", line 1022, in call_application
(nova.api.openstack.v2): TRACE: app_iter = application(self.environ, start_response)
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/site-packages/keystone-2012.1-py2.6.egg/keystone/middleware/auth_token.py", line 270, in __call__
(nova.api.openstack.v2): TRACE: claims = self._verify_claims(env, token)
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/site-packages/keystone-2012.1-py2.6.egg/keystone/middleware/auth_token.py", line 473, in _verify_claims
(nova.api.openstack.v2): TRACE: expires = get_datetime(verified_claims['expires'])
(nova.api.openstack.v2): TRACE: File "/usr/lib/python2.6/site-packages/keystone-2012.1-py2.6.egg/keystone/middleware/auth_token.py", line 130, in get_datetime
(nova.api.openstack.v2): TRACE: ms = int(microseconds.ljust(6, '0')[:6])
(nova.api.openstack.v2): TRACE: ValueError: invalid literal for int() with base 10: '890+00'
(nova.api.openstack.v2): TRACE:
Oops... actually, I think it's actually timezones that it can't cope with.
So, presumably time must be in UTC?