From 8d11cba5edcb71b530ea9af3afa697870bcfac3a Mon Sep 17 00:00:00 2001 From: Moshe Levi Date: Sat, 21 Jan 2017 11:27:36 +0200 Subject: [PATCH] PCI: Check pci_requests object is empty before passing to support_requests This commit checks that InstancePCIRequests is empty before passing it to the pci_stats.support_requests. This prevents doing the support request check for host_state which don't have pci_stats like ironic host. Closes-Bug: #1658078 Change-Id: Ie6d870729883e2bbdc3278c52e88d147613712f6 --- .../filters/pci_passthrough_filter.py | 5 +++-- .../filters/test_pci_passthrough_filters.py | 22 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/nova/scheduler/filters/pci_passthrough_filter.py b/nova/scheduler/filters/pci_passthrough_filter.py index 621cc108c92e..0db453d53260 100644 --- a/nova/scheduler/filters/pci_passthrough_filter.py +++ b/nova/scheduler/filters/pci_passthrough_filter.py @@ -43,9 +43,10 @@ class PciPassthroughFilter(filters.BaseHostFilter): def host_passes(self, host_state, spec_obj): """Return true if the host has the required PCI devices.""" pci_requests = spec_obj.pci_requests - if not pci_requests: + if not pci_requests or not pci_requests.requests: return True - if not host_state.pci_stats.support_requests(pci_requests.requests): + if (not host_state.pci_stats or + not host_state.pci_stats.support_requests(pci_requests.requests)): LOG.debug("%(host_state)s doesn't have the required PCI devices" " (%(requests)s)", {'host_state': host_state, 'requests': pci_requests}) diff --git a/nova/tests/unit/scheduler/filters/test_pci_passthrough_filters.py b/nova/tests/unit/scheduler/filters/test_pci_passthrough_filters.py index 3e28404e1b95..f99f8e8bb006 100644 --- a/nova/tests/unit/scheduler/filters/test_pci_passthrough_filters.py +++ b/nova/tests/unit/scheduler/filters/test_pci_passthrough_filters.py @@ -58,16 +58,11 @@ class TestPCIPassthroughFilter(test.NoDBTestCase): host = fakes.FakeHostState('h1', 'n1', {}) self.assertTrue(self.filt_cls.host_passes(host, spec_obj)) - def test_pci_passthrough_compute_stats(self): - request = objects.InstancePCIRequest(count=1, - spec=[{'vendor_id': '8086'}]) - requests = objects.InstancePCIRequests(requests=[request]) + def test_pci_passthrough_empty_pci_request_obj(self): + requests = objects.InstancePCIRequests(requests=[]) spec_obj = objects.RequestSpec(pci_requests=requests) - host = fakes.FakeHostState( - 'host1', 'node1', - attribute_dict={}) - self.assertRaises(AttributeError, self.filt_cls.host_passes, - host, spec_obj) + host = fakes.FakeHostState('h1', 'n1', {}) + self.assertTrue(self.filt_cls.host_passes(host, spec_obj)) def test_pci_passthrough_no_pci_stats(self): request = objects.InstancePCIRequest(count=1, @@ -77,3 +72,12 @@ class TestPCIPassthroughFilter(test.NoDBTestCase): host = fakes.FakeHostState('host1', 'node1', attribute_dict={'pci_stats': stats.PciDeviceStats()}) self.assertFalse(self.filt_cls.host_passes(host, spec_obj)) + + def test_pci_passthrough_with_pci_stats_none(self): + request = objects.InstancePCIRequest(count=1, + spec=[{'vendor_id': '8086'}]) + requests = objects.InstancePCIRequests(requests=[request]) + spec_obj = objects.RequestSpec(pci_requests=requests) + host = fakes.FakeHostState('host1', 'node1', + attribute_dict={'pci_stats': None}) + self.assertFalse(self.filt_cls.host_passes(host, spec_obj))