summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/objects/instance.py15
-rw-r--r--nova/tests/objects/test_instance.py8
2 files changed, 20 insertions, 3 deletions
diff --git a/nova/objects/instance.py b/nova/objects/instance.py
index cc61b1ed9..3691e7282 100644
--- a/nova/objects/instance.py
+++ b/nova/objects/instance.py
@@ -30,6 +30,8 @@ CONF = cfg.CONF
INSTANCE_OPTIONAL_FIELDS = ['metadata', 'system_metadata']
# These are fields that are always joined by the db right now
INSTANCE_IMPLIED_FIELDS = ['info_cache', 'security_groups']
+# These are fields that are optional but don't translate to db columns
+INSTANCE_OPTIONAL_NON_COLUMNS = []
class Instance(base.NovaObject):
@@ -315,6 +317,14 @@ def _make_instance_list(context, inst_list, db_inst_list, expected_attrs):
return inst_list
+def expected_cols(expected_attrs):
+ """Return expected_attrs that are columns needing joining."""
+ if expected_attrs:
+ return list(set(expected_attrs) - set(INSTANCE_OPTIONAL_NON_COLUMNS))
+ else:
+ return expected_attrs
+
+
class InstanceList(base.ObjectListBase, base.NovaObject):
@base.remotable_classmethod
def get_by_filters(cls, context, filters,
@@ -322,15 +332,14 @@ class InstanceList(base.ObjectListBase, base.NovaObject):
expected_attrs=None):
db_inst_list = db.instance_get_all_by_filters(
context, filters, sort_key, sort_dir, limit, marker,
- columns_to_join=expected_attrs)
-
+ columns_to_join=expected_cols(expected_attrs))
return _make_instance_list(context, cls(), db_inst_list,
expected_attrs)
@base.remotable_classmethod
def get_by_host(cls, context, host, expected_attrs=None):
db_inst_list = db.instance_get_all_by_host(
- context, host, columns_to_join=expected_attrs)
+ context, host, columns_to_join=expected_cols(expected_attrs))
return _make_instance_list(context, cls(), db_inst_list,
expected_attrs)
diff --git a/nova/tests/objects/test_instance.py b/nova/tests/objects/test_instance.py
index f5128e73f..3a2486f9e 100644
--- a/nova/tests/objects/test_instance.py
+++ b/nova/tests/objects/test_instance.py
@@ -22,6 +22,7 @@ from nova.objects import base
from nova.objects import instance
from nova.objects import security_group
from nova.openstack.common import timeutils
+from nova import test
from nova.tests.api.openstack import fakes
from nova.tests.objects import test_objects
@@ -383,3 +384,10 @@ class TestInstanceListObject(test_objects._LocalTest,
class TestRemoteInstanceListObject(test_objects._RemoteTest,
_TestInstanceListObject):
pass
+
+
+class TestInstanceObjectMisc(test.TestCase):
+ def test_expected_cols(self):
+ self.stubs.Set(instance, 'INSTANCE_OPTIONAL_NON_COLUMNS', ['bar'])
+ self.assertEqual(['foo'], instance.expected_cols(['foo', 'bar']))
+ self.assertEqual(None, instance.expected_cols(None))