Merge "libvirt: add vf_trusted field for network metadata"
This commit is contained in:
commit
46b4e5b568
|
@ -84,17 +84,21 @@ class DeviceMetadata(base.NovaObject):
|
|||
class NetworkInterfaceMetadata(DeviceMetadata):
|
||||
# Version 1.0: Initial version
|
||||
# Version 1.1: Add vlans field
|
||||
VERSION = '1.1'
|
||||
# Version 1.2: Add vf_trusted field
|
||||
VERSION = '1.2'
|
||||
|
||||
fields = {
|
||||
'mac': fields.MACAddressField(),
|
||||
'vlan': fields.IntegerField(),
|
||||
'vf_trusted': fields.BooleanField(default=False),
|
||||
}
|
||||
|
||||
def obj_make_compatible(self, primitive, target_version):
|
||||
target_version = versionutils.convert_version_to_tuple(target_version)
|
||||
if target_version < (1, 1) and 'vlan' in primitive:
|
||||
del primitive['vlan']
|
||||
if target_version < (1, 2) and 'vf_trusted' in primitive:
|
||||
del primitive['vf_trusted']
|
||||
|
||||
|
||||
@base.NovaObjectRegistry.register
|
||||
|
|
|
@ -1129,7 +1129,7 @@ object_data = {
|
|||
'NUMATopology': '1.2-c63fad38be73b6afd04715c9c1b29220',
|
||||
'NUMATopologyLimits': '1.0-9463e0edd40f64765ae518a539b9dfd2',
|
||||
'Network': '1.2-a977ab383aa462a479b2fae8211a5dde',
|
||||
'NetworkInterfaceMetadata': '1.1-3269ce11b30531eb1febfa5173b78b81',
|
||||
'NetworkInterfaceMetadata': '1.2-6f3d480b40fe339067b1c0dd4d656716',
|
||||
'NetworkList': '1.2-69eca910d8fa035dfecd8ba10877ee59',
|
||||
'NetworkRequest': '1.2-af1ff2d986999fbb79377712794d82aa',
|
||||
'NetworkRequestList': '1.1-15ecf022a68ddbb8c2a6739cfc9f8f5e',
|
||||
|
|
|
@ -1696,6 +1696,7 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
|||
network_info[0]['vnic_type'] = network_model.VNIC_TYPE_DIRECT_PHYSICAL
|
||||
network_info[0]['address'] = "51:5a:2c:a4:5e:1b"
|
||||
network_info[0]['details'] = dict(vlan='2145')
|
||||
network_info[0]['profile'] = dict(trusted='true')
|
||||
instance_ref.info_cache = objects.InstanceInfoCache(
|
||||
network_info=network_info)
|
||||
|
||||
|
@ -1757,18 +1758,22 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
|||
objects.PCIDeviceBus)
|
||||
self.assertEqual(['mytag1'], metadata[6].tags)
|
||||
self.assertEqual('0000:00:03.0', metadata[6].bus.address)
|
||||
self.assertFalse(metadata[6].vf_trusted)
|
||||
|
||||
# Make sure that interface with vlan is exposed to the metadata
|
||||
self.assertIsInstance(metadata[7],
|
||||
objects.NetworkInterfaceMetadata)
|
||||
self.assertEqual('51:5a:2c:a4:5e:1b', metadata[7].mac)
|
||||
self.assertEqual(2145, metadata[7].vlan)
|
||||
self.assertTrue(metadata[7].vf_trusted)
|
||||
self.assertIsInstance(metadata[8],
|
||||
objects.NetworkInterfaceMetadata)
|
||||
self.assertEqual(['mytag2'], metadata[8].tags)
|
||||
self.assertFalse(metadata[8].vf_trusted)
|
||||
self.assertIsInstance(metadata[9],
|
||||
objects.NetworkInterfaceMetadata)
|
||||
self.assertEqual(['mytag3'], metadata[9].tags)
|
||||
self.assertFalse(metadata[9].vf_trusted)
|
||||
|
||||
@mock.patch.object(host.Host, 'get_connection')
|
||||
@mock.patch.object(nova.virt.libvirt.guest.Guest, 'get_xml_desc')
|
||||
|
|
|
@ -8566,6 +8566,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||
|
||||
network_info = instance.info_cache.network_info
|
||||
vlans_by_mac = netutils.get_cached_vifs_with_vlan(network_info)
|
||||
trusted_by_mac = netutils.get_cached_vifs_with_trusted(network_info)
|
||||
vifs = objects.VirtualInterfaceList.get_by_instance_uuid(context,
|
||||
instance.uuid)
|
||||
vifs_to_expose = {vif.address: vif for vif in vifs
|
||||
|
@ -8600,6 +8601,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||
vlan = vlans_by_mac.get(vif.address)
|
||||
if vlan:
|
||||
device.vlan = int(vlan)
|
||||
device.vf_trusted = trusted_by_mac.get(vif.address, False)
|
||||
devices.append(device)
|
||||
|
||||
# Build disks related metadata
|
||||
|
|
|
@ -23,6 +23,7 @@ import os
|
|||
|
||||
import jinja2
|
||||
import netaddr
|
||||
from oslo_utils import strutils
|
||||
|
||||
import nova.conf
|
||||
from nova.network import model
|
||||
|
@ -348,3 +349,12 @@ def get_cached_vifs_with_vlan(network_info):
|
|||
return {}
|
||||
return {vif['address']: vif['details']['vlan'] for vif in network_info
|
||||
if vif.get('details', {}).get('vlan')}
|
||||
|
||||
|
||||
def get_cached_vifs_with_trusted(network_info):
|
||||
"""Generates a dict from a list of VIFs that trusted, MAC as key"""
|
||||
if network_info is None:
|
||||
return {}
|
||||
return {vif['address']: strutils.bool_from_string(
|
||||
vif['profile'].get('trusted', 'False')) for vif in network_info
|
||||
if vif.get('profile')}
|
||||
|
|
Loading…
Reference in New Issue