From 7b66e8ecef99ff2cd8aa486ab4af43fc8ec38fee Mon Sep 17 00:00:00 2001 From: Shane Wang Date: Tue, 7 Jan 2014 14:38:02 +0800 Subject: [PATCH] Prevent caller from specifying id during Service.create() The patch is to remove id when it was set before creating a service in objects, and check if the service exists before it is created. Related to blueprint icehouse-objects. Change-Id: I688bfc98234f4bc27fb15474e05c7f25753efaf7 --- nova/objects/service.py | 4 ++++ nova/tests/objects/test_service.py | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/nova/objects/service.py b/nova/objects/service.py index a7d117cba5..f34f054520 100644 --- a/nova/objects/service.py +++ b/nova/objects/service.py @@ -107,7 +107,11 @@ class Service(base.NovaPersistentObject, base.NovaObject): @base.remotable def create(self, context): + if self.obj_attr_is_set('id'): + raise exception.ObjectActionError(action='create', + reason='already created') updates = self.obj_get_changes() + updates.pop('id', None) db_service = db.service_create(context, updates) self._from_db_object(context, self, db_service) diff --git a/nova/tests/objects/test_service.py b/nova/tests/objects/test_service.py index c3a9b84a37..f769a91b49 100644 --- a/nova/tests/objects/test_service.py +++ b/nova/tests/objects/test_service.py @@ -85,6 +85,17 @@ class _TestServiceObject(object): service_obj.create(self.context) self.assertEqual(fake_service['id'], service_obj.id) + def test_recreate_fails(self): + self.mox.StubOutWithMock(db, 'service_create') + db.service_create(self.context, {'host': 'fake-host'}).AndReturn( + fake_service) + self.mox.ReplayAll() + service_obj = service.Service() + service_obj.host = 'fake-host' + service_obj.create(self.context) + self.assertRaises(exception.ObjectActionError, service_obj.create, + self.context) + def test_save(self): self.mox.StubOutWithMock(db, 'service_update') db.service_update(self.context, 123, {'host': 'fake-host'}).AndReturn(