Add new DB API method to retrieve migration for instance

New API to force live migration to complete and to cancel ongoing live
migration will take server id and migration id as arguments.
This patch adds new method to DB API to retrieve migration with given
id for particular instance id.

Partially implements: blueprint pause-vm-during-live-migration
Change-Id: I2eebf2a16b03a327348557b88fa573cb40917e9b
This commit is contained in:
Pawel Koniszewski 2016-01-27 15:57:38 +01:00
parent 5c8edcc697
commit 23063011b1
7 changed files with 57 additions and 2 deletions

View File

@ -472,6 +472,13 @@ def migration_get(context, migration_id):
return IMPL.migration_get(context, migration_id)
def migration_get_by_id_and_instance(context, migration_id, instance_uuid):
"""Finds a migration by the migration id and the instance uuid."""
return IMPL.migration_get_by_id_and_instance(context,
migration_id,
instance_uuid)
def migration_get_by_instance_and_status(context, instance_uuid, status):
"""Finds a migration by the instance uuid its migrating."""
return IMPL.migration_get_by_instance_and_status(context, instance_uuid,

View File

@ -4482,6 +4482,20 @@ def migration_get(context, id):
return result
@main_context_manager.reader
def migration_get_by_id_and_instance(context, id, instance_uuid):
result = model_query(context, models.Migration).\
filter_by(id=id).\
filter_by(instance_uuid=instance_uuid).\
first()
if not result:
raise exception.MigrationNotFoundForInstance(migration_id=id,
instance_id=instance_uuid)
return result
@main_context_manager.reader
def migration_get_by_instance_and_status(context, instance_uuid, status):
result = model_query(context, models.Migration, read_deleted="yes").\

View File

@ -1122,6 +1122,11 @@ class MigrationNotFoundByStatus(MigrationNotFound):
"with status %(status)s.")
class MigrationNotFoundForInstance(MigrationNotFound):
msg_fmt = _("Migration %(migration_id)s not found for instance "
"%(instance_id)s")
class ConsoleLogOutputException(NovaException):
msg_fmt = _("Console log output could not be retrieved for instance "
"%(instance_id)s. Reason: %(reason)s")

View File

@ -35,7 +35,8 @@ class Migration(base.NovaPersistentObject, base.NovaObject,
# Version 1.0: Initial version
# Version 1.1: String attributes updated to support unicode
# Version 1.2: Added migration_type and hidden
VERSION = '1.2'
# Version 1.3: Added get_by_id_and_instance()
VERSION = '1.3'
fields = {
'id': fields.IntegerField(),
@ -89,6 +90,12 @@ class Migration(base.NovaPersistentObject, base.NovaObject,
db_migration = db.migration_get(context, migration_id)
return cls._from_db_object(context, cls(), db_migration)
@base.remotable_classmethod
def get_by_id_and_instance(cls, context, migration_id, instance_uuid):
db_migration = db.migration_get_by_id_and_instance(
context, migration_id, instance_uuid)
return cls._from_db_object(context, cls(), db_migration)
@base.remotable_classmethod
def get_by_instance_and_status(cls, context, instance_uuid, status):
db_migration = db.migration_get_by_instance_and_status(

View File

@ -1523,6 +1523,20 @@ class MigrationTestCase(test.TestCase):
self.assertRaises(exception.MigrationNotFound,
db.migration_update, self.ctxt, 42, {})
def test_get_migration_for_instance(self):
migrations = db.migration_get_all_by_filters(self.ctxt, [])
migration_id = migrations[0].id
instance_uuid = migrations[0].instance_uuid
instance_migration = db.migration_get_by_id_and_instance(
self.ctxt, migration_id, instance_uuid)
self.assertEqual(migration_id, instance_migration.id)
self.assertEqual(instance_uuid, instance_migration.instance_uuid)
def test_get_migration_for_instance_not_found(self):
self.assertRaises(exception.MigrationNotFoundForInstance,
db.migration_get_by_id_and_instance, self.ctxt,
'500', '501')
class ModelsObjectComparatorMixin(object):
def _dict_from_object(self, obj, ignored_keys):

View File

@ -229,6 +229,14 @@ class _TestMigrationObject(object):
self.assertEqual('migration', mig.migration_type)
self.assertTrue(mig.obj_attr_is_set('migration_type'))
@mock.patch('nova.db.migration_get_by_id_and_instance')
def test_get_by_id_and_instance(self, fake_get):
ctxt = context.get_admin_context()
fake_migration = fake_db_migration()
fake_get.return_value = fake_migration
migration = objects.Migration.get_by_id_and_instance(ctxt, '1', '1')
self.compare_obj(migration, fake_migration)
class TestMigrationObject(test_objects._LocalTest,
_TestMigrationObject):

View File

@ -1147,7 +1147,7 @@ object_data = {
'LibvirtLiveMigrateData': '1.1-4ecf40aae7fee7bb37fc3b2123e760de',
'KeyPair': '1.3-bfaa2a8b148cdf11e0c72435d9dd097a',
'KeyPairList': '1.2-58b94f96e776bedaf1e192ddb2a24c4e',
'Migration': '1.2-8784125bedcea0a9227318511904e853',
'Migration': '1.3-c245057c22d505a4e6462ab95fa27166',
'MigrationContext': '1.0-d8c2f10069e410f639c49082b5932c92',
'MigrationList': '1.2-02c0ec0c50b75ca86a2a74c5e8c911cc',
'MonitorMetric': '1.1-53b1db7c4ae2c531db79761e7acc52ba',