移除 RPC API 兼容层

https://blueprints.launchpad.net/neutron/+spec/drop-rpc-compat

本提案旨在让 Neutron 在整个系统中更直接地使用 oslo.messaging API,而不是基于旧 API 的兼容层。

问题描述

Neutron 已经从 oslo-incubator 中的 rpc 代码迁移到 oslo.messaging 库。oslo.messaging 库具有不同的(但更好的)API。为了方便过渡到 oslo.messaging,Neutron 使用了一些兼容代码,将旧风格的 API 使用转换为 oslo.messaging API。本提案旨在让 Neutron 在整个系统中更直接地使用 oslo.messaging API。

朝着更直接使用 oslo.messaging API 的方向发展将提高与其他项目的兼容性,因为所有项目都应该收敛到更新的 API 风格。

提议的变更

以下类被认为是兼容层的一部分。对这些类的直接使用将被移除,并替换为对等效的底层 oslo.messaging API 的直接使用。

neutron.common.rpc。

RpcProxy RpcCallback RPCException RemoteError MessagingTimeout

这看起来是一个小的列表,但实际上比看起来更具侵入性。它将被分解为几个迭代补丁,以便更容易地审查和合并。

以下是一些最具侵入性的转换示例(RpcProxy 和 RpcCallback)

from oslo import messaging

from neutron.common import rpc as n_rpc

使用 RpcProxy 的旧风格客户端接口

class ClientAPI(n_rpc.RpcProxy):

    BASE_RPC_API_VERSION = '1.0'

    def __init__(self, topic):
        super(DhcpPluginApi, self).__init__(
            topic=topic, default_version=self.BASE_RPC_API_VERSION)

    def remote_method(self, context, arg1):
        return self.call(context,
                         self.make_msg('remote_method',
                                       arg1=arg1))

    def remote_method_2(self, context, arg1, arg2):
        return self.call(context,
                         self.make_msg('remote_method_2',
                                       arg1=arg1, arg2=arg2),
                         version='1.1')

新风格客户端接口

class ClientAPI(object):

    def __init__(self, topic):
        target = messaging.Target(topic=topic, version='1.0')
        self.client = n_rpc.get_client(target)

    def remote_method(self, context, arg1):
        cctxt = self.client.prepare()
        return cctxt.call(context, 'remote_method', arg1=arg1)

    def remote_method_2(self, context, arg1, arg2):
        cctxt = self.client.prepare(version='1.1')
        return cctxt.call(context, 'remote_method_2', arg1=arg1, arg2=arg2)

旧风格服务器接口

class ServerAPI(n_rpc.RpcCallback):

    RPC_API_VERSION = '1.1'

    def remote_method(self, context, arg1):
        return 'foo'

    def remote_method_2(self, context, arg1, arg2):
        return 'bar'

新风格服务器接口

class ServerAPI(object):

    target = messaging.Target(version='1.1')

    def remote_method(self, context, arg1):
        return 'foo'

    def remote_method_2(self, context, arg1, arg2):
        return 'bar'

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

可以忽略不计。从理论上讲,这是移除一个兼容层,因此应该减少代码量,但从整体来看,移除该层对性能的影响可以忽略不计。

IPv6 影响

其他部署者影响

开发人员影响

对开发人员有几个影响。习惯于旧 rpc API(以及等效兼容层)的开发人员需要学习不同之处。从概念上讲,它与新 API 非常相似,因此不应产生太大影响。oslo.messaging 库本身具有文档。查看所有已转换的代码也将非常有帮助,因为您可以遵循现有的模式。

另一个影响是补丁冲突。由于这项工作涉及对整个树进行一些小的重构,因此可能会与其他正在进行的代码发生冲突。这仅会在修改 rpc API 的功能中发生。更改将以一系列较小的更改完成,这将有助于重新定位和修复冲突。

社区影响

无。

备选方案

另一种选择是保留兼容层。这样做弊端在于,Neutron 对 oslo.messaging 的使用将越来越偏离 OpenStack 消息传递的其余部分。它也可能使以后利用 oslo.messaging 中的新功能更加困难。

实现

负责人

主要负责人

russellb

工作项

所提议更改部分中列出的每个类的使用都将逐个移除。每次移除都将分解为几个更改,每个接口(rpc API)一个。

依赖项

测试

将根据需要更新单元测试。将在关键位置添加新的单元测试,以弥补可能缺失的单元测试覆盖率。

这里没有功能性更改,因此将依赖所有现有的单元测试和功能测试来帮助确保不会引入回归。

Tempest 测试

无。

功能测试

无。

API 测试

无。

文档影响

无。

用户文档

无。

开发人员文档

无。

参考资料