From c2d9a6fdfddc1bcc6c687946f320669cf0a73173 Mon Sep 17 00:00:00 2001 From: Shane Wang Date: Mon, 6 Jan 2014 13:51:36 +0800 Subject: [PATCH] Prevent caller from specifying id during ComputeNode.create() The patch is to remove id when it was set before creating a compute node in objects, so it can be generated automatically. And check if the node exists before it is created. Related to blueprint icehouse-objects. Change-Id: Ib808643bff24b683ef330b5a1be5bc68ece30184 --- nova/objects/compute_node.py | 5 +++++ nova/tests/objects/test_compute_node.py | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/nova/objects/compute_node.py b/nova/objects/compute_node.py index b277be97f023..9db1c6cce536 100644 --- a/nova/objects/compute_node.py +++ b/nova/objects/compute_node.py @@ -13,6 +13,7 @@ # under the License. from nova import db +from nova import exception from nova.objects import base from nova.objects import fields @@ -64,7 +65,11 @@ class ComputeNode(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_compute = db.compute_node_create(context, updates) self._from_db_object(context, self, db_compute) diff --git a/nova/tests/objects/test_compute_node.py b/nova/tests/objects/test_compute_node.py index f1ad6cac9f6c..c0ae9763bd88 100644 --- a/nova/tests/objects/test_compute_node.py +++ b/nova/tests/objects/test_compute_node.py @@ -13,6 +13,7 @@ # under the License. from nova import db +from nova import exception from nova.objects import compute_node from nova.objects import service from nova.openstack.common import timeutils @@ -71,6 +72,17 @@ class _TestComputeNodeObject(object): compute.create(self.context) self.compare_obj(compute, fake_compute_node) + def test_recreate_fails(self): + self.mox.StubOutWithMock(db, 'compute_node_create') + db.compute_node_create(self.context, {'service_id': 456}).AndReturn( + fake_compute_node) + self.mox.ReplayAll() + compute = compute_node.ComputeNode() + compute.service_id = 456 + compute.create(self.context) + self.assertRaises(exception.ObjectActionError, compute.create, + self.context) + def test_save(self): self.mox.StubOutWithMock(db, 'compute_node_update') db.compute_node_update(self.context, 123, {'vcpus_used': 3},