From de3ff1576a8e5574221efdfdd4daec54adb3e2a6 Mon Sep 17 00:00:00 2001 From: Artur Korzeniewski Date: Mon, 17 Oct 2016 18:21:51 +0200 Subject: [PATCH] objects: Remove tenant_id from to_dict() when project_id is not set. Current implementation will raise AttributeError when some object will not have project_id set, but will call to_dict()/items() method. This is affecting 7ba5b4ef259476b6f48b21d78c8d560bfb5be167. This should not affect Newton. Change-Id: If0c00aa5630fe575378ec3c8a2f17d7333951ae6 Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db --- neutron/objects/base.py | 7 ++++++- neutron/tests/unit/objects/test_base.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/neutron/objects/base.py b/neutron/objects/base.py index edab720fca4..1aa712ced10 100644 --- a/neutron/objects/base.py +++ b/neutron/objects/base.py @@ -150,6 +150,10 @@ class NeutronObject(obj_base.VersionedObject, # is included in self.items() if name in self.fields and name not in self.synthetic_fields: value = self.fields[name].to_primitive(self, name, value) + if name == 'tenant_id': + if ('project_id' in self.fields and + not self.obj_attr_is_set('project_id')): + continue dict_[name] = value for field_name, value in self._synthetic_fields_items(): field = self.fields[field_name] @@ -252,7 +256,8 @@ class DeclarativeObject(abc.ABCMeta): obj_extra_fields_set = set(cls.obj_extra_fields) obj_extra_fields_set.add('tenant_id') cls.obj_extra_fields = list(obj_extra_fields_set) - setattr(cls, 'tenant_id', property(lambda x: x.project_id)) + setattr(cls, 'tenant_id', + property(lambda x: x.get('project_id', None))) fields_no_update_set = set(cls.fields_no_update) for base in itertools.chain([cls], bases): diff --git a/neutron/tests/unit/objects/test_base.py b/neutron/tests/unit/objects/test_base.py index 40dd8b8a766..3927e0fecb7 100644 --- a/neutron/tests/unit/objects/test_base.py +++ b/neutron/tests/unit/objects/test_base.py @@ -801,6 +801,18 @@ class BaseObjectIfaceTestCase(_BaseObjectTestCase, test_base.BaseTestCase): field = obj.fields[k] self.assertEqual(v, field.to_primitive(obj, k, getattr(obj, k))) + def test_to_dict_with_unset_project_id(self): + if 'project_id' not in self._test_class.fields: + self.skipTest( + 'Test class %r has no project_id in fields' % self._test_class) + obj_data = copy.copy(self.obj_fields[0]) + obj_data.pop('project_id') + obj = self._test_class(self.context, **obj_data) + dict_ = obj.to_dict() + + self.assertNotIn('project_id', dict_) + self.assertNotIn('tenant_id', dict_) + def test_fields_no_update(self): obj = self._test_class(self.context, **self.obj_fields[0]) for field in self._test_class.fields_no_update: