Add version 3.0 of conductor RPC interface
This commit adds a new major revision to the rpc interface used to talk to the conductor service. The old version will be retained in Liberty for Kilo rolling upgrade capability. 2.x can be dropped as soon as Mitaka development opens. When 2.x gets dropped, we will be able to remove the following methods from the conductor manager, as well as all other supporting code for these methods throughout the conductor: - instance_update() - instance_get_by_uuid() - instance_get_all_by_host() - migration_get_in_progress_by_host_and_node() - aggregate_host_add() - aggregate_host_delete() - aggregate_metadata_get_by_host() - bw_usage_update() - agent_build_get_by_triple() - block_device_mapping_update_or_create() - block_device_mapping_get_all_by_instance() - instance_get_all_by_filters() - instance_get_active_by_window() - instance_destroy() - instance_fault_create() - vol_usage_update() - service_get_all_by() - action_event_start() - action_event_finish() - service_create() - service_destroy() - compute_node_create() - compute_node_update() - compute_node_delete() - service_update() - task_log_get() - task_log_begin_task() - task_log_end_task() - notify_usage_exists() - security_groups_trigger_handler() - security_groups_trigger_members_refresh() - network_migrate_instance_start() - network_migrate_instance_finish() - quota_commit() - quota_rollback() - get_ec2_ids() - compute_unrescue() - object_class_action() - object_backport() Note that the client side will only send 3.0 messages, but that's fine. We expect the nova-conductor service to get updated at the same time as, or before anything that uses this client code. For more information on this type of change, see: https://wiki.openstack.org/wiki/RpcMajorVersionUpdates Related to blueprint liberty-bump-object-and-rpcapi-versions Change-Id: Ia976c7f3362df9d91b2e7d23f0465b8d57149714
This commit is contained in:
parent
410a4de45e
commit
ba1a35c41b
|
@ -95,6 +95,7 @@ class ConductorManager(manager.Manager):
|
|||
self.compute_task_mgr = ComputeTaskManager()
|
||||
self.cells_rpcapi = cells_rpcapi.CellsAPI()
|
||||
self.additional_endpoints.append(self.compute_task_mgr)
|
||||
self.additional_endpoints.append(_ConductorManagerV3Proxy(self))
|
||||
|
||||
@property
|
||||
def network_api(self):
|
||||
|
@ -904,3 +905,27 @@ class ComputeTaskManager(base.Base):
|
|||
on_shared_storage=on_shared_storage,
|
||||
preserve_ephemeral=preserve_ephemeral,
|
||||
host=host)
|
||||
|
||||
|
||||
class _ConductorManagerV3Proxy(object):
|
||||
|
||||
target = messaging.Target(version='3.0')
|
||||
|
||||
def __init__(self, manager):
|
||||
self.manager = manager
|
||||
|
||||
def provider_fw_rule_get_all(self, context):
|
||||
return self.manager.provider_fw_rule_get_all(context)
|
||||
|
||||
def object_class_action_versions(self, context, objname, objmethod,
|
||||
object_versions, args, kwargs):
|
||||
return self.manager.object_class_action_versions(
|
||||
context, objname, objmethod, object_versions, args, kwargs)
|
||||
|
||||
def object_action(self, context, objinst, objmethod, args, kwargs):
|
||||
return self.manager.object_action(context, objinst, objmethod, args,
|
||||
kwargs)
|
||||
|
||||
def object_backport_versions(self, context, objinst, object_versions):
|
||||
return self.manager.object_backport_versions(context, objinst,
|
||||
object_versions)
|
||||
|
|
|
@ -189,6 +189,9 @@ class ConductorAPI(object):
|
|||
* 2.3 - Add object_class_action_versions()
|
||||
* Remove compute_node_create()
|
||||
* Remove object_backport()
|
||||
|
||||
* 3.0 - Drop backwards compatibility
|
||||
|
||||
"""
|
||||
|
||||
VERSION_ALIASES = {
|
||||
|
@ -201,7 +204,7 @@ class ConductorAPI(object):
|
|||
|
||||
def __init__(self):
|
||||
super(ConductorAPI, self).__init__()
|
||||
target = messaging.Target(topic=CONF.conductor.topic, version='2.0')
|
||||
target = messaging.Target(topic=CONF.conductor.topic, version='3.0')
|
||||
version_cap = self.VERSION_ALIASES.get(CONF.upgrade_levels.conductor,
|
||||
CONF.upgrade_levels.conductor)
|
||||
serializer = objects_base.NovaObjectSerializer()
|
||||
|
@ -218,24 +221,16 @@ class ConductorAPI(object):
|
|||
# operations, which will use the new class action handler.
|
||||
def object_class_action(self, context, objname, objmethod, objver,
|
||||
args, kwargs):
|
||||
if self.client.can_send_version('2.3'):
|
||||
# NOTE(danms): If we're new enough, collect the object
|
||||
# version manifest and redirect the call to the newer
|
||||
# class action handler
|
||||
versions = ovo_base.obj_tree_get_versions(objname)
|
||||
return self.object_class_action_versions(context,
|
||||
objname,
|
||||
objmethod,
|
||||
versions,
|
||||
args, kwargs)
|
||||
cctxt = self.client.prepare()
|
||||
return cctxt.call(context, 'object_class_action',
|
||||
objname=objname, objmethod=objmethod,
|
||||
objver=objver, args=args, kwargs=kwargs)
|
||||
versions = ovo_base.obj_tree_get_versions(objname)
|
||||
return self.object_class_action_versions(context,
|
||||
objname,
|
||||
objmethod,
|
||||
versions,
|
||||
args, kwargs)
|
||||
|
||||
def object_class_action_versions(self, context, objname, objmethod,
|
||||
object_versions, args, kwargs):
|
||||
cctxt = self.client.prepare(version='2.3')
|
||||
cctxt = self.client.prepare()
|
||||
return cctxt.call(context, 'object_class_action_versions',
|
||||
objname=objname, objmethod=objmethod,
|
||||
object_versions=object_versions,
|
||||
|
@ -247,7 +242,7 @@ class ConductorAPI(object):
|
|||
objmethod=objmethod, args=args, kwargs=kwargs)
|
||||
|
||||
def object_backport_versions(self, context, objinst, object_versions):
|
||||
cctxt = self.client.prepare(version='2.2')
|
||||
cctxt = self.client.prepare()
|
||||
return cctxt.call(context, 'object_backport_versions', objinst=objinst,
|
||||
object_versions=object_versions)
|
||||
|
||||
|
|
|
@ -2066,3 +2066,24 @@ class ConductorLocalComputeTaskAPITestCase(ConductorTaskAPITestCase):
|
|||
super(ConductorLocalComputeTaskAPITestCase, self).setUp()
|
||||
self.conductor = conductor_api.LocalComputeTaskAPI()
|
||||
self.conductor_manager = self.conductor._manager._target
|
||||
|
||||
|
||||
class ConductorV3ManagerProxyTestCase(test.NoDBTestCase):
|
||||
def test_v3_manager_proxy(self):
|
||||
manager = conductor_manager.ConductorManager()
|
||||
proxy = conductor_manager._ConductorManagerV3Proxy(manager)
|
||||
ctxt = context.get_admin_context()
|
||||
|
||||
methods = [
|
||||
# (method, number_of_args)
|
||||
('provider_fw_rule_get_all', 0),
|
||||
('object_class_action_versions', 5),
|
||||
('object_action', 4),
|
||||
('object_backport_versions', 2),
|
||||
]
|
||||
|
||||
for method, num_args in methods:
|
||||
args = range(num_args)
|
||||
with mock.patch.object(manager, method) as mock_method:
|
||||
getattr(proxy, method)(ctxt, *args)
|
||||
mock_method.assert_called_once_with(ctxt, *args)
|
||||
|
|
Loading…
Reference in New Issue