NeutronDevelopment
目录
在开始编写代码之前
在自己开发插件之前,请确保您了解 OpenStack Networking (Neutron [以前称为 Quantum]) 的工作原理,方法是阅读 OpenStack Networking 管理指南 并提出问题。
然后尝试使用 devstack 运行它。以下是如何使用 devstack 运行 OpenStack Networking 的一个示例:NeutronDevstack
订阅 openstack-dev 邮件列表。发送到此列表的关于 OpenStack Network 的邮件的主题行应以 "[Neutron]" 开头。
您还需要处理一些 OpenStack 范围内的要求,这些要求在 HowToContribute 中描述。特别是
- 签署贡献者许可协议 (https://wiki.openstack.org/CLA)
- 获取 launchpad 帐户非常重要 (http://launchpad.net)
如果您感觉很冒险,可以注册以查看流入 Neutron 的错误集 + 更改
- 订阅 neutron 错误邮件:https://bugs.launchpad.net/neutron/+subscribe
- 注册以查看对 openstack/neutron 和 openstack/python-neutron 项目提出的更改:https://review.openstack.org/#/settings/projects
在尝试提交您的第一个补丁之前,请详细了解补丁提交和审查流程 (开发者指南) 并阅读 Neutron HACKING 文档
成为一名优秀的 Neutron 开发者(以及成为核心开发者)
优秀的开发者编写高质量的代码,并通过提供对 Neutron 提出的其他代码的有用且一致的审查来帮助维护 Neutron 代码库的质量。
优秀的 OpenStack Network 团队成员会定期参加团队会议,会议在 IRC 上举行(周一 UTC 21:00 和周二 UTC 14:00 在 freenode 上的 #openstack-meeting 频道:Neutron Team Meeting)。这些团队会议用于我们检查关键社区交付物的进度、识别关键审查并解决可能阻碍前进的设计差异。
优秀的 OpenStack Network 团队成员还会参与邮件列表中的 neutron 讨论,监控和修复开放的错误,并帮助监控邮件列表和 Launchpad 以帮助回答有关 neutron 的问题。您可以在这里注册为“答案联系人”:https://answers.launchpad.net/neutron/
那些因其努力和技能审查代码而赢得 OpenStack Networking 社区尊重的个人可以成为“核心开发者”。核心开发者是任何开源项目的核心。如果您想知道如何增加成为核心开发者的机会,我建议您查看 https://review.openstack.org/#/q/status:open+project:openstack/neutron,n,z 处的现有代码提交的审查。任何人都可以注册一个 launchpad 帐户进行审查,并且审查有助于其他核心成员了解您并评估您作为代码审查员的技能。您进行审查的每个项目至少会有两名其他核心开发者参与其中,因为需要两名核心开发者才能批准任何补丁。我还建议您确定一个或两个您可以参与的社区项目,以展示您对社区的承诺并帮助说服核心开发者您能够设计良好的代码(有关想法,请参见:https://wiki.openstack.org/NeutronStarterBugs)。
OpenStack Networking 社区的一般规则是,只要您尊重他人,就可以在电子邮件讨论、IRC 会议和代码审查期间与他人不同意。
提交第一次代码
开始使用 OpenStack Networking 的最佳方法可能是审查和测试 Neutron 的提议更改(将这些链接收藏起来)
- https://review.openstack.org/#/q/status:open+project:openstack/neutron,n,z
- https://review.openstack.org/#/q/status:open+project:openstack/python-neutronclient,n,z
审查将始终包括拉取 neutron 特定分支的命令以进行测试。因此,使用您的 devstack 设置(参见上方),拉取这些更改,确认它们按预期工作,然后审查代码(devstack 会将每个项目 git checkout 到 /opt/stack,因此您可以轻松地在 /opt/stack/neutron 中找到代码)。
下一步可以是尝试修复一个小的错误或添加一个测试用例。有关想法,请参见:NeutronStarterBugs。
在对代码进行任何更改后,请确保单元测试仍然可以干净地运行。
在从源代码运行代码时,请确保您知道如何运行单元测试,因为您需要在提交任何代码之前执行此操作
tox
执行 tox 将运行单元测试并检查样式合规性(pep8 + HACKING.rst),并且两者都必须通过才能接受上游代码。
仅运行单元测试
tox -e py27
仅运行样式合规性检查
tox -e pep8
最后,请参阅这些说明 OpenStack Gerritt Workflow 以了解如何提交代码以供审查和包含在 Neutron 中。
提出并实现一个功能
当现有实现需要重大更改时,或者正在考虑一个新功能时,它首先以 RFE(功能增强请求)的形式提出。有关更多信息,请参阅 DevRef:https://docs.openstack.org/developer/neutron/policies/blueprints.html
开发 Neutron 插件
如果您正在尝试启用 OpenStack 与新的网络交换技术的配合使用,那么您可能需要开发一个 Neutron 插件。您来对地方了。
什么是 Neutron 插件?
Neutron 向其他 OpenStack 服务(例如 Nova VM 的 vNIC)定义设备之间网络连接的逻辑 API。使用 API 描述的逻辑连接必须转换为对虚拟和/或物理交换机的实际配置。这就是 Neutron 插件发挥作用的地方。Neutron 插件能够与一种或多种类型的交换机通信,并根据 API 调用动态地重新配置交换机。
我需要编写哪些代码?
Neutron 代码库有一个 python API,该 API 对应于您必须实现才能成为 Neutron 插件的一组 API 调用。在源代码目录中,查看 neutron/neutron_plugin_base.py。
如果选择围绕 SQL 数据库构建插件,代码库通过提供一些有用的 sqlalchemy 绑定来存储逻辑 API 实体(网络、端口)来提供帮助。
一个插件通常包括代码以
- 存储有关当前逻辑网络配置的信息(例如 SQL 数据库)
- 确定并存储有关逻辑模型与物理网络之间的“映射”的信息(例如,选择 VLAN 来表示逻辑网络)。
- 与一种或多种类型的交换机通信,以根据实现该映射来配置它们。这可能采用在超visor 上运行的代理的形式,或者远程登录到交换机并重新配置它的代码。
此外,如果您的交换技术需要 nova-compute 以特殊方式创建 vNIC,则可能需要创建一个特殊的“vif-plugging”模块来与您的交换机一起使用。但是,考虑到现有的插件集,很可能已经存在您需要的 vif-plugging 类型。重要的是保持 vif-plugging 尽可能简单,以避免使 nova 具有网络细节。例如,您不应该将 VLAN ID 传递给 nova,而应该让 nova 创建基本设备,并让 neutron 插件代理负责设置到该 VLAN 的连接。
不应该需要修改任何其他 nova 代码,因为该代码仅使用在所有插件中相同的逻辑 Neutron API。
有用的下一步
- 阅读管理指南中的 Neutron 概述,以了解基本组件:https://docs.openstack.org/trunk/openstack-network/admin/content/ch_overview.html
- 浏览 Neutron API 指南,以了解每个插件必须实现的 API:https://docs.openstack.org/api/openstack-network/2.0/content/index.html
- 获取 Neutron 代码 (http://launchpad.net/neutron) 并根据管理指南运行它。
- 查看 neutron/plugins 目录中的现有插件,以了解插件在实践中是什么样子
- 查看 nova-compute vif-plugging 的示例。在 nova 代码库中,请参阅 nova/virt/libvirt/vif.py。
将插件添加到公共 Neutron 仓库
Neutron 插件可以是开源的或专有的。一些开源插件在主 Neutron 仓库 (http://www.github.com/openstack/neutron) 中维护,而另一些插件则在自己的单独仓库中维护。作为一个项目,我们鼓励将插件保留在主仓库中,原因有几个(更具凝聚力的开发者社区、插件之间的更好代码共享以及更统一的插件测试)。但是,我们还必须确保主仓库中的任何插件都得到良好维护。因此,任何在主仓库中的插件都必须至少有一名 neutron 核心开发团队的活跃成员愿意维护它。这可以通过让现有的核心开发者同意维护插件来实现,或者通过让插件的开发者之一成为核心开发者团队的成员来实现。
注意:成为核心开发者包括社区职责,而不仅仅是维护特定插件。这包括参加团队会议、每周至少 2-3 小时的代码审查,以及开发者将帮助社区的其他开发任务的期望。
注意:我们强烈建议您的初始插件提交仅关注核心 Neutron 插件功能,并且尽可能简单。这增加了您说服其他人成为维护者的机会,并且简化了初始审查(初始审查通常是最难的,因为提交者仍在学习 Neutron 编码/风格要求)。
插件常见问题解答
- 问:我可以同时运行多个插件吗?
- 答:否,对于给定的 Neutron API,一次只能运行一个插件。这是因为“插件”实际上是一段代码,用于“实现”特定的 API 调用。但是,即使有一个插件,也不意味着您只能与一种类型的交换机通信。一个“插件”可以有多个“驱动程序”,这些驱动程序可以与不同类型的交换机通信。例如,Cisco 插件与多种类型的交换机通信。没有正式的驱动程序接口,但我们鼓励人们以一种通用的方式编写与交换机通信的代码,以便其他插件可以利用它。“驱动程序”通常是能够与特定交换机型号或交换机系列通信的代码。“驱动程序”通常具有用于标准配置操作的方法,例如将端口置于特定 VLAN 中作为附件的结果。
答:是的,使用调用两个不同现有插件的代码的“元插件” (https://github.com/openstack/neutron/tree/master/neutron/plugins/metaplugin)
API 扩展
API 扩展允许插件扩展 Neutron API,以便公开更多信息。这些信息可能需要实现特定于特定插件的高级功能,或者在将其合并到官方 Neutron API 之前公开功能。
我们坚信,“提出”新官方 API 的正确方法是首先将其作为扩展公开。代码是一种非常具体的定义,编写代码和代码实现通常会暴露抽象讨论中可能没有出现的重要细节。
- 创建扩展
- 扩展文件应放置在 extensions 文件夹中,该文件夹位于:neutron/extensions。
- 扩展文件应该包含一个与文件名同名的类。该类应该实现扩展框架所需的契约。有关详细信息,请参阅 neutron/api/extensions.py 中的 ExtensionDescriptor 类。
- 要阻止扩展文件夹中的文件被加载为扩展,文件名应以 "_" 开头。有关扩展文件的示例,请查看 neutron/tests/unit/extensions/foxinsocks.py 中的 Foxinsocks 类。neutron/tests/unit/api/test_extensions.py 中的单元测试记录了您可以使用扩展的所有方式
- 将插件与扩展关联
- 插件可以通过 'supported_extension_aliases' 属性来宣传其支持的所有扩展。例如:
class SomePlugin:
...
supported_extension_aliases = ['extension1_alias',
'extension2_alias',
'extension3_alias']
Any extension not in this list will not be loaded for the plugin
- 插件的扩展接口(可选)。扩展可以通过扩展中的 'get_plugin_interface' 方法强制插件支持的接口。有关示例,请参阅 foxinsocks.py 中的 FoxInSocksPluginInterface。
Neutron 中有三种类型的扩展
- 资源在 API 中引入一个新的“实体”。在 Neutron 中,当前的实体是“网络”和“端口”。
- 动作扩展倾向于作用于资源的“动词”。例如,在 Nova 中,有一个“服务器”资源,以及该服务器资源上的“重建”动作: https://docs.openstack.org/cactus/openstack-compute/developer/openstack-compute-api-1.1/content/Rebuild_Server-d1e3538.html#d2278e1430 。核心 Neutron API 实际上不使用“动作”作为核心 API 的一部分,但扩展肯定可以使用。
- 请求扩展允许将新的值添加到现有的请求对象中。例如,如果您正在 POST 创建服务器,但想要为服务器对象添加一个新的 'widgetType' 属性。
查看 Foxinsox,以及使用它的测试可能在这里有所帮助: * neutron/tests/unit/extensions/foxinsocks.py * neutron/tests/unit/api/test_extensions.py
您还可以查看 neutron/extensions 中的其他扩展,甚至 nova/api/openstack/compute/contrib/ 中的 nova 扩展(这些在这里记录: http://nova.openstack.org/api_ext/index.html)
通常,最好的做法是找到另一个执行与您类似操作的扩展,然后将其用作模板。
如何调试 Neutron(以及其他 OpenStack 项目可能)
注意:这些说明未维护 - 请参阅 DEBUGGING.rst 以获取最新的说明和 HOWTO
由于大多数 OpenStack 项目共享相同的基础设施,以下发现可能对调试其他 OpenStack 项目有效。
以下是可以使用(或不能使用)来调试 Neutron 的工具列表。请将您的发现添加到列表中。
- Eclipse pydev - 免费。它有效!(感谢 gong yong sheng)。您需要修改 quantum-server 和 __init__.py,如下所示: 从:eventlet.monkey_patch() 到:eventlet.monkey_patch(os=False, thread=False)
- PyCharm - 商业版。它有效。
PyCharm (3.4.1) 在设置菜单下,在 Python Debugger 中启用“Gevent 兼容调试”。要调试 neutron-server Liberty 版本,请在 neutron.conf 中设置 api_workers = -1 以强制 neutron 对 API 处理使用单个 python 进程。
- Python pdb - 免费。它无需更改代码即可工作。但是,它是一个基于 CLI 的工具。如果可以,请选择其他工具。
- Wing IDE - 这是一个可以处理多线程 python 应用程序的商业 python IDE。它无需更改代码即可工作。
在 Linux 中开发
1. 创建一个虚拟机(无论您在操作系统上如何操作) 1. 登录到它。 1. 如果您有 HTTP 代理,请将其导出为 http_proxy - 这使得虚拟环境的重新创建更容易。 1. 安装开发依赖项
apt-get install python-dev python-virtualenv gityum install python-devel python-virtualenv git
1. 运行一些测试
./run_tests.sh