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,
+ + + + +