Merge "pci: Improve testing of 'nova.pci.request' module"
This commit is contained in:
commit
6f221a8d79
@ -61,7 +61,6 @@ DEVICE_TYPE_FOR_VNIC_TYPE = {
|
||||
|
||||
CONF = nova.conf.CONF
|
||||
|
||||
_ALIAS_CAP_TYPE = ['pci']
|
||||
_ALIAS_SCHEMA = {
|
||||
"type": "object",
|
||||
"additionalProperties": False,
|
||||
@ -75,7 +74,7 @@ _ALIAS_SCHEMA = {
|
||||
# should probably be removed.
|
||||
"capability_type": {
|
||||
"type": "string",
|
||||
"enum": _ALIAS_CAP_TYPE,
|
||||
"enum": ['pci'],
|
||||
},
|
||||
"product_id": {
|
||||
"type": "string",
|
||||
|
@ -16,7 +16,7 @@
|
||||
"""Tests for PCI request."""
|
||||
|
||||
import mock
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
from oslo_utils.fixture import uuidsentinel
|
||||
|
||||
from nova import context
|
||||
@ -29,46 +29,22 @@ from nova import test
|
||||
from nova.tests.unit.api.openstack import fakes
|
||||
|
||||
|
||||
_fake_alias1 = """{
|
||||
"name": "QuicAssist",
|
||||
"capability_type": "pci",
|
||||
"product_id": "4443",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI",
|
||||
"numa_policy": "legacy"
|
||||
}"""
|
||||
_fake_alias1 = jsonutils.dumps({
|
||||
"name": "QuickAssist",
|
||||
"capability_type": "pci",
|
||||
"product_id": "4443",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI",
|
||||
"numa_policy": "legacy",
|
||||
})
|
||||
|
||||
_fake_alias11 = """{
|
||||
"name": "QuicAssist",
|
||||
"capability_type": "pci",
|
||||
"product_id": "4444",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI"
|
||||
}"""
|
||||
|
||||
_fake_alias2 = """{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "1111",
|
||||
"device_type": "N"
|
||||
}"""
|
||||
|
||||
_fake_alias3 = """{
|
||||
"name": "IntelNIC",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PF"
|
||||
}"""
|
||||
|
||||
_fake_alias4 = """{
|
||||
"name": " Cirrus Logic ",
|
||||
"capability_type": "pci",
|
||||
"product_id": "0ff2",
|
||||
"vendor_id": "10de",
|
||||
"device_type": "type-PCI"
|
||||
}"""
|
||||
_fake_alias2 = jsonutils.dumps({
|
||||
"name": "IntelNIC",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PF",
|
||||
})
|
||||
|
||||
|
||||
class PciRequestTestCase(test.NoDBTestCase):
|
||||
@ -99,9 +75,8 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
super(PciRequestTestCase, self).setUp()
|
||||
self.context = context.RequestContext(fakes.FAKE_USER_ID,
|
||||
fakes.FAKE_PROJECT_ID)
|
||||
self.mock_inst_cn = mock.Mock()
|
||||
|
||||
def test_valid_alias(self):
|
||||
def test_get_alias_from_config_valid(self):
|
||||
self.flags(alias=[_fake_alias1], group='pci')
|
||||
result = request._get_alias_from_config()
|
||||
expected_result = (
|
||||
@ -112,10 +87,18 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
"vendor_id": "8086",
|
||||
"dev_type": "type-PCI",
|
||||
}])
|
||||
self.assertEqual(expected_result, result['QuicAssist'])
|
||||
self.assertEqual(expected_result, result['QuickAssist'])
|
||||
|
||||
def test_valid_multispec_alias(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias11], group='pci')
|
||||
def test_get_alias_from_config_valid_multispec(self):
|
||||
_fake_alias = jsonutils.dumps({
|
||||
"name": "QuickAssist",
|
||||
"capability_type": "pci",
|
||||
"product_id": "4444",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI",
|
||||
})
|
||||
|
||||
self.flags(alias=[_fake_alias1, _fake_alias], group='pci')
|
||||
result = request._get_alias_from_config()
|
||||
expected_result = (
|
||||
'legacy',
|
||||
@ -130,123 +113,111 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
"vendor_id": "8086",
|
||||
"dev_type": "type-PCI"
|
||||
}])
|
||||
self.assertEqual(expected_result, result['QuicAssist'])
|
||||
self.assertEqual(expected_result, result['QuickAssist'])
|
||||
|
||||
def test_invalid_type_alias(self):
|
||||
self.flags(alias=[_fake_alias2], group='pci')
|
||||
self.assertRaises(exception.PciInvalidAlias,
|
||||
def _test_get_alias_from_config_invalid(self, alias):
|
||||
self.flags(alias=[alias], group='pci')
|
||||
self.assertRaises(
|
||||
exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
|
||||
def test_invalid_product_id_alias(self):
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "g111",
|
||||
"vendor_id": "1111",
|
||||
"device_type": "NIC"
|
||||
}"""],
|
||||
group='pci')
|
||||
self.assertRaises(exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
def test_get_alias_from_config_invalid_device_type(self):
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"device_type": "N",
|
||||
})
|
||||
self._test_get_alias_from_config_invalid(fake_alias)
|
||||
|
||||
def test_invalid_vendor_id_alias(self):
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "0xg111",
|
||||
"device_type": "NIC"
|
||||
}"""],
|
||||
group='pci')
|
||||
self.assertRaises(exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
def test_get_alias_from_config_invalid_product_id(self):
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"product_id": "g111",
|
||||
})
|
||||
self._test_get_alias_from_config_invalid(fake_alias)
|
||||
|
||||
def test_invalid_cap_type_alias(self):
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "usb",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "NIC"
|
||||
}"""],
|
||||
group='pci')
|
||||
self.assertRaises(exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
def test_get_alias_from_config_invalid_vendor_id(self):
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"vendor_id": "0xg111",
|
||||
})
|
||||
self._test_get_alias_from_config_invalid(fake_alias)
|
||||
|
||||
def test_invalid_numa_policy(self):
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "NIC",
|
||||
"numa_policy": "derp"
|
||||
}"""],
|
||||
group='pci')
|
||||
self.assertRaises(exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
def test_get_alias_from_config_invalid_capability_type(self):
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"capability_type": "usb",
|
||||
})
|
||||
self._test_get_alias_from_config_invalid(fake_alias)
|
||||
|
||||
def test_valid_numa_policy(self):
|
||||
def test_get_alias_from_config_invalid_numa_policy(self):
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"numa_policy": "derp",
|
||||
})
|
||||
self._test_get_alias_from_config_invalid(fake_alias)
|
||||
|
||||
def test_get_alias_from_config_invalid_arbitrary_field(self):
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"foo": "bar",
|
||||
})
|
||||
self._test_get_alias_from_config_invalid(fake_alias)
|
||||
|
||||
def test_get_alias_from_config_valid_numa_policy(self):
|
||||
for policy in fields.PCINUMAAffinityPolicy.ALL:
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
fake_alias = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI",
|
||||
"numa_policy": "%s"
|
||||
}""" % policy],
|
||||
group='pci')
|
||||
"numa_policy": policy,
|
||||
})
|
||||
self.flags(alias=[fake_alias], group='pci')
|
||||
aliases = request._get_alias_from_config()
|
||||
self.assertIsNotNone(aliases)
|
||||
self.assertIn("xxx", aliases)
|
||||
self.assertEqual(policy, aliases["xxx"][0])
|
||||
|
||||
def test_conflicting_device_type(self):
|
||||
def test_get_alias_from_config_conflicting_device_type(self):
|
||||
"""Check behavior when device_type conflicts occur."""
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "NIC"
|
||||
}""",
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI"
|
||||
}"""],
|
||||
group='pci')
|
||||
fake_alias_a = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PF"
|
||||
})
|
||||
fake_alias_b = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"device_type": "type-PCI"
|
||||
})
|
||||
|
||||
self.flags(alias=[fake_alias_a, fake_alias_b], group='pci')
|
||||
self.assertRaises(
|
||||
exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
|
||||
def test_conflicting_numa_policy(self):
|
||||
def test_get_alias_from_config_conflicting_numa_policy(self):
|
||||
"""Check behavior when numa_policy conflicts occur."""
|
||||
self.flags(alias=[
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"numa_policy": "required",
|
||||
}""",
|
||||
"""{
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"numa_policy": "legacy",
|
||||
}"""],
|
||||
group='pci')
|
||||
fake_alias_a = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"numa_policy": "required",
|
||||
})
|
||||
fake_alias_b = jsonutils.dumps({
|
||||
"name": "xxx",
|
||||
"capability_type": "pci",
|
||||
"product_id": "1111",
|
||||
"vendor_id": "8086",
|
||||
"numa_policy": "legacy",
|
||||
})
|
||||
self.flags(alias=[fake_alias_a, fake_alias_b], group='pci')
|
||||
self.assertRaises(
|
||||
exception.PciInvalidAlias,
|
||||
request._get_alias_from_config)
|
||||
@ -258,15 +229,15 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
self.assertEqual(exp['alias_name'], real.alias_name)
|
||||
self.assertEqual(exp['spec'], real.spec)
|
||||
|
||||
def test_alias_2_request(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias3], group='pci')
|
||||
def test_translate_alias_to_requests(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias2], group='pci')
|
||||
expect_request = [
|
||||
{'count': 3,
|
||||
'requester_id': None,
|
||||
'spec': [{'vendor_id': '8086', 'product_id': '4443',
|
||||
'dev_type': 'type-PCI',
|
||||
'capability_type': 'pci'}],
|
||||
'alias_name': 'QuicAssist'},
|
||||
'alias_name': 'QuickAssist'},
|
||||
|
||||
{'count': 1,
|
||||
'requester_id': None,
|
||||
@ -276,20 +247,20 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
'alias_name': 'IntelNIC'}, ]
|
||||
|
||||
requests = request._translate_alias_to_requests(
|
||||
"QuicAssist : 3, IntelNIC: 1")
|
||||
"QuickAssist : 3, IntelNIC: 1")
|
||||
self.assertEqual(set([p['count'] for p in requests]), set([1, 3]))
|
||||
self._verify_result(expect_request, requests)
|
||||
|
||||
def test_alias_2_request_invalid(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias3], group='pci')
|
||||
def test_translate_alias_to_requests_invalid(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias2], group='pci')
|
||||
self.assertRaises(exception.PciRequestAliasNotDefined,
|
||||
request._translate_alias_to_requests,
|
||||
"QuicAssistX : 3")
|
||||
"QuickAssistX : 3")
|
||||
|
||||
def test_alias_2_request_affinity_policy(self):
|
||||
# _fake_alias1 requests the legacy policy and _fake_alias3
|
||||
def test_translate_alias_to_requests_affinity_policy(self):
|
||||
# _fake_alias1 requests the legacy policy and _fake_alias2
|
||||
# has no numa_policy set so it will default to legacy.
|
||||
self.flags(alias=[_fake_alias1, _fake_alias3], group='pci')
|
||||
self.flags(alias=[_fake_alias1, _fake_alias2], group='pci')
|
||||
# so to test that the flavor/image policy takes precedence
|
||||
# set use the preferred policy.
|
||||
policy = fields.PCINUMAAffinityPolicy.PREFERRED
|
||||
@ -299,7 +270,7 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
'spec': [{'vendor_id': '8086', 'product_id': '4443',
|
||||
'dev_type': 'type-PCI',
|
||||
'capability_type': 'pci'}],
|
||||
'alias_name': 'QuicAssist',
|
||||
'alias_name': 'QuickAssist',
|
||||
'numa_policy': policy
|
||||
},
|
||||
|
||||
@ -313,7 +284,7 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
}, ]
|
||||
|
||||
requests = request._translate_alias_to_requests(
|
||||
"QuicAssist : 3, IntelNIC: 1", affinity_policy=policy)
|
||||
"QuickAssist : 3, IntelNIC: 1", affinity_policy=policy)
|
||||
self.assertEqual(set([p['count'] for p in requests]), set([1, 3]))
|
||||
self._verify_result(expect_request, requests)
|
||||
|
||||
@ -325,8 +296,9 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
# Basically make sure we raise an exception if an instance
|
||||
# has an allocated PCI device without having the its corresponding
|
||||
# PCIRequest object in instance.pci_requests
|
||||
self.mock_inst_cn.id = 1
|
||||
cn_get_by_host_and_node.return_value = self.mock_inst_cn
|
||||
mock_inst_cn = mock.Mock()
|
||||
mock_inst_cn.id = 1
|
||||
cn_get_by_host_and_node.return_value = mock_inst_cn
|
||||
|
||||
# Create a fake instance with PCI request and allocated PCI devices
|
||||
pci_dev1 = objects.PciDevice(request_id=uuidsentinel.pci_req_id1,
|
||||
@ -356,8 +328,9 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
@mock.patch.object(objects.compute_node.ComputeNode,
|
||||
'get_by_host_and_nodename')
|
||||
def test_get_instance_pci_request_from_vif(self, cn_get_by_host_and_node):
|
||||
self.mock_inst_cn.id = 1
|
||||
cn_get_by_host_and_node.return_value = self.mock_inst_cn
|
||||
mock_inst_cn = mock.Mock()
|
||||
mock_inst_cn.id = 1
|
||||
cn_get_by_host_and_node.return_value = mock_inst_cn
|
||||
|
||||
# Create a fake instance with PCI request and allocated PCI devices
|
||||
pci_req1 = objects.InstancePCIRequest(
|
||||
@ -404,20 +377,43 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
|
||||
# "Move" the instance to another compute node, make sure that no
|
||||
# matching PCI request against the new compute.
|
||||
self.mock_inst_cn.id = 2
|
||||
mock_inst_cn.id = 2
|
||||
self.assertIsNone(request.get_instance_pci_request_from_vif(
|
||||
self.context,
|
||||
inst,
|
||||
pci_vif))
|
||||
|
||||
def test_get_pci_requests_from_flavor(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias3], group='pci')
|
||||
self.flags(alias=[_fake_alias1], group='pci')
|
||||
expect_request = [
|
||||
{
|
||||
'count': 3,
|
||||
'spec': [
|
||||
{
|
||||
'vendor_id': '8086',
|
||||
'product_id': '4443',
|
||||
'dev_type': "type-PCI",
|
||||
'capability_type': 'pci',
|
||||
}
|
||||
],
|
||||
'alias_name': 'QuickAssist'
|
||||
},
|
||||
]
|
||||
|
||||
flavor = {'extra_specs': {'pci_passthrough:alias': 'QuickAssist:3'}}
|
||||
requests = request.get_pci_requests_from_flavor(flavor)
|
||||
self.assertEqual(1, len(requests.requests))
|
||||
self.assertEqual({3, }, {p.count for p in requests.requests})
|
||||
self._verify_result(expect_request, requests.requests)
|
||||
|
||||
def test_get_pci_requests_from_flavor_multiple(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias2], group='pci')
|
||||
expect_request = [
|
||||
{'count': 3,
|
||||
'spec': [{'vendor_id': '8086', 'product_id': '4443',
|
||||
'dev_type': "type-PCI",
|
||||
'capability_type': 'pci'}],
|
||||
'alias_name': 'QuicAssist'},
|
||||
'alias_name': 'QuickAssist'},
|
||||
|
||||
{'count': 1,
|
||||
'spec': [{'vendor_id': '8086', 'product_id': '1111',
|
||||
@ -426,14 +422,22 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
'alias_name': 'IntelNIC'}, ]
|
||||
|
||||
flavor = {'extra_specs': {"pci_passthrough:alias":
|
||||
"QuicAssist:3, IntelNIC: 1"}}
|
||||
"QuickAssist:3, IntelNIC: 1"}}
|
||||
requests = request.get_pci_requests_from_flavor(flavor)
|
||||
self.assertEqual(set([1, 3]),
|
||||
set([p.count for p in requests.requests]))
|
||||
self.assertEqual(2, len(requests.requests))
|
||||
self.assertEqual({3, 1}, {p.count for p in requests.requests})
|
||||
self._verify_result(expect_request, requests.requests)
|
||||
|
||||
def test_get_pci_requests_from_flavor_including_space(self):
|
||||
self.flags(alias=[_fake_alias3, _fake_alias4], group='pci')
|
||||
_fake_alias4 = jsonutils.dumps({
|
||||
"name": " Cirrus Logic ",
|
||||
"capability_type": "pci",
|
||||
"product_id": "0ff2",
|
||||
"vendor_id": "10de",
|
||||
"device_type": "type-PCI",
|
||||
})
|
||||
|
||||
self.flags(alias=[_fake_alias2, _fake_alias4], group='pci')
|
||||
expect_request = [
|
||||
{'count': 4,
|
||||
'spec': [{'vendor_id': '10de', 'product_id': '0ff2',
|
||||
@ -450,12 +454,12 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
flavor = {'extra_specs': {"pci_passthrough:alias":
|
||||
" Cirrus Logic : 4, IntelNIC: 3"}}
|
||||
requests = request.get_pci_requests_from_flavor(flavor)
|
||||
self.assertEqual(set([3, 4]),
|
||||
set([p.count for p in requests.requests]))
|
||||
self.assertEqual(2, len(requests.requests))
|
||||
self.assertEqual({3, 4}, {p.count for p in requests.requests})
|
||||
self._verify_result(expect_request, requests.requests)
|
||||
|
||||
def test_get_pci_requests_from_flavor_no_extra_spec(self):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias3], group='pci')
|
||||
self.flags(alias=[_fake_alias1, _fake_alias2], group='pci')
|
||||
flavor = {}
|
||||
requests = request.get_pci_requests_from_flavor(flavor)
|
||||
self.assertEqual([], requests.requests)
|
||||
@ -464,9 +468,9 @@ class PciRequestTestCase(test.NoDBTestCase):
|
||||
request, "_translate_alias_to_requests", return_value=[])
|
||||
def test_get_pci_requests_from_flavor_affinity_policy(
|
||||
self, mock_translate):
|
||||
self.flags(alias=[_fake_alias1, _fake_alias3], group='pci')
|
||||
self.flags(alias=[_fake_alias1, _fake_alias2], group='pci')
|
||||
flavor = {'extra_specs': {"pci_passthrough:alias":
|
||||
"QuicAssist:3, IntelNIC: 1"}}
|
||||
"QuickAssist:3, IntelNIC: 1"}}
|
||||
policy = fields.PCINUMAAffinityPolicy.PREFERRED
|
||||
request.get_pci_requests_from_flavor(flavor, affinity_policy=policy)
|
||||
mock_translate.assert_called_with(mock.ANY, affinity_policy=policy)
|
||||
|
Loading…
Reference in New Issue
Block a user