diff options
-rw-r--r-- | nova/objects/instance.py | 15 | ||||
-rw-r--r-- | nova/tests/objects/test_instance.py | 8 |
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)) |