Remove conductor local api:s and 'use_local' config option
This change removes the deprecated conductor local mode and the 'use_local' flag that was used to control it. UpgradeImpact Change-Id: Icc1624606ecb561781a971467443e24b1643f535
This commit is contained in:
parent
0360e4c93d
commit
c36dbe1f72
@ -42,9 +42,7 @@ def main():
|
|||||||
|
|
||||||
gmr.TextGuruMeditation.setup_autorun(version)
|
gmr.TextGuruMeditation.setup_autorun(version)
|
||||||
|
|
||||||
if not CONF.conductor.use_local:
|
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI()
|
||||||
objects_base.NovaObject.indirection_api = \
|
|
||||||
conductor_rpcapi.ConductorAPI()
|
|
||||||
|
|
||||||
should_use_ssl = 'metadata' in CONF.enabled_ssl_apis
|
should_use_ssl = 'metadata' in CONF.enabled_ssl_apis
|
||||||
server = service.WSGIService('metadata', use_ssl=should_use_ssl)
|
server = service.WSGIService('metadata', use_ssl=should_use_ssl)
|
||||||
|
@ -28,7 +28,6 @@ from nova.cmd import common as cmd_common
|
|||||||
from nova.conductor import rpcapi as conductor_rpcapi
|
from nova.conductor import rpcapi as conductor_rpcapi
|
||||||
import nova.conf
|
import nova.conf
|
||||||
from nova import config
|
from nova import config
|
||||||
from nova.i18n import _LW
|
|
||||||
from nova import objects
|
from nova import objects
|
||||||
from nova.objects import base as objects_base
|
from nova.objects import base as objects_base
|
||||||
from nova import service
|
from nova import service
|
||||||
@ -50,16 +49,10 @@ def main():
|
|||||||
|
|
||||||
gmr.TextGuruMeditation.setup_autorun(version)
|
gmr.TextGuruMeditation.setup_autorun(version)
|
||||||
|
|
||||||
if not CONF.conductor.use_local:
|
|
||||||
cmd_common.block_db_access('nova-compute')
|
cmd_common.block_db_access('nova-compute')
|
||||||
objects_base.NovaObject.indirection_api = \
|
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI()
|
||||||
conductor_rpcapi.ConductorAPI()
|
|
||||||
else:
|
|
||||||
LOG.warning(_LW('Conductor local mode is deprecated and will '
|
|
||||||
'be removed in a subsequent release'))
|
|
||||||
|
|
||||||
server = service.Service.create(binary='nova-compute',
|
server = service.Service.create(binary='nova-compute',
|
||||||
topic=CONF.compute_topic,
|
topic=CONF.compute_topic)
|
||||||
db_allowed=CONF.conductor.use_local)
|
|
||||||
service.serve(server)
|
service.serve(server)
|
||||||
service.wait()
|
service.wait()
|
||||||
|
@ -33,7 +33,7 @@ from nova.conductor import rpcapi as conductor_rpcapi
|
|||||||
import nova.conf
|
import nova.conf
|
||||||
from nova import config
|
from nova import config
|
||||||
from nova import context
|
from nova import context
|
||||||
from nova.i18n import _LE, _LW
|
from nova.i18n import _LE
|
||||||
from nova.network import rpcapi as network_rpcapi
|
from nova.network import rpcapi as network_rpcapi
|
||||||
from nova import objects
|
from nova import objects
|
||||||
from nova.objects import base as objects_base
|
from nova.objects import base as objects_base
|
||||||
@ -117,13 +117,8 @@ def main():
|
|||||||
|
|
||||||
objects.register_all()
|
objects.register_all()
|
||||||
|
|
||||||
if not CONF.conductor.use_local:
|
|
||||||
cmd_common.block_db_access('nova-dhcpbridge')
|
cmd_common.block_db_access('nova-dhcpbridge')
|
||||||
objects_base.NovaObject.indirection_api = \
|
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI()
|
||||||
conductor_rpcapi.ConductorAPI()
|
|
||||||
else:
|
|
||||||
LOG.warning(_LW('Conductor local mode is deprecated and will '
|
|
||||||
'be removed in a subsequent release'))
|
|
||||||
|
|
||||||
if CONF.action.name in ['add', 'del']:
|
if CONF.action.name in ['add', 'del']:
|
||||||
LOG.debug("Called '%(action)s' for mac '%(mac)s' with IP '%(ip)s'",
|
LOG.debug("Called '%(action)s' for mac '%(mac)s' with IP '%(ip)s'",
|
||||||
|
@ -44,18 +44,12 @@ def main():
|
|||||||
|
|
||||||
gmr.TextGuruMeditation.setup_autorun(version)
|
gmr.TextGuruMeditation.setup_autorun(version)
|
||||||
|
|
||||||
if not CONF.conductor.use_local:
|
|
||||||
cmd_common.block_db_access('nova-network')
|
cmd_common.block_db_access('nova-network')
|
||||||
objects_base.NovaObject.indirection_api = \
|
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI()
|
||||||
conductor_rpcapi.ConductorAPI()
|
|
||||||
else:
|
|
||||||
LOG.warning(_LW('Conductor local mode is deprecated and will '
|
|
||||||
'be removed in a subsequent release'))
|
|
||||||
|
|
||||||
LOG.warning(_LW('Nova network is deprecated and will be removed '
|
LOG.warning(_LW('Nova network is deprecated and will be removed '
|
||||||
'in the future'))
|
'in the future'))
|
||||||
server = service.Service.create(binary='nova-network',
|
server = service.Service.create(binary='nova-network',
|
||||||
topic=CONF.network_topic,
|
topic=CONF.network_topic)
|
||||||
db_allowed=CONF.conductor.use_local)
|
|
||||||
service.serve(server)
|
service.serve(server)
|
||||||
service.wait()
|
service.wait()
|
||||||
|
@ -14,24 +14,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from nova.conductor import api as conductor_api
|
from nova.conductor import api as conductor_api
|
||||||
import nova.conf
|
|
||||||
|
|
||||||
CONF = nova.conf.CONF
|
|
||||||
|
|
||||||
|
|
||||||
def API(*args, **kwargs):
|
API = conductor_api.API
|
||||||
use_local = kwargs.pop('use_local', False)
|
ComputeTaskAPI = conductor_api.ComputeTaskAPI
|
||||||
if CONF.conductor.use_local or use_local:
|
|
||||||
api = conductor_api.LocalAPI
|
|
||||||
else:
|
|
||||||
api = conductor_api.API
|
|
||||||
return api(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
def ComputeTaskAPI(*args, **kwargs):
|
|
||||||
use_local = kwargs.pop('use_local', False)
|
|
||||||
if CONF.conductor.use_local or use_local:
|
|
||||||
api = conductor_api.LocalComputeTaskAPI
|
|
||||||
else:
|
|
||||||
api = conductor_api.ComputeTaskAPI
|
|
||||||
return api(*args, **kwargs)
|
|
||||||
|
@ -16,122 +16,28 @@
|
|||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
from oslo_versionedobjects import base as ovo_base
|
|
||||||
|
|
||||||
from nova import baserpc
|
from nova import baserpc
|
||||||
from nova.conductor import manager
|
|
||||||
from nova.conductor import rpcapi
|
from nova.conductor import rpcapi
|
||||||
import nova.conf
|
import nova.conf
|
||||||
from nova.i18n import _LI, _LW
|
from nova.i18n import _LI, _LW
|
||||||
from nova import utils
|
|
||||||
|
|
||||||
CONF = nova.conf.CONF
|
CONF = nova.conf.CONF
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LocalAPI(object):
|
class API(object):
|
||||||
"""A local version of the conductor API that does database updates
|
|
||||||
locally instead of via RPC.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
# TODO(danms): This needs to be something more generic for
|
|
||||||
# other/future users of this sort of functionality.
|
|
||||||
self._manager = utils.ExceptionHelper(manager.ConductorManager())
|
|
||||||
|
|
||||||
def wait_until_ready(self, context, *args, **kwargs):
|
|
||||||
# nothing to wait for in the local case.
|
|
||||||
pass
|
|
||||||
|
|
||||||
def object_backport(self, context, objinst, target_version):
|
|
||||||
# NOTE(hanlind): This shouldn't be called anymore but leaving it for
|
|
||||||
# now just in case. Collect the object version manifest and redirect
|
|
||||||
# to the newer backport call.
|
|
||||||
object_versions = ovo_base.obj_tree_get_versions(objinst.obj_name())
|
|
||||||
return self.object_backport_versions(context, objinst, object_versions)
|
|
||||||
|
|
||||||
def object_backport_versions(self, context, objinst, object_versions):
|
|
||||||
return self._manager.object_backport_versions(context, objinst,
|
|
||||||
object_versions)
|
|
||||||
|
|
||||||
|
|
||||||
class LocalComputeTaskAPI(object):
|
|
||||||
def __init__(self):
|
|
||||||
# TODO(danms): This needs to be something more generic for
|
|
||||||
# other/future users of this sort of functionality.
|
|
||||||
self._manager = utils.ExceptionHelper(
|
|
||||||
manager.ComputeTaskManager())
|
|
||||||
|
|
||||||
def resize_instance(self, context, instance, extra_instance_updates,
|
|
||||||
scheduler_hint, flavor, reservations,
|
|
||||||
clean_shutdown=True, request_spec=None):
|
|
||||||
# NOTE(comstud): 'extra_instance_updates' is not used here but is
|
|
||||||
# needed for compatibility with the cells_rpcapi version of this
|
|
||||||
# method.
|
|
||||||
self._manager.migrate_server(
|
|
||||||
context, instance, scheduler_hint, live=False, rebuild=False,
|
|
||||||
flavor=flavor, block_migration=None, disk_over_commit=None,
|
|
||||||
reservations=reservations, clean_shutdown=clean_shutdown,
|
|
||||||
request_spec=request_spec)
|
|
||||||
|
|
||||||
def live_migrate_instance(self, context, instance, host_name,
|
|
||||||
block_migration, disk_over_commit,
|
|
||||||
request_spec=None, async=False):
|
|
||||||
scheduler_hint = {'host': host_name}
|
|
||||||
if async:
|
|
||||||
wrap = lambda *args: utils.spawn_n(*args)
|
|
||||||
else:
|
|
||||||
wrap = lambda *args: args[0](*args[1:])
|
|
||||||
|
|
||||||
wrap(self._manager.live_migrate_instance, context, instance,
|
|
||||||
scheduler_hint, block_migration, disk_over_commit, request_spec)
|
|
||||||
|
|
||||||
def build_instances(self, context, instances, image,
|
|
||||||
filter_properties, admin_password, injected_files,
|
|
||||||
requested_networks, security_groups, block_device_mapping,
|
|
||||||
legacy_bdm=True):
|
|
||||||
utils.spawn_n(self._manager.build_instances, context,
|
|
||||||
instances=instances, image=image,
|
|
||||||
filter_properties=filter_properties,
|
|
||||||
admin_password=admin_password, injected_files=injected_files,
|
|
||||||
requested_networks=requested_networks,
|
|
||||||
security_groups=security_groups,
|
|
||||||
block_device_mapping=block_device_mapping,
|
|
||||||
legacy_bdm=legacy_bdm)
|
|
||||||
|
|
||||||
def unshelve_instance(self, context, instance, request_spec=None):
|
|
||||||
utils.spawn_n(self._manager.unshelve_instance, context,
|
|
||||||
instance=instance, request_spec=request_spec)
|
|
||||||
|
|
||||||
def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
|
|
||||||
injected_files, new_pass, orig_sys_metadata,
|
|
||||||
bdms, recreate=False, on_shared_storage=False,
|
|
||||||
preserve_ephemeral=False, host=None,
|
|
||||||
request_spec=None, kwargs=None):
|
|
||||||
# kwargs unused but required for cell compatibility.
|
|
||||||
utils.spawn_n(self._manager.rebuild_instance, context,
|
|
||||||
instance=instance,
|
|
||||||
new_pass=new_pass,
|
|
||||||
injected_files=injected_files,
|
|
||||||
image_ref=image_ref,
|
|
||||||
orig_image_ref=orig_image_ref,
|
|
||||||
orig_sys_metadata=orig_sys_metadata,
|
|
||||||
bdms=bdms,
|
|
||||||
recreate=recreate,
|
|
||||||
on_shared_storage=on_shared_storage,
|
|
||||||
host=host,
|
|
||||||
preserve_ephemeral=preserve_ephemeral,
|
|
||||||
request_spec=request_spec)
|
|
||||||
|
|
||||||
|
|
||||||
class API(LocalAPI):
|
|
||||||
"""Conductor API that does updates via RPC to the ConductorManager."""
|
"""Conductor API that does updates via RPC to the ConductorManager."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._manager = rpcapi.ConductorAPI()
|
self.conductor_rpcapi = rpcapi.ConductorAPI()
|
||||||
self.base_rpcapi = baserpc.BaseAPI(topic=CONF.conductor.topic)
|
self.base_rpcapi = baserpc.BaseAPI(topic=CONF.conductor.topic)
|
||||||
|
|
||||||
|
def object_backport_versions(self, context, objinst, object_versions):
|
||||||
|
return self.conductor_rpcapi.object_backport_versions(context, objinst,
|
||||||
|
object_versions)
|
||||||
|
|
||||||
def wait_until_ready(self, context, early_timeout=10, early_attempts=10):
|
def wait_until_ready(self, context, early_timeout=10, early_attempts=10):
|
||||||
'''Wait until a conductor service is up and running.
|
'''Wait until a conductor service is up and running.
|
||||||
|
|
||||||
|
@ -26,18 +26,6 @@ and finally, how many worker processes will be used.
|
|||||||
)
|
)
|
||||||
|
|
||||||
ALL_OPTS = [
|
ALL_OPTS = [
|
||||||
cfg.BoolOpt(
|
|
||||||
'use_local',
|
|
||||||
default=False,
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_since='13.0.0',
|
|
||||||
help="""
|
|
||||||
Perform nova-conductor operations locally. This legacy mode was
|
|
||||||
introduced to bridge a gap during the transition to the conductor service.
|
|
||||||
It no longer represents a reasonable alternative for deployers.
|
|
||||||
|
|
||||||
Removal may be as early as 14.0.
|
|
||||||
"""),
|
|
||||||
cfg.StrOpt(
|
cfg.StrOpt(
|
||||||
'topic',
|
'topic',
|
||||||
default='conductor',
|
default='conductor',
|
||||||
|
@ -80,8 +80,7 @@ class Service(service.Service):
|
|||||||
|
|
||||||
def __init__(self, host, binary, topic, manager, report_interval=None,
|
def __init__(self, host, binary, topic, manager, report_interval=None,
|
||||||
periodic_enable=None, periodic_fuzzy_delay=None,
|
periodic_enable=None, periodic_fuzzy_delay=None,
|
||||||
periodic_interval_max=None, db_allowed=True,
|
periodic_interval_max=None, *args, **kwargs):
|
||||||
*args, **kwargs):
|
|
||||||
super(Service, self).__init__()
|
super(Service, self).__init__()
|
||||||
self.host = host
|
self.host = host
|
||||||
self.binary = binary
|
self.binary = binary
|
||||||
@ -97,8 +96,9 @@ class Service(service.Service):
|
|||||||
self.periodic_interval_max = periodic_interval_max
|
self.periodic_interval_max = periodic_interval_max
|
||||||
self.saved_args, self.saved_kwargs = args, kwargs
|
self.saved_args, self.saved_kwargs = args, kwargs
|
||||||
self.backdoor_port = None
|
self.backdoor_port = None
|
||||||
self.conductor_api = conductor.API(use_local=db_allowed)
|
if objects_base.NovaObject.indirection_api:
|
||||||
self.conductor_api.wait_until_ready(context.get_admin_context())
|
conductor_api = conductor.API()
|
||||||
|
conductor_api.wait_until_ready(context.get_admin_context())
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%(cls_name)s: host=%(host)s, binary=%(binary)s, " \
|
return "<%(cls_name)s: host=%(host)s, binary=%(binary)s, " \
|
||||||
@ -177,8 +177,7 @@ class Service(service.Service):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def create(cls, host=None, binary=None, topic=None, manager=None,
|
def create(cls, host=None, binary=None, topic=None, manager=None,
|
||||||
report_interval=None, periodic_enable=None,
|
report_interval=None, periodic_enable=None,
|
||||||
periodic_fuzzy_delay=None, periodic_interval_max=None,
|
periodic_fuzzy_delay=None, periodic_interval_max=None):
|
||||||
db_allowed=True):
|
|
||||||
"""Instantiates class and passes back application object.
|
"""Instantiates class and passes back application object.
|
||||||
|
|
||||||
:param host: defaults to CONF.host
|
:param host: defaults to CONF.host
|
||||||
@ -214,8 +213,7 @@ class Service(service.Service):
|
|||||||
report_interval=report_interval,
|
report_interval=report_interval,
|
||||||
periodic_enable=periodic_enable,
|
periodic_enable=periodic_enable,
|
||||||
periodic_fuzzy_delay=periodic_fuzzy_delay,
|
periodic_fuzzy_delay=periodic_fuzzy_delay,
|
||||||
periodic_interval_max=periodic_interval_max,
|
periodic_interval_max=periodic_interval_max)
|
||||||
db_allowed=db_allowed)
|
|
||||||
|
|
||||||
return service_obj
|
return service_obj
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ from nova.compute import flavors
|
|||||||
from nova.compute import rpcapi as compute_rpcapi
|
from nova.compute import rpcapi as compute_rpcapi
|
||||||
from nova.compute import task_states
|
from nova.compute import task_states
|
||||||
from nova.compute import vm_states
|
from nova.compute import vm_states
|
||||||
from nova import conductor
|
|
||||||
from nova.conductor import api as conductor_api
|
from nova.conductor import api as conductor_api
|
||||||
from nova.conductor import manager as conductor_manager
|
from nova.conductor import manager as conductor_manager
|
||||||
from nova.conductor import rpcapi as conductor_rpcapi
|
from nova.conductor import rpcapi as conductor_rpcapi
|
||||||
@ -279,53 +278,6 @@ class ConductorAPITestCase(_BaseTestCase, test.TestCase):
|
|||||||
self.assertEqual(timeouts.count(10), 10)
|
self.assertEqual(timeouts.count(10), 10)
|
||||||
self.assertIn(None, timeouts)
|
self.assertIn(None, timeouts)
|
||||||
|
|
||||||
@mock.patch('oslo_versionedobjects.base.obj_tree_get_versions')
|
|
||||||
def test_object_backport_redirect(self, mock_ovo):
|
|
||||||
mock_ovo.return_value = mock.sentinel.obj_versions
|
|
||||||
mock_objinst = mock.Mock()
|
|
||||||
|
|
||||||
with mock.patch.object(self.conductor,
|
|
||||||
'object_backport_versions') as mock_call:
|
|
||||||
self.conductor.object_backport(mock.sentinel.ctxt,
|
|
||||||
mock_objinst,
|
|
||||||
mock.sentinel.target_version)
|
|
||||||
mock_call.assert_called_once_with(mock.sentinel.ctxt,
|
|
||||||
mock_objinst,
|
|
||||||
mock.sentinel.obj_versions)
|
|
||||||
|
|
||||||
|
|
||||||
class ConductorLocalAPITestCase(ConductorAPITestCase):
|
|
||||||
"""Conductor LocalAPI Tests."""
|
|
||||||
def setUp(self):
|
|
||||||
super(ConductorLocalAPITestCase, self).setUp()
|
|
||||||
self.conductor = conductor_api.LocalAPI()
|
|
||||||
self.conductor_manager = self.conductor._manager._target
|
|
||||||
|
|
||||||
def test_wait_until_ready(self):
|
|
||||||
# Override test in ConductorAPITestCase
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class ConductorImportTest(test.NoDBTestCase):
|
|
||||||
def test_import_conductor_local(self):
|
|
||||||
self.flags(use_local=True, group='conductor')
|
|
||||||
self.assertIsInstance(conductor.API(), conductor_api.LocalAPI)
|
|
||||||
self.assertIsInstance(conductor.ComputeTaskAPI(),
|
|
||||||
conductor_api.LocalComputeTaskAPI)
|
|
||||||
|
|
||||||
def test_import_conductor_rpc(self):
|
|
||||||
self.flags(use_local=False, group='conductor')
|
|
||||||
self.assertIsInstance(conductor.API(), conductor_api.API)
|
|
||||||
self.assertIsInstance(conductor.ComputeTaskAPI(),
|
|
||||||
conductor_api.ComputeTaskAPI)
|
|
||||||
|
|
||||||
def test_import_conductor_override_to_local(self):
|
|
||||||
self.flags(use_local=False, group='conductor')
|
|
||||||
self.assertIsInstance(conductor.API(use_local=True),
|
|
||||||
conductor_api.LocalAPI)
|
|
||||||
self.assertIsInstance(conductor.ComputeTaskAPI(use_local=True),
|
|
||||||
conductor_api.LocalComputeTaskAPI)
|
|
||||||
|
|
||||||
|
|
||||||
class _BaseTaskTestCase(object):
|
class _BaseTaskTestCase(object):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -395,8 +347,7 @@ class _BaseTaskTestCase(object):
|
|||||||
|
|
||||||
scheduler_hint = {'filter_properties': {}}
|
scheduler_hint = {'filter_properties': {}}
|
||||||
|
|
||||||
if isinstance(self.conductor, (conductor_api.ComputeTaskAPI,
|
if isinstance(self.conductor, conductor_api.ComputeTaskAPI):
|
||||||
conductor_api.LocalComputeTaskAPI)):
|
|
||||||
# The API method is actually 'resize_instance'. It gets
|
# The API method is actually 'resize_instance'. It gets
|
||||||
# converted into 'migrate_server' when doing RPC.
|
# converted into 'migrate_server' when doing RPC.
|
||||||
self.conductor.resize_instance(
|
self.conductor.resize_instance(
|
||||||
@ -2111,59 +2062,3 @@ class ConductorTaskAPITestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
|
|||||||
self.context, inst_obj, {'host': 'destination'}, True, False,
|
self.context, inst_obj, {'host': 'destination'}, True, False,
|
||||||
None, 'block_migration', 'disk_over_commit', None,
|
None, 'block_migration', 'disk_over_commit', None,
|
||||||
request_spec=None)
|
request_spec=None)
|
||||||
|
|
||||||
|
|
||||||
class ConductorLocalComputeTaskAPITestCase(ConductorTaskAPITestCase):
|
|
||||||
"""Conductor LocalComputeTaskAPI Tests."""
|
|
||||||
def setUp(self):
|
|
||||||
super(ConductorLocalComputeTaskAPITestCase, self).setUp()
|
|
||||||
self.conductor = conductor_api.LocalComputeTaskAPI()
|
|
||||||
self.conductor_manager = self.conductor._manager._target
|
|
||||||
|
|
||||||
@mock.patch('nova.objects.Migration')
|
|
||||||
def test_live_migrate(self, migobj):
|
|
||||||
inst = fake_instance.fake_db_instance()
|
|
||||||
inst_obj = objects.Instance._from_db_object(
|
|
||||||
self.context, objects.Instance(), inst, [])
|
|
||||||
|
|
||||||
migration = migobj()
|
|
||||||
task = mock.MagicMock()
|
|
||||||
with mock.patch.object(self.conductor_manager,
|
|
||||||
'_build_live_migrate_task',
|
|
||||||
return_value=task) as mock_build_task:
|
|
||||||
self.conductor.live_migrate_instance(self.context, inst_obj,
|
|
||||||
'destination', 'block_migration', 'disk_over_commit',
|
|
||||||
async=False)
|
|
||||||
mock_build_task.assert_called_once_with(self.context, inst_obj,
|
|
||||||
'destination',
|
|
||||||
'block_migration',
|
|
||||||
'disk_over_commit',
|
|
||||||
migration, None)
|
|
||||||
task.execute.assert_called_once()
|
|
||||||
self.assertEqual('accepted', migration.status)
|
|
||||||
self.assertEqual('destination', migration.dest_compute)
|
|
||||||
self.assertEqual(inst_obj.host, migration.source_compute)
|
|
||||||
|
|
||||||
@mock.patch('nova.objects.Migration')
|
|
||||||
def test_live_migrate_async(self, migobj):
|
|
||||||
inst = fake_instance.fake_db_instance()
|
|
||||||
inst_obj = objects.Instance._from_db_object(
|
|
||||||
self.context, objects.Instance(), inst, [])
|
|
||||||
|
|
||||||
migration = migobj()
|
|
||||||
task = mock.MagicMock()
|
|
||||||
with mock.patch.object(self.conductor_manager,
|
|
||||||
'_build_live_migrate_task',
|
|
||||||
return_value=task) as mock_build_task:
|
|
||||||
self.conductor.live_migrate_instance(self.context, inst_obj,
|
|
||||||
'destination', 'block_migration', 'disk_over_commit',
|
|
||||||
async=True)
|
|
||||||
mock_build_task.assert_called_once_with(self.context, inst_obj,
|
|
||||||
'destination',
|
|
||||||
'block_migration',
|
|
||||||
'disk_over_commit',
|
|
||||||
migration, None)
|
|
||||||
task.execute.assert_called_once()
|
|
||||||
self.assertEqual('accepted', migration.status)
|
|
||||||
self.assertEqual('destination', migration.dest_compute)
|
|
||||||
self.assertEqual(inst_obj.host, migration.source_compute)
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
The ''use_local'' option, which made it possible to
|
||||||
|
perform nova-conductor operations locally, has been
|
||||||
|
removed. This legacy mode was introduced to bridge a
|
||||||
|
gap during the transition to the conductor service.
|
||||||
|
It no longer represents a reasonable alternative for
|
||||||
|
deployers.
|
Loading…
Reference in New Issue
Block a user