如何優雅的閱讀openstack源代碼?

基礎不是那種特別特別牛逼的人, 要做社區開發,模仿其他組件造個輪子。

目標是模仿heat/nova/keystone寫web服務,組件很複雜非常懵逼,如何優雅的閱讀openstack源代碼?


由於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

以上是本人閱讀源碼的方式,僅供參考!


謝葯

當成java來看比較好?似乎openstack的python代碼寫的一股強烈的java即視感.


你是要寫新的openstack組件還是只是參照架構?如果是前者,推薦先搞懂幾個oslo庫 olso.sevice db config messaging log。再加上幾個常用的第三方庫,如paste等。然後從每個模塊的cmd目錄入手,串幾遍就差不多了,其實你只要搞懂nova,其他模塊都是舉一反三的樣子。


我喜歡粗暴點,直接打print跑起來看啊


這個是創建流程,源碼分析的不錯openstack源碼解析之虛機創建


一位前華為工程師的博客裡面轉的東西

(轉)如何學習開源項目


推薦閱讀:

python內置的hash函數對於字元串來說,每次得到的值不一樣?
學習編程的時候不會那些數學題還可以繼續學嗎?
python如何才能批量生成函數呢?函數名分別等於一個list里的每個元素~?
為什麼要學習Python?
如果每天堅持用12個小時學習一門編程語言,一年下來,編程能力會達到什麼程度?

TAG:Python | 源代碼 | OpenStack | 開源社區 |