objects: new InstanceDeviceMetadata object
The InstanceDeviceMetadata will keep a list of all the devices metadata, such as NICs and disks associated to an instance. Eventually, it will be stored in the instance_extra table. InstanceDeviceMetadata object is new in this series and has never been sent over RPC nor used. Partially implements blueprint virt-device-role-tagging Co-authored-by: Artom Lifshitz <alifshit@redhat.com> Change-Id: I914e2c9a465864e5d320f8eb8d2fd509e64a7a75
This commit is contained in:
parent
cf6cde95a1
commit
885cf20daf
@ -12,12 +12,14 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo_serialization import jsonutils
|
||||||
|
|
||||||
|
from nova import db
|
||||||
from nova.objects import base
|
from nova.objects import base
|
||||||
from nova.objects import fields
|
from nova.objects import fields
|
||||||
|
|
||||||
|
|
||||||
@base.NovaObjectRegistry.register_if(False)
|
@base.NovaObjectRegistry.register
|
||||||
class DeviceBus(base.NovaObject):
|
class DeviceBus(base.NovaObject):
|
||||||
VERSION = '1.0'
|
VERSION = '1.0'
|
||||||
|
|
||||||
@ -88,9 +90,29 @@ class DiskMetadata(DeviceMetadata):
|
|||||||
|
|
||||||
|
|
||||||
@base.NovaObjectRegistry.register
|
@base.NovaObjectRegistry.register
|
||||||
class DeviceMetadataList(base.ObjectListBase, base.NovaObject):
|
class InstanceDeviceMetadata(base.NovaObject):
|
||||||
VERSION = '1.0'
|
VERSION = '1.0'
|
||||||
fields = {
|
fields = {
|
||||||
'objects': fields.ListOfObjectsField('DeviceMetadata',
|
'devices': fields.ListOfObjectsField('DeviceMetadata',
|
||||||
subclasses=True),
|
subclasses=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def obj_from_db(cls, context, db_requests):
|
||||||
|
primitive = jsonutils.loads(db_requests)
|
||||||
|
device_metadata = cls.obj_from_primitive(primitive)
|
||||||
|
return device_metadata
|
||||||
|
|
||||||
|
@base.remotable_classmethod
|
||||||
|
def get_by_instance_uuid(cls, context, instance_uuid):
|
||||||
|
db_extra = db.instance_extra_get_by_instance_uuid(
|
||||||
|
context, instance_uuid, columns=['device_metadata'])
|
||||||
|
if not db_extra or db_extra['device_metadata'] is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
primitive = jsonutils.loads(db_extra['device_metadata'])
|
||||||
|
device_metadata = cls.obj_from_primitive(primitive)
|
||||||
|
return device_metadata
|
||||||
|
|
||||||
|
def _to_json(self):
|
||||||
|
return jsonutils.dumps(self.obj_to_primitive())
|
||||||
|
91
nova/tests/unit/objects/test_instance_device_metadata.py
Normal file
91
nova/tests/unit/objects/test_instance_device_metadata.py
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import mock
|
||||||
|
from oslo_serialization import jsonutils
|
||||||
|
|
||||||
|
from nova import objects
|
||||||
|
from nova.tests.unit.objects import test_objects
|
||||||
|
|
||||||
|
fake_net_interface_meta = objects.NetworkInterfaceMetadata(
|
||||||
|
mac='52:54:00:f6:35:8f',
|
||||||
|
tags=['mytag1'],
|
||||||
|
bus=objects.PCIDeviceBus(address='0000:00:03.0'))
|
||||||
|
fake_pci_disk_meta = objects.DiskMetadata(
|
||||||
|
bus=objects.PCIDeviceBus(address='0000:00:09.0'),
|
||||||
|
tags=['nfvfunc3'])
|
||||||
|
fake_obj_devices_metadata = objects.InstanceDeviceMetadata(
|
||||||
|
devices=[fake_net_interface_meta, fake_pci_disk_meta])
|
||||||
|
|
||||||
|
fake_devices_metadata = fake_obj_devices_metadata._to_json()
|
||||||
|
|
||||||
|
fake_db_metadata = {
|
||||||
|
'created_at': None,
|
||||||
|
'updated_at': None,
|
||||||
|
'deleted_at': None,
|
||||||
|
'deleted': 0,
|
||||||
|
'id': 1,
|
||||||
|
'device_metadata': fake_obj_devices_metadata._to_json()
|
||||||
|
}
|
||||||
|
|
||||||
|
fake_old_db_metadata = dict(fake_db_metadata) # copy
|
||||||
|
fake_old_db_metadata['device_metadata'] = jsonutils.dumps(
|
||||||
|
fake_devices_metadata)
|
||||||
|
|
||||||
|
|
||||||
|
def get_fake_obj_device_metadata(context):
|
||||||
|
fake_obj_devices_metadata_cpy = fake_obj_devices_metadata.obj_clone()
|
||||||
|
fake_obj_devices_metadata_cpy._context = context
|
||||||
|
return fake_obj_devices_metadata_cpy
|
||||||
|
|
||||||
|
|
||||||
|
class _TestInstanceDeviceMetadata(object):
|
||||||
|
def _check_object(self, obj_meta):
|
||||||
|
self.assertTrue(isinstance(obj_meta,
|
||||||
|
objects.NetworkInterfaceMetadata) or
|
||||||
|
isinstance(obj_meta, objects.DiskMetadata))
|
||||||
|
if isinstance(obj_meta, objects.NetworkInterfaceMetadata):
|
||||||
|
self.assertEqual(obj_meta.mac, '52:54:00:f6:35:8f')
|
||||||
|
self.assertEqual(obj_meta.tags, ['mytag1'])
|
||||||
|
self.assertTrue(obj_meta.bus, objects.PCIDeviceBus)
|
||||||
|
self.assertEqual(obj_meta.bus.address, '0000:00:03.0')
|
||||||
|
elif isinstance(obj_meta, objects.DiskMetadata):
|
||||||
|
self.assertTrue(obj_meta.bus, objects.PCIDeviceBus)
|
||||||
|
self.assertEqual(obj_meta.bus.address, '0000:00:09.0')
|
||||||
|
self.assertEqual(obj_meta.tags, ['nfvfunc3'])
|
||||||
|
|
||||||
|
@mock.patch('nova.db.instance_extra_get_by_instance_uuid')
|
||||||
|
def test_get_by_instance_uuid(self, mock_get):
|
||||||
|
mock_get.return_value = fake_db_metadata
|
||||||
|
inst_meta = objects.InstanceDeviceMetadata
|
||||||
|
dev_meta = inst_meta.get_by_instance_uuid(
|
||||||
|
self.context, 'fake_uuid')
|
||||||
|
for obj_meta, fake_meta in zip(
|
||||||
|
dev_meta.devices,
|
||||||
|
fake_obj_devices_metadata.devices):
|
||||||
|
self._check_object(obj_meta)
|
||||||
|
|
||||||
|
def test_obj_from_db(self):
|
||||||
|
db_meta = fake_db_metadata['device_metadata']
|
||||||
|
metadata = objects.InstanceDeviceMetadata.obj_from_db(None, db_meta)
|
||||||
|
for obj_meta in metadata.devices:
|
||||||
|
self._check_object(obj_meta)
|
||||||
|
|
||||||
|
|
||||||
|
class TestInstanceDeviceMetadata(test_objects._LocalTest,
|
||||||
|
_TestInstanceDeviceMetadata):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class TestInstanceDeviceMetadataRemote(test_objects._RemoteTest,
|
||||||
|
_TestInstanceDeviceMetadata):
|
||||||
|
pass
|
@ -1111,8 +1111,8 @@ object_data = {
|
|||||||
'DNSDomain': '1.0-7b0b2dab778454b6a7b6c66afe163a1a',
|
'DNSDomain': '1.0-7b0b2dab778454b6a7b6c66afe163a1a',
|
||||||
'DNSDomainList': '1.0-4ee0d9efdfd681fed822da88376e04d2',
|
'DNSDomainList': '1.0-4ee0d9efdfd681fed822da88376e04d2',
|
||||||
'Destination': '1.0-4c59dd1288b2e7adbda6051a2de59183',
|
'Destination': '1.0-4c59dd1288b2e7adbda6051a2de59183',
|
||||||
|
'DeviceBus': '1.0-77509ea1ea0dd750d5864b9bd87d3f9d',
|
||||||
'DeviceMetadata': '1.0-04eb8fd218a49cbc3b1e54b774d179f7',
|
'DeviceMetadata': '1.0-04eb8fd218a49cbc3b1e54b774d179f7',
|
||||||
'DeviceMetadataList': '1.0-15ecf022a68ddbb8c2a6739cfc9f8f5e',
|
|
||||||
'DiskMetadata': '1.0-e7a0f1ccccf10d26a76b28e7492f3788',
|
'DiskMetadata': '1.0-e7a0f1ccccf10d26a76b28e7492f3788',
|
||||||
'EC2Ids': '1.0-474ee1094c7ec16f8ce657595d8c49d9',
|
'EC2Ids': '1.0-474ee1094c7ec16f8ce657595d8c49d9',
|
||||||
'EC2InstanceMapping': '1.0-a4556eb5c5e94c045fe84f49cf71644f',
|
'EC2InstanceMapping': '1.0-a4556eb5c5e94c045fe84f49cf71644f',
|
||||||
@ -1135,6 +1135,7 @@ object_data = {
|
|||||||
'InstanceActionEvent': '1.1-e56a64fa4710e43ef7af2ad9d6028b33',
|
'InstanceActionEvent': '1.1-e56a64fa4710e43ef7af2ad9d6028b33',
|
||||||
'InstanceActionEventList': '1.1-13d92fb953030cdbfee56481756e02be',
|
'InstanceActionEventList': '1.1-13d92fb953030cdbfee56481756e02be',
|
||||||
'InstanceActionList': '1.0-4a53826625cc280e15fae64a575e0879',
|
'InstanceActionList': '1.0-4a53826625cc280e15fae64a575e0879',
|
||||||
|
'InstanceDeviceMetadata': '1.0-74d78dd36aa32d26d2769a1b57caf186',
|
||||||
'InstanceExternalEvent': '1.1-6e446ceaae5f475ead255946dd443417',
|
'InstanceExternalEvent': '1.1-6e446ceaae5f475ead255946dd443417',
|
||||||
'InstanceFault': '1.2-7ef01f16f1084ad1304a513d6d410a38',
|
'InstanceFault': '1.2-7ef01f16f1084ad1304a513d6d410a38',
|
||||||
'InstanceFaultList': '1.1-f8ec07cbe3b60f5f07a8b7a06311ac0d',
|
'InstanceFaultList': '1.1-f8ec07cbe3b60f5f07a8b7a06311ac0d',
|
||||||
|
Loading…
Reference in New Issue
Block a user