Fix Instance objects with empty security groups

This makes sure that a DB instance with an empty list of security
groups does not result in an object with an unset attribute, thus
triggering a lazy load on access (and ultimately an exception).

Related to blueprint compute-api-objects

Change-Id: Ib33b05853e9d067cbac5d3e87824a68e9935b822
This commit is contained in:
Dan Smith 2013-08-02 13:07:34 -07:00
parent beae8f01b0
commit 39dd4f8c5f
2 changed files with 12 additions and 1 deletions

View File

@ -235,7 +235,7 @@ class Instance(base.NovaObject):
instance_info_cache.InstanceInfoCache._from_db_object( instance_info_cache.InstanceInfoCache._from_db_object(
context, instance['info_cache'], db_inst['info_cache']) context, instance['info_cache'], db_inst['info_cache'])
if ('security_groups' in expected_attrs and if ('security_groups' in expected_attrs and
db_inst.get('security_groups')): db_inst.get('security_groups') is not None):
instance['security_groups'] = security_group.SecurityGroupList() instance['security_groups'] = security_group.SecurityGroupList()
security_group._make_secgroup_list(context, security_group._make_secgroup_list(context,
instance['security_groups'], instance['security_groups'],

View File

@ -348,6 +348,17 @@ class _TestInstanceObject(object):
inst.save() inst.save()
self.assertEqual(inst.security_groups.obj_what_changed(), set()) self.assertEqual(inst.security_groups.obj_what_changed(), set())
def test_with_empty_security_groups(self):
ctxt = context.get_admin_context()
fake_inst = dict(self.fake_instance, security_groups=[])
fake_uuid = fake_inst['uuid']
self.mox.StubOutWithMock(db, 'instance_get_by_uuid')
db.instance_get_by_uuid(ctxt, fake_uuid, columns_to_join=[]
).AndReturn(fake_inst)
self.mox.ReplayAll()
inst = instance.Instance.get_by_uuid(ctxt, fake_uuid)
self.assertEqual(0, len(inst.security_groups))
def test_with_fault(self): def test_with_fault(self):
ctxt = context.get_admin_context() ctxt = context.get_admin_context()
fake_inst = dict(self.fake_instance) fake_inst = dict(self.fake_instance)