objects: add virtual 'image_meta' property to Instance object

Add a readonly 'image_meta' property to the Instance object
which is populated from the system_metadata property contents
via the ImageProps object.

Blueprint: mitaka-objects
Change-Id: Iddb7b7609eba586eb49c52799a142ae79e5ff1a8
This commit is contained in:
Daniel P. Berrange 2015-06-03 11:48:26 +01:00
parent fbe31e461a
commit 01e31306c1
2 changed files with 25 additions and 0 deletions

View File

@ -191,6 +191,10 @@ class Instance(base.NovaPersistentObject, base.NovaObject,
super(Instance, self).__init__(*args, **kwargs)
self._reset_metadata_tracking()
@property
def image_meta(self):
return objects.ImageMeta.from_instance(self)
def _reset_metadata_tracking(self, fields=None):
if fields is None or 'system_metadata' in fields:
self._orig_system_metadata = (dict(self.system_metadata) if

View File

@ -72,6 +72,12 @@ class _TestInstanceObject(object):
db_inst['info_cache'] = dict(test_instance_info_cache.fake_info_cache,
instance_uuid=db_inst['uuid'])
db_inst['system_metadata'] = {
'image_name': 'os2-warp',
'image_min_ram': 100,
'image_hw_disk_bus': 'ide',
'image_hw_vif_model': 'ne2k_pci',
}
return db_inst
def test_datetime_deserialization(self):
@ -831,6 +837,21 @@ class _TestInstanceObject(object):
self.assertEqual(fake_ec2_ids.instance_id, inst.ec2_ids.instance_id)
@mock.patch('nova.db.instance_get_by_uuid')
def test_with_image_meta(self, mock_get):
fake_inst = dict(self.fake_instance)
mock_get.return_value = fake_inst
inst = instance.Instance.get_by_uuid(self.context,
fake_inst['uuid'],
expected_attrs=['image_meta'])
image_meta = inst.image_meta
self.assertIsInstance(image_meta, objects.ImageMeta)
self.assertEqual(100, image_meta.min_ram)
self.assertEqual('ide', image_meta.properties.hw_disk_bus)
self.assertEqual('ne2k_pci', image_meta.properties.hw_vif_model)
def test_iteritems_with_extra_attrs(self):
self.stubs.Set(objects.Instance, 'name', 'foo')
inst = objects.Instance(uuid=uuids.instance)