From 2b24b3e00d7d7cd82219157dba15b0efa1b90923 Mon Sep 17 00:00:00 2001 From: Shane Wang Date: Tue, 7 Jan 2014 14:53:23 +0800 Subject: [PATCH] Prevent caller from specifying id during Migration.create() The patch is to remove id when it was set before creating a migration in objects, and check if the migration exists before it is created. Related to blueprint icehouse-objects. Change-Id: I37ff279f5f74d17ce9c173458ff35826fb10f143 --- nova/objects/migration.py | 4 ++++ nova/tests/objects/test_migration.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/nova/objects/migration.py b/nova/objects/migration.py index f017a8cd7d22..90c78f7e117c 100644 --- a/nova/objects/migration.py +++ b/nova/objects/migration.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 from nova.objects import instance as instance_obj @@ -57,6 +58,9 @@ class Migration(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_migration = db.migration_create(context, updates) diff --git a/nova/tests/objects/test_migration.py b/nova/tests/objects/test_migration.py index 08f0f1af8018..23e1b857a0d0 100644 --- a/nova/tests/objects/test_migration.py +++ b/nova/tests/objects/test_migration.py @@ -14,6 +14,7 @@ from nova import context from nova import db +from nova import exception from nova.objects import migration from nova.openstack.common import timeutils from nova.tests import fake_instance @@ -81,6 +82,19 @@ class _TestMigrationObject(object): mig.create(ctxt) self.assertEqual(fake_migration['dest_compute'], mig.dest_compute) + def test_recreate_fails(self): + ctxt = context.get_admin_context() + fake_migration = fake_db_migration() + self.mox.StubOutWithMock(db, 'migration_create') + db.migration_create(ctxt, {'source_compute': 'foo'}).AndReturn( + fake_migration) + self.mox.ReplayAll() + mig = migration.Migration() + mig.source_compute = 'foo' + mig.create(ctxt) + self.assertRaises(exception.ObjectActionError, mig.create, + self.context) + def test_save(self): ctxt = context.get_admin_context() fake_migration = fake_db_migration()