diff options
| author | Chris Behrens <cbehrens@codestud.com> | 2012-07-28 06:13:07 +0000 |
|---|---|---|
| committer | Chris Behrens <cbehrens@codestud.com> | 2012-07-28 06:18:54 +0000 |
| commit | e425b65b3d7e0736ce14c7523c8af85754eda27b (patch) | |
| tree | 3a83d2ab7401bdd20fb6c078b0a26ea40ae8d564 | |
| parent | bad0a496c0e765da3cc879235c988b7cc617f367 (diff) | |
| download | nova-e425b65b3d7e0736ce14c7523c8af85754eda27b.tar.gz nova-e425b65b3d7e0736ce14c7523c8af85754eda27b.tar.xz nova-e425b65b3d7e0736ce14c7523c8af85754eda27b.zip | |
Make compute only auto-confirm its own instances
Fixes bug 1030226
Change-Id: I0e0cf0c9950f34b1bdab856b2e1c6872b29fdedc
| -rw-r--r-- | nova/compute/api.py | 2 | ||||
| -rw-r--r-- | nova/compute/manager.py | 13 | ||||
| -rw-r--r-- | nova/db/api.py | 11 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 4 | ||||
| -rw-r--r-- | nova/tests/compute/test_compute.py | 8 | ||||
| -rw-r--r-- | nova/tests/test_db_api.py | 30 |
6 files changed, 46 insertions, 22 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py index d97390e04..f78e13f20 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1348,8 +1348,6 @@ class API(base.Base): self.db.migration_update(context, migration_ref['id'], {'status': 'confirmed'}) - self.db.instance_update(context, instance['uuid'], - {'host': migration_ref['dest_compute'], }) @wrap_check_policy @check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.STOPPED], diff --git a/nova/compute/manager.py b/nova/compute/manager.py index f41b20a97..686409e47 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -2477,8 +2477,8 @@ class ComputeManager(manager.SchedulerDependentManager): @manager.periodic_task def _poll_unconfirmed_resizes(self, context): if FLAGS.resize_confirm_window > 0: - migrations = self.db.migration_get_all_unconfirmed(context, - FLAGS.resize_confirm_window) + migrations = self.db.migration_get_unconfirmed_by_dest_compute( + context, FLAGS.resize_confirm_window, FLAGS.host) migrations_info = dict(migration_count=len(migrations), confirm_window=FLAGS.resize_confirm_window) @@ -2516,10 +2516,11 @@ class ComputeManager(manager.SchedulerDependentManager): _set_migration_to_error(migration_id, reason % locals(), instance=instance) continue - if instance['vm_state'] != vm_states.RESIZED \ - or instance['task_state'] is not None: - state = instance['vm_state'] - reason = _("In %(state)s vm_state, not RESIZED") + vm_state = instance['vm_state'] + task_state = instance['task_state'] + if vm_state != vm_states.RESIZED or task_state is not None: + reason = _("In states %(vm_state)s/%(task_state)s, not" + "RESIZED/None") _set_migration_to_error(migration_id, reason % locals(), instance=instance) continue diff --git a/nova/db/api.py b/nova/db/api.py index 6e99ad636..96254fe08 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -410,9 +410,14 @@ def migration_get_by_instance_and_status(context, instance_uuid, status): status) -def migration_get_all_unconfirmed(context, confirm_window): - """Finds all unconfirmed migrations within the confirmation window.""" - return IMPL.migration_get_all_unconfirmed(context, confirm_window) +def migration_get_unconfirmed_by_dest_compute(context, confirm_window, + dest_compute): + """ + Finds all unconfirmed migrations within the confirmation window for + a specific destination compute host. + """ + return IMPL.migration_get_unconfirmed_by_dest_compute(context, + confirm_window, dest_compute) #################### diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ccf5a1e8b..8d64874bc 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -3674,7 +3674,8 @@ def migration_get_by_instance_and_status(context, instance_uuid, status): @require_admin_context -def migration_get_all_unconfirmed(context, confirm_window, session=None): +def migration_get_unconfirmed_by_dest_compute(context, confirm_window, + dest_compute, session=None): confirm_window = (timeutils.utcnow() - datetime.timedelta(seconds=confirm_window)) @@ -3682,6 +3683,7 @@ def migration_get_all_unconfirmed(context, confirm_window, session=None): read_deleted="yes").\ filter(models.Migration.updated_at <= confirm_window).\ filter_by(status="finished").\ + filter_by(dest_compute=dest_compute).\ all() diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 40f053cc7..c5913d9d3 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -1981,7 +1981,9 @@ class ComputeTestCase(BaseTestCase): if instance['uuid'] == instance_uuid: return instance - def fake_migration_get_all_unconfirmed(context, resize_confirm_window): + def fake_migration_get_unconfirmed_by_dest_compute(context, + resize_confirm_window, dest_compute): + self.assertEqual(dest_compute, FLAGS.host) return migrations def fake_migration_update(context, migration_id, values): @@ -2000,8 +2002,8 @@ class ComputeTestCase(BaseTestCase): self.stubs.Set(db, 'instance_get_by_uuid', fake_instance_get_by_uuid) - self.stubs.Set(db, 'migration_get_all_unconfirmed', - fake_migration_get_all_unconfirmed) + self.stubs.Set(db, 'migration_get_unconfirmed_by_dest_compute', + fake_migration_get_unconfirmed_by_dest_compute) self.stubs.Set(db, 'migration_update', fake_migration_update) self.stubs.Set(self.compute.compute_api, 'confirm_resize', diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index 44efc0950..51850f03e 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -81,26 +81,42 @@ class DbApiTestCase(test.TestCase): else: self.assertTrue(result[1].deleted) - def test_migration_get_all_unconfirmed(self): + def test_migration_get_unconfirmed_by_dest_compute(self): ctxt = context.get_admin_context() # Ensure no migrations are returned. - results = db.migration_get_all_unconfirmed(ctxt, 10) + results = db.migration_get_unconfirmed_by_dest_compute(ctxt, 10, + 'fake_host') + self.assertEqual(0, len(results)) + + # Ensure no migrations are returned. + results = db.migration_get_unconfirmed_by_dest_compute(ctxt, 10, + 'fake_host2') self.assertEqual(0, len(results)) - # Ensure one migration older than 10 seconds is returned. updated_at = datetime.datetime(2000, 01, 01, 12, 00, 00) - values = {"status": "finished", "updated_at": updated_at} + values = {"status": "finished", "updated_at": updated_at, + "dest_compute": "fake_host2"} migration = db.migration_create(ctxt, values) - results = db.migration_get_all_unconfirmed(ctxt, 10) + + # Ensure different host is not returned + results = db.migration_get_unconfirmed_by_dest_compute(ctxt, 10, + 'fake_host') + self.assertEqual(0, len(results)) + + # Ensure one migration older than 10 seconds is returned. + results = db.migration_get_unconfirmed_by_dest_compute(ctxt, 10, + 'fake_host2') self.assertEqual(1, len(results)) db.migration_update(ctxt, migration.id, {"status": "CONFIRMED"}) # Ensure the new migration is not returned. updated_at = timeutils.utcnow() - values = {"status": "finished", "updated_at": updated_at} + values = {"status": "finished", "updated_at": updated_at, + "dest_compute": "fake_host2"} migration = db.migration_create(ctxt, values) - results = db.migration_get_all_unconfirmed(ctxt, 10) + results = db.migration_get_unconfirmed_by_dest_compute(ctxt, 10, + "fake_host2") self.assertEqual(0, len(results)) db.migration_update(ctxt, migration.id, {"status": "CONFIRMED"}) |
