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:
Hans Lindgren 2015-03-22 20:36:45 +01:00
parent 410a4de45e
commit ba1a35c41b
3 changed files with 58 additions and 17 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)