Manage compute node that exposes no pci devices

Booting a VM with a pci device causes an exception when the host doesnt
have any assignable pci devices.
If a host doesnt expose any pci devices to nova, its pci_stats are set
to None. This causes an exception when the PciPassthroughFilter checks
if the host can support the pci requests.

Closes-Bug: #1435981
Change-Id: Ia9fbec9c7a3afa9b7ea73c43b21db0909a195a36
This commit is contained in:
James Chapman 2015-04-08 10:31:04 +01:00
parent bf70df295b
commit 69ec3b6f0c
3 changed files with 14 additions and 7 deletions

View File

@ -213,11 +213,8 @@ class HostState(object):
self.updated = compute.updated_at
self.numa_topology = compute.numa_topology
self.instance_numa_topology = None
if compute.pci_device_pools is not None:
self.pci_stats = pci_stats.PciDeviceStats(
compute.pci_device_pools)
else:
self.pci_stats = None
self.pci_stats = pci_stats.PciDeviceStats(
compute.pci_device_pools)
# All virt drivers report host_ip
self.host_ip = compute.host_ip

View File

@ -13,6 +13,7 @@
import mock
from nova import objects
from nova.pci import stats
from nova.scheduler.filters import pci_passthrough_filter
from nova import test
from nova.tests.unit.scheduler import fakes
@ -65,3 +66,12 @@ class TestPCIPassthroughFilter(test.NoDBTestCase):
attribute_dict={})
self.assertRaises(AttributeError, self.filt_cls.host_passes,
host, filter_properties)
def test_pci_passthrough_no_pci_stats(self):
request = objects.InstancePCIRequest(count=1,
spec=[{'vendor_id': '8086'}])
requests = objects.InstancePCIRequests(requests=[request])
filter_properties = {'pci_requests': requests}
host = fakes.FakeHostState('host1', 'node1',
attribute_dict={'pci_stats': stats.PciDeviceStats()})
self.assertFalse(self.filt_cls.host_passes(host, filter_properties))

View File

@ -824,7 +824,7 @@ class HostStateTestCase(test.NoDBTestCase):
host = host_manager.HostState("fakehost", "fakenode")
host.update_from_compute_node(compute)
self.assertIsNone(host.pci_stats)
self.assertEqual([], host.pci_stats.pools)
self.assertEqual(hyper_ver_int, host.hypervisor_version)
def test_stat_consumption_from_compute_node_rescue_unshelving(self):
@ -860,7 +860,7 @@ class HostStateTestCase(test.NoDBTestCase):
self.assertEqual(42, host.num_io_ops)
self.assertEqual(10, len(host.stats))
self.assertIsNone(host.pci_stats)
self.assertEqual([], host.pci_stats.pools)
self.assertEqual(hyper_ver_int, host.hypervisor_version)
@mock.patch('nova.virt.hardware.get_host_numa_usage_from_instance')