From 5bc088de0d91f0bc4c3b29ca56d9d00fb32831a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Ribaud?= Date: Tue, 5 Jul 2022 16:09:58 +0200 Subject: [PATCH] Add metadata for shares This patch add device metatada to an instance if a share is is attached. Users can get the share information (share_id and tag) from the metadata and create automation to mount the share on the VM. Manila is the OpenStack Shared Filesystems service. These series of patches implement changes required in Nova to allow the shares provided by Manila to be associated with and attached to instances using virtiofs. Implements: blueprint libvirt-virtiofs-attach-manila-shares Change-Id: I4c7bb15dbe423ec2815efe9d9505b1e8f2a3c4f5 --- nova/api/metadata/base.py | 8 +++ nova/objects/virt_device_metadata.py | 10 +++ nova/tests/unit/objects/test_objects.py | 1 + nova/tests/unit/test_metadata.py | 31 ++++++++- nova/tests/unit/virt/libvirt/test_driver.py | 74 ++++++++++++++++++--- nova/virt/libvirt/driver.py | 29 ++++++++ 6 files changed, 139 insertions(+), 14 deletions(-) diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py index aef1354ab3..640433f228 100644 --- a/nova/api/metadata/base.py +++ b/nova/api/metadata/base.py @@ -71,6 +71,7 @@ NEWTON_TWO = '2016-10-06' OCATA = '2017-02-22' ROCKY = '2018-08-27' VICTORIA = '2020-10-14' +EPOXY = '2025-04-04' OPENSTACK_VERSIONS = [ FOLSOM, @@ -82,6 +83,7 @@ OPENSTACK_VERSIONS = [ OCATA, ROCKY, VICTORIA, + EPOXY, ] VERSION = "version" @@ -426,6 +428,12 @@ class InstanceMetadata(object): device_metadata['serial'] = device.serial if 'path' in device: device_metadata['path'] = device.path + elif self._check_os_version(EPOXY, version) and isinstance( + device, metadata_obj.ShareMetadata + ): + device_metadata['type'] = 'share' + device_metadata['share_id'] = device.share_id + device_metadata['tag'] = device.tag else: LOG.debug('Metadata for device of unknown type %s has not ' 'been included in the ' diff --git a/nova/objects/virt_device_metadata.py b/nova/objects/virt_device_metadata.py index a518c92a82..870c47e533 100644 --- a/nova/objects/virt_device_metadata.py +++ b/nova/objects/virt_device_metadata.py @@ -111,6 +111,16 @@ class DiskMetadata(DeviceMetadata): } +@base.NovaObjectRegistry.register +class ShareMetadata(DeviceMetadata): + VERSION = '1.0' + + fields = { + 'share_id': fields.StringField(nullable=True), + 'tag': fields.StringField(nullable=True), + } + + @base.NovaObjectRegistry.register class InstanceDeviceMetadata(base.NovaObject): VERSION = '1.0' diff --git a/nova/tests/unit/objects/test_objects.py b/nova/tests/unit/objects/test_objects.py index 808ad69462..8a24773c7b 100644 --- a/nova/tests/unit/objects/test_objects.py +++ b/nova/tests/unit/objects/test_objects.py @@ -1170,6 +1170,7 @@ object_data = { 'ServiceList': '1.19-5325bce13eebcbf22edc9678285270cc', 'ShareMapping': '1.1-3f1f4e053d37c1ddcdd0040cee569c1f', 'ShareMappingList': '1.0-634980d5efdf3656e28c8dec3d862ab9', + 'ShareMetadata': '1.0-09f69ac0bd47371417b5477a277e43af', 'Tag': '1.1-8b8d7d5b48887651a0e01241672e2963', 'TagList': '1.1-55231bdb671ecf7641d6a2e9109b5d8e', 'TaskLog': '1.0-78b0534366f29aa3eebb01860fbe18fe', diff --git a/nova/tests/unit/test_metadata.py b/nova/tests/unit/test_metadata.py index e32c4e6baa..5ece263c1b 100644 --- a/nova/tests/unit/test_metadata.py +++ b/nova/tests/unit/test_metadata.py @@ -198,15 +198,21 @@ def fake_metadata_objects(): mac='00:00:00:00:00:00', tags=['foo'] ) + share_obj = metadata_obj.ShareMetadata( + share_id='ca3c176e-fd5a-438b-b595-e18a358f6909', + tag='my_share_tag' + ) mdlist = metadata_obj.InstanceDeviceMetadata( instance_uuid='b65cee2f-8c69-4aeb-be2f-f79742548fc2', devices=[nic_obj, ide_disk_obj, scsi_disk_obj, usb_disk_obj, fake_device_obj, device_with_fake_bus_obj, nic_vlans_obj, - nic_vf_trusted_obj]) + nic_vf_trusted_obj, share_obj]) return mdlist -def fake_metadata_dicts(include_vlan=False, include_vf_trusted=False): +def fake_metadata_dicts( + include_vlan=False, include_vf_trusted=False, include_shares=False +): nic_meta = { 'type': 'nic', 'bus': 'pci', @@ -236,6 +242,13 @@ def fake_metadata_dicts(include_vlan=False, include_vf_trusted=False): 'path': '/dev/sda', 'tags': ['baz'], } + share_meta = { + 'type': 'share', + 'bus': 'none', + 'address': 'none', + 'share_id': 'ca3c176e-fd5a-438b-b595-e18a358f6909', + 'tag': 'my_share_tag', + } scsi_disk_meta = copy.copy(ide_disk_meta) scsi_disk_meta['bus'] = 'scsi' @@ -254,6 +267,8 @@ def fake_metadata_dicts(include_vlan=False, include_vf_trusted=False): nic_meta['vf_trusted'] = False vlan_nic_meta['vf_trusted'] = False vf_trusted_nic_meta['vf_trusted'] = True + if include_shares: + dicts.append(share_meta) return dicts @@ -512,6 +527,11 @@ class MetadataTestCase(test.TestCase): 'openstack/2020-10-14/vendor_data.json', 'openstack/2020-10-14/network_data.json', 'openstack/2020-10-14/vendor_data2.json', + 'openstack/2025-04-04/meta_data.json', + 'openstack/2025-04-04/user_data', + 'openstack/2025-04-04/vendor_data.json', + 'openstack/2025-04-04/network_data.json', + 'openstack/2025-04-04/vendor_data2.json', 'openstack/latest/meta_data.json', 'openstack/latest/user_data', 'openstack/latest/vendor_data.json', @@ -600,6 +620,10 @@ class MetadataTestCase(test.TestCase): True, expose_trusted) if md._check_os_version(base.VICTORIA, os_version): expected_metadata['dedicated_cpus'] = [] + if md._check_os_version(base.EPOXY, os_version): + expose_shares = md._check_os_version(base.VICTORIA, os_version) + expected_metadata['devices'] = fake_metadata_dicts( + True, True, expose_shares) md._metadata_as_json(os_version, 'non useless path parameter') self.assertEqual(md.md_mimetype, base.MIME_TYPE_APPLICATION_JSON) mock_json_dump_as_bytes.assert_called_once_with(expected_metadata) @@ -673,7 +697,8 @@ class OpenStackMetadataTestCase(test.TestCase): mdinst = fake_InstanceMetadata(self, inst) mdjson = mdinst.lookup("/openstack/latest/meta_data.json") mddict = jsonutils.loads(mdjson) - self.assertEqual(fake_metadata_dicts(True, True), mddict['devices']) + self.assertEqual( + fake_metadata_dicts(True, True, True), mddict["devices"]) def test_top_level_listing(self): # request for /openstack// should show metadata.json diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index ce7e15822e..9b4ca65537 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -2332,6 +2332,11 @@ class LibvirtConnTestCase(test.NoDBTestCase,
+ + + + +