Update check before migrating flavor

db_inst.get('extra', {}) returns {} if 'extra' is not in db_inst, but
not if db_inst['extra'] is None.  Since the result of that is accessed
like a dict the access of 'extra' has been changed to ensure that we get
a dict.

Change-Id: I3755151306ef784119aca0d5ee20fd0455116f64
Closes-Bug: 1438923
This commit is contained in:
Andrew Laski 2015-03-31 17:26:30 -04:00
parent d2b62042d1
commit ae870634d1
2 changed files with 14 additions and 1 deletions

View File

@ -460,7 +460,8 @@ class Instance(base.NovaPersistentObject, base.NovaObject,
else:
# Migrate the flavor from system_metadata to extra,
# if needed
if db_inst.get('extra', {}).get('flavor') is not None:
instance_extra = db_inst.get('extra') or {}
if instance_extra.get('flavor') is not None:
self._flavor_from_db(db_inst['extra']['flavor'])
elif 'instance_type_id' in self.system_metadata:
self._migrate_flavor(self)

View File

@ -1145,6 +1145,18 @@ class _TestInstanceObject(object):
inst._maybe_migrate_flavor(db_inst, ['flavor', 'system_metadata'])
self.assertIn('instance_type_id', inst.system_metadata)
def test_migrate_flavor_instance_no_extra(self):
flavor = flavors.get_default_flavor()
db_inst = {'extra': None}
inst = objects.Instance(
system_metadata=flavors.save_flavor_info({}, flavor))
result = inst._maybe_migrate_flavor(db_inst,
['flavor', 'system_metadata'])
self.assertTrue(result, 'Flavor not migrated')
self.assertNotIn('instance_type_id', inst.system_metadata)
self.assertTrue(inst.obj_attr_is_set('flavor'))
self.assertEqual(flavor.flavorid, inst.flavor.flavorid)
class TestInstanceObject(test_objects._LocalTest,
_TestInstanceObject):