summaryrefslogtreecommitdiff
path: root/nova/tests/unit/objects/test_instance.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests/unit/objects/test_instance.py')
-rw-r--r--nova/tests/unit/objects/test_instance.py178
1 files changed, 171 insertions, 7 deletions
diff --git a/nova/tests/unit/objects/test_instance.py b/nova/tests/unit/objects/test_instance.py
index e187a4c251..6215d2be60 100644
--- a/nova/tests/unit/objects/test_instance.py
+++ b/nova/tests/unit/objects/test_instance.py
@@ -14,8 +14,8 @@
import collections
import datetime
+from unittest import mock
-import mock
import netaddr
from oslo_db import exception as db_exc
from oslo_serialization import jsonutils
@@ -25,6 +25,7 @@ from oslo_versionedobjects import base as ovo_base
from nova.compute import task_states
from nova.compute import vm_states
+from nova import context
from nova.db.main import api as db
from nova.db.main import models as sql_models
from nova import exception
@@ -2015,12 +2016,14 @@ class TestInstanceListObject(test_objects._LocalTest,
# manually here.
engine = db.get_engine()
table = sql_models.Instance.__table__
- with engine.connect() as conn:
- update = table.insert().values(user_id=self.context.user_id,
- project_id=self.context.project_id,
- uuid=uuids.nullinst,
- host='foo',
- hidden=None)
+ with engine.connect() as conn, conn.begin():
+ update = table.insert().values(
+ user_id=self.context.user_id,
+ project_id=self.context.project_id,
+ uuid=uuids.nullinst,
+ host='foo',
+ hidden=None,
+ )
conn.execute(update)
insts = objects.InstanceList.get_by_filters(self.context,
@@ -2071,3 +2074,164 @@ class TestInstanceObjectMisc(test.NoDBTestCase):
self.assertEqual(['metadata', 'system_metadata', 'info_cache',
'security_groups', 'pci_devices', 'tags', 'extra',
'extra.flavor'], result_list)
+
+
+class TestInstanceObjectGetPciDevices(test.NoDBTestCase):
+ def test_lazy_loading_pci_devices(self):
+ user_id = "fake-user"
+ project_id = "fake-project"
+ ctxt = context.RequestContext(user_id, project_id)
+
+ inst = instance.Instance(ctxt, uuid=uuids.instance)
+ with mock.patch(
+ "nova.objects.PciDeviceList.get_by_instance_uuid",
+ return_value=objects.PciDeviceList(),
+ ) as mock_get_pci:
+ self.assertEqual([], inst.get_pci_devices())
+
+ mock_get_pci.assert_called_once_with(ctxt, uuids.instance)
+
+ def test_lazy_loading_pci_requests(self):
+ user_id = "fake-user"
+ project_id = "fake-project"
+ ctxt = context.RequestContext(user_id, project_id)
+
+ devs = [objects.PciDevice(request_id=uuids.req1)]
+ inst = instance.Instance(
+ ctxt,
+ uuid=uuids.instance,
+ pci_devices=objects.PciDeviceList(
+ objects=devs
+ ),
+ )
+
+ with mock.patch(
+ "nova.objects.InstancePCIRequests.get_by_instance_uuid",
+ return_value=objects.InstancePCIRequests(
+ requests=[
+ objects.InstancePCIRequest(
+ request_id=uuids.req1,
+ alias_name="pci-alias-1",
+ ),
+ ]
+ ),
+ ) as mock_get_pci_req:
+ self.assertEqual(
+ devs,
+ inst.get_pci_devices(
+ source=objects.InstancePCIRequest.FLAVOR_ALIAS
+ ),
+ )
+
+ mock_get_pci_req.assert_called_once_with(ctxt, uuids.instance)
+
+ def test_no_filter(self):
+ devs = [objects.PciDevice()]
+
+ inst = instance.Instance(
+ pci_devices=objects.PciDeviceList(objects=devs)
+ )
+
+ self.assertEqual(devs, inst.get_pci_devices())
+
+ def test_no_filter_by_request_id(self):
+ expected_devs = [objects.PciDevice(request_id=uuids.req1)]
+ all_devs = expected_devs + [objects.PciDevice(request_id=uuids.req2)]
+
+ inst = instance.Instance(
+ pci_devices=objects.PciDeviceList(objects=all_devs)
+ )
+
+ self.assertEqual(
+ expected_devs, inst.get_pci_devices(request_id=uuids.req1)
+ )
+
+ def test_no_filter_by_source(self):
+ expected_devs = [
+ objects.PciDevice(request_id=uuids.req1),
+ objects.PciDevice(request_id=uuids.req1),
+ ]
+ all_devs = expected_devs + [objects.PciDevice(request_id=uuids.req2)]
+
+ inst = instance.Instance(
+ pci_devices=objects.PciDeviceList(objects=all_devs),
+ pci_requests=objects.InstancePCIRequests(
+ requests=[
+ objects.InstancePCIRequest(
+ request_id=uuids.req1,
+ alias_name="pci-alias-1",
+ ),
+ objects.InstancePCIRequest(
+ request_id=uuids.req2,
+ ),
+ ]
+ ),
+ )
+
+ self.assertEqual(
+ expected_devs,
+ inst.get_pci_devices(
+ source=objects.InstancePCIRequest.FLAVOR_ALIAS
+ ),
+ )
+
+ def test_no_filter_by_request_id_and_source(self):
+ expected_devs = []
+ all_devs = expected_devs + [
+ objects.PciDevice(request_id=uuids.req1),
+ objects.PciDevice(request_id=uuids.req2),
+ objects.PciDevice(request_id=uuids.req1),
+ ]
+
+ inst = instance.Instance(
+ pci_devices=objects.PciDeviceList(objects=all_devs),
+ pci_requests=objects.InstancePCIRequests(
+ requests=[
+ objects.InstancePCIRequest(
+ request_id=uuids.req1,
+ alias_name="pci-alias-1",
+ ),
+ objects.InstancePCIRequest(
+ request_id=uuids.req2,
+ ),
+ ]
+ ),
+ )
+
+ self.assertEqual(
+ expected_devs,
+ inst.get_pci_devices(
+ request_id=uuids.req1,
+ source=objects.InstancePCIRequest.NEUTRON_PORT,
+ ),
+ )
+
+ def test_old_pci_dev_and_req(self):
+ """This tests the case when the system has old InstancePCIRequest
+ objects without the request_id being filled. And therefore have
+ PciDevice object where the request_id is None too. These requests and
+ devices are always flavor based.
+ """
+ devs = [
+ objects.PciDevice(request_id=None),
+ objects.PciDevice(request_id=None),
+ ]
+
+ inst = instance.Instance(
+ pci_devices=objects.PciDeviceList(objects=devs),
+ pci_requests=objects.InstancePCIRequests(
+ requests=[
+ objects.InstancePCIRequest(
+ request_id=None,
+ alias_name="pci-alias-1",
+ ),
+ ]
+ ),
+ )
+
+ self.assertEqual(
+ devs,
+ inst.get_pci_devices(
+ source=objects.InstancePCIRequest.FLAVOR_ALIAS,
+ ),
+ )