summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Behrens <cbehrens@codestud.com>2012-07-28 06:13:07 +0000
committerChris Behrens <cbehrens@codestud.com>2012-07-28 06:18:54 +0000
commite425b65b3d7e0736ce14c7523c8af85754eda27b (patch)
tree3a83d2ab7401bdd20fb6c078b0a26ea40ae8d564
parentbad0a496c0e765da3cc879235c988b7cc617f367 (diff)
downloadnova-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.py2
-rw-r--r--nova/compute/manager.py13
-rw-r--r--nova/db/api.py11
-rw-r--r--nova/db/sqlalchemy/api.py4
-rw-r--r--nova/tests/compute/test_compute.py8
-rw-r--r--nova/tests/test_db_api.py30
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"})