summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorRenuka Apte <renuka.apte@citrix.com>2012-07-12 16:22:26 -0700
committerRenuka Apte <renuka.apte@citrix.com>2012-08-14 16:25:29 -0700
commita7d0934a97ead360ecb378de7e29dbea513a6b30 (patch)
tree93141a17267c124d032fb2ab3b75d7cdf92df9ac /nova/compute
parent0eb53c035ab290c9574c1388bde59f7d05f64efc (diff)
xenapi: Support live migration without pools
Implement blueprint xenapi-live-block-migration. Add ability to live migrate VMs to hosts that are not a part of a host aggregate (block migration). This requires XenServer 6.1/later, or XCP 1.6/later. As of this change, we still do not support instances with (nova/cinder) volumes attached. External kernels are also not supported. Change-Id: I5feb6756d78804aa37780a7d0cda1600f7060afe
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/manager.py12
-rw-r--r--nova/compute/rpcapi.py25
2 files changed, 24 insertions, 13 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 61703318f..1b8115531 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -247,7 +247,7 @@ def _get_image_meta(context, image_ref):
class ComputeManager(manager.SchedulerDependentManager):
"""Manages the running instances from creation to destruction."""
- RPC_API_VERSION = '1.42'
+ RPC_API_VERSION = '1.43'
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@@ -2181,6 +2181,9 @@ class ComputeManager(manager.SchedulerDependentManager):
in) nova.db.sqlalchemy.models.Instance.Id
:param block_migration: if true, prepare for block migration
:param disk_over_commit: if true, allow disk over commit
+
+ Returns a mapping of values required in case of block migration
+ and None otherwise.
"""
if not instance:
instance = self.db.instance_get(ctxt, instance_id)
@@ -2192,6 +2195,8 @@ class ComputeManager(manager.SchedulerDependentManager):
finally:
self.driver.check_can_live_migrate_destination_cleanup(ctxt,
dest_check_data)
+ if dest_check_data and 'migrate_data' in dest_check_data:
+ return dest_check_data['migrate_data']
@exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
def check_can_live_migrate_source(self, ctxt, dest_check_data,
@@ -2261,7 +2266,7 @@ class ComputeManager(manager.SchedulerDependentManager):
self.driver.pre_block_migration(context, instance, disk)
def live_migration(self, context, dest, block_migration=False,
- instance=None, instance_id=None):
+ instance=None, instance_id=None, migrate_data=None):
"""Executing live migration.
:param context: security context
@@ -2269,6 +2274,7 @@ class ComputeManager(manager.SchedulerDependentManager):
:param instance: instance dict
:param dest: destination host
:param block_migration: if true, prepare for block migration
+ :param migrate_data: implementation specific params
"""
# Get instance for error handling.
@@ -2306,7 +2312,7 @@ class ComputeManager(manager.SchedulerDependentManager):
self.driver.live_migration(context, instance, dest,
self._post_live_migration,
self.rollback_live_migration,
- block_migration)
+ block_migration, migrate_data)
def _post_live_migration(self, ctxt, instance_ref,
dest, block_migration=False):
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index 366eaaacf..c81d75356 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -123,6 +123,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.42 - Add reservations arg to prep_resize(), resize_instance(),
finish_resize(), confirm_resize(), revert_resize() and
finish_revert_resize()
+ 1.43 - Add migrate_data to live_migration()
'''
BASE_RPC_API_VERSION = '1.0'
@@ -168,14 +169,16 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
version='1.36')
def check_can_live_migrate_destination(self, ctxt, instance, destination,
- block_migration, disk_over_commit):
+ block_migration, disk_over_commit):
instance_p = jsonutils.to_primitive(instance)
- self.call(ctxt, self.make_msg('check_can_live_migrate_destination',
- instance=instance_p,
- block_migration=block_migration,
- disk_over_commit=disk_over_commit),
- topic=_compute_topic(self.topic, ctxt, destination, None),
- version='1.10')
+ return self.call(ctxt,
+ self.make_msg('check_can_live_migrate_destination',
+ instance=instance_p,
+ block_migration=block_migration,
+ disk_over_commit=disk_over_commit),
+ topic=_compute_topic(self.topic,
+ ctxt, destination, None),
+ version='1.10')
def check_can_live_migrate_source(self, ctxt, instance, dest_check_data):
instance_p = jsonutils.to_primitive(instance)
@@ -283,12 +286,14 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
topic=_compute_topic(self.topic, ctxt, None, instance),
version='1.19')
- def live_migration(self, ctxt, instance, dest, block_migration, host):
+ def live_migration(self, ctxt, instance, dest, block_migration, host,
+ migrate_data=None):
instance_p = jsonutils.to_primitive(instance)
self.cast(ctxt, self.make_msg('live_migration', instance=instance_p,
- dest=dest, block_migration=block_migration),
+ dest=dest, block_migration=block_migration,
+ migrate_data=migrate_data),
topic=_compute_topic(self.topic, ctxt, host, None),
- version='1.40')
+ version='1.43')
def pause_instance(self, ctxt, instance):
instance_p = jsonutils.to_primitive(instance)