Merge "libvirt: add vf_trusted field for network metadata"

This commit is contained in:
Zuul 2018-06-01 12:12:53 +00:00 committed by Gerrit Code Review
commit 46b4e5b568
5 changed files with 23 additions and 2 deletions

View File

@ -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

View File

@ -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',

View File

@ -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')

View File

@ -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

View File

@ -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')}