diff --git a/nova/virt/xenapi/connection.py b/nova/virt/xenapi/connection.py index c02f3581d347..5ba7a4d5406a 100644 --- a/nova/virt/xenapi/connection.py +++ b/nova/virt/xenapi/connection.py @@ -90,6 +90,10 @@ xenapi_opts = [ default=5.0, help='The interval used for polling of coalescing vhds. ' 'Used only if connection_type=xenapi.'), + cfg.BoolOpt('xenapi_check_host', + default=True, + help='Ensure compute service is running on host XenAPI ' + 'connects to.'), cfg.IntOpt('xenapi_vhd_coalesce_max_attempts', default=5, help='Max number of times to poll for VHD to coalesce. ' @@ -166,6 +170,9 @@ class XenAPIConnection(driver.ComputeDriver): return self._host_state def init_host(self, host): + if FLAGS.xenapi_check_host: + vm_utils.ensure_correct_host(self._session) + try: vm_utils.cleanup_attached_vdis(self._session) except Exception: diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 540a144c8094..83dc7180a6dd 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -1819,3 +1819,17 @@ def _prepare_injectables(inst, networks_info): searchList=[{'interfaces': interfaces_info, 'use_ipv6': FLAGS.use_ipv6}])) return key, net, metadata + + +def ensure_correct_host(session): + """Ensure we're connected to the host we're running on. This is the + required configuration for anything that uses vdi_attached_here.""" + this_vm_uuid = get_this_vm_uuid() + + try: + session.call_xenapi('VM.get_by_uuid', this_vm_uuid) + except session.XenAPI.Failure as exc: + if exc.details[0] != 'UUID_INVALID': + raise + raise Exception(_('This domU must be running on the host ' + 'specified by xenapi_connection_url'))