Commit 60af751d authored by Andrea Spadaccini's avatar Andrea Spadaccini
Browse files

Adapt non-KVM hypervisors to new migration RPCs


Signed-off-by: default avatarAndrea Spadaccini <spadaccio@google.com>
Reviewed-by: default avatarMichael Hanselmann <hansmi@google.com>
parent 61643226
......@@ -291,3 +291,16 @@ class ChrootManager(hv_base.BaseHypervisor):
"""
raise HypervisorError("Migration not supported by the chroot hypervisor")
def GetMigrationStatus(self, instance):
"""Get the migration status
@type instance: L{objects.Instance}
@param instance: the instance that is being migrated
@rtype: L{objects.MigrationStatus}
@return: the status of the current migration (one of
L{constants.HV_MIGRATION_VALID_STATUSES}), plus any additional
progress info that can be retrieved from the hypervisor
"""
raise HypervisorError("Migration not supported by the chroot hypervisor")
......@@ -259,15 +259,17 @@ class FakeHypervisor(hv_base.BaseHypervisor):
logging.debug("Fake hypervisor migrating %s to %s (live=%s)",
instance, target, live)
self._MarkDown(instance.name)
def FinalizeMigration(self, instance, info, success):
"""Finalize an instance migration.
def FinalizeMigrationDst(self, instance, info, success):
"""Finalize the instance migration on the target node.
For the fake hv, this just marks the instance up.
@type instance: L{objects.Instance}
@param instance: instance whose migration is being finalized
@type info: string/data (opaque)
@param info: migration information, from the source node
@type success: boolean
@param success: whether the migration was a success or a failure
"""
if success:
......@@ -275,3 +277,44 @@ class FakeHypervisor(hv_base.BaseHypervisor):
else:
# ensure it's down
self._MarkDown(instance.name)
def PostMigrationCleanup(self, instance):
"""Clean-up after a migration.
To be executed on the source node.
@type instance: L{objects.Instance}
@param instance: the instance that was migrated
"""
pass
def FinalizeMigrationSource(self, instance, success, live):
"""Finalize the instance migration on the source node.
@type instance: L{objects.Instance}
@param instance: the instance that was migrated
@type success: bool
@param success: whether the migration succeeded or not
@type live: bool
@param live: whether the user requested a live migration or not
"""
# pylint: disable=W0613
if success:
self._MarkDown(instance.name)
def GetMigrationStatus(self, instance):
"""Get the migration status
The fake hypervisor migration always succeeds.
@type instance: L{objects.Instance}
@param instance: the instance that is being migrated
@rtype: L{objects.MigrationStatus}
@return: the status of the current migration (one of
L{constants.HV_MIGRATION_VALID_STATUSES}), plus any additional
progress info that can be retrieved from the hypervisor
"""
return objects.MigrationStatus(status=constants.HV_MIGRATION_COMPLETED)
......@@ -413,3 +413,16 @@ class LXCHypervisor(hv_base.BaseHypervisor):
"""
raise HypervisorError("Migration is not supported by the LXC hypervisor")
def GetMigrationStatus(self, instance):
"""Get the migration status
@type instance: L{objects.Instance}
@param instance: the instance that is being migrated
@rtype: L{objects.MigrationStatus}
@return: the status of the current migration (one of
L{constants.HV_MIGRATION_VALID_STATUSES}), plus any additional
progress info that can be retrieved from the hypervisor
"""
raise HypervisorError("Migration is not supported by the LXC hypervisor")
......@@ -415,7 +415,7 @@ class XenHypervisor(hv_base.BaseHypervisor):
"""
pass
def FinalizeMigration(self, instance, info, success):
def FinalizeMigrationDst(self, instance, info, success):
"""Finalize an instance migration.
After a successful migration we write the xen config file.
......@@ -463,11 +463,42 @@ class XenHypervisor(hv_base.BaseHypervisor):
if result.failed:
raise errors.HypervisorError("Failed to migrate instance %s: %s" %
(instance.name, result.output))
# remove old xen file after migration succeeded
try:
self._RemoveConfigFile(instance.name)
except EnvironmentError:
logging.exception("Failure while removing instance config file")
def FinalizeMigrationSource(self, instance, success, live):
"""Finalize the instance migration on the source node.
@type instance: L{objects.Instance}
@param instance: the instance that was migrated
@type success: bool
@param success: whether the migration succeeded or not
@type live: bool
@param live: whether the user requested a live migration or not
"""
# pylint: disable=W0613
if success:
# remove old xen file after migration succeeded
try:
self._RemoveConfigFile(instance.name)
except EnvironmentError:
logging.exception("Failure while removing instance config file")
def GetMigrationStatus(self, instance):
"""Get the migration status
As MigrateInstance for Xen is still blocking, if this method is called it
means that MigrateInstance has completed successfully. So we can safely
assume that the migration was successful and notify this fact to the client.
@type instance: L{objects.Instance}
@param instance: the instance that is being migrated
@rtype: L{objects.MigrationStatus}
@return: the status of the current migration (one of
L{constants.HV_MIGRATION_VALID_STATUSES}), plus any additional
progress info that can be retrieved from the hypervisor
"""
return objects.MigrationStatus(status=constants.HV_MIGRATION_COMPLETED)
@classmethod
def PowercycleNode(cls):
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment