Fix RequestContext crashes w/ no service catalog

Code introduced in a prev review assumed service_catalog will be
at least an empty list and will never be None.  But missed one code
path where the service_catalog could potentially be set to None. So
this change switches back the default value of service_catalog in
the arguments to None and makes sure we tolerate anyone else
passing in a None or Empty list as service_catalog

Fix for LP# 1156730

Change-Id: I480b761d57c4699ea7ef72114160cdbeb281e454
This commit is contained in:
Davanum Srinivas 2013-03-18 15:28:57 -04:00
parent 85aebeb8b8
commit 4664d2294a
2 changed files with 17 additions and 3 deletions

View File

@ -47,7 +47,7 @@ class RequestContext(object):
roles=None, remote_address=None, timestamp=None,
request_id=None, auth_token=None, overwrite=True,
quota_class=None, user_name=None, project_name=None,
service_catalog=[], instance_lock_checked=False, **kwargs):
service_catalog=None, instance_lock_checked=False, **kwargs):
"""
:param read_deleted: 'no' indicates deleted records are hidden, 'yes'
indicates deleted records are visible, 'only' indicates that
@ -77,9 +77,15 @@ class RequestContext(object):
request_id = generate_request_id()
self.request_id = request_id
self.auth_token = auth_token
# Only include required parts of service_catalog
self.service_catalog = [s for s in service_catalog
if service_catalog:
# Only include required parts of service_catalog
self.service_catalog = [s for s in service_catalog
if s.get('type') in ('volume')]
else:
# if list is empty or none
self.service_catalog = []
self.instance_lock_checked = instance_lock_checked
# NOTE(markmc): this attribute is currently only used by the

View File

@ -79,6 +79,14 @@ class ContextTestCase(test.TestCase):
ctxt = context.RequestContext('111', '222')
self.assertEquals(ctxt.service_catalog, [])
ctxt = context.RequestContext('111', '222',
service_catalog=[])
self.assertEquals(ctxt.service_catalog, [])
ctxt = context.RequestContext('111', '222',
service_catalog=None)
self.assertEquals(ctxt.service_catalog, [])
def test_service_catalog_cinder_only(self):
service_catalog = [
{u'type': u'compute', u'name': u'nova'},