如何优雅的阅读openstack源代码?

基础不是那种特别特别牛逼的人, 要做社区开发,模仿其他组件造个轮子。 目标是模仿heat/nova/keystone写web服务,组件很复杂非常懵逼,如何优雅的阅读openstack源代码?
关注者
139
被浏览
8,475
由于Openstack使用python,python是动态类型语言,参数类型不容易从代码中看出,因此个人建议首先需要部署一个单节点Openstack环境,建议使用RDO:Packstack quickstart,当然乐于折腾使用devstack也是没有问题的。

其次需要安装科学的代码阅读工具,图形界面使用pycharm没有问题,不过通常在虚拟机中是没有图形界面的,首选vim,需要简单的配置使其支持代码跳转和代码搜索,可以参考GitHub - int32bit/dotfiles: A set of vim, zsh, git, and tmux configuration files.

在阅读源码之前,首先得了解Openstack代码的架构,至少得知道所有服务的入口,以nova为例,所有的服务入口都是nova-api,对应代码:nova/api/openstack/compute,其中云主机生命周期管理通常在nova/api/openstack/compute/servers.py下,因此不管执行什么操作,首先在这个目录入手。其次需要知道nova模块的命名原则:
  1. api.py是供其它组件调用的接口,比如nova/api/openstack/compute/servers.py紧接着调用nova/compute/api.py
  2. rpcapi.py是RPC Client库,用于封装RPC调用
  3. manager.py是所有RPC服务端代码入口,也是核心功能的实现部分,如果你想了解reboot是怎么实现的,又不被乱七八糟的RPC调用和模块调用所累,可以直接看nova/compute/manager.py,从中可以发现它怎么调用libvirt实现虚拟机重启的。
最后毫无疑问需要掌握python的调试技巧,推荐pdb、ipdb、ptpdb,其中ptpdb最好用,不过需要手动安装。打断点前需要注意代码执行时属于哪个服务组件,并不是在nova/compute目录就是nova-compute服务运行,比如nova-api服务会调用nova/compute/api.py,但仍属于nova-api服务。在发起RPC调用前,永远不可能发生服务进程转化。通常nova/xxx/api.py、nova/xxx/rpcapi.py仍是在调用方执行,而nova/xxx/manager.py一定在nova-xxx服务运行。另外需要注意打了断点后的服务必须在前端运行,不能在后台运行,比如我们在nova/compute/manager.py中打了断点,我们需要kill掉后台进程:
systemctl stop openstack-nova-compute
然后直接在终端运行nova-compute即可。

本人阅读源码时顺便整理了下nova的操作序列图,可供参考GitHub - int32bit/openstack-workflow: Openstack Sequence Diagrams

以上是本人阅读源码的方式,仅供参考!