鑑於不知道Neutron的人也不會看這篇文章,而知道的人也不用我再囉嗦Neutron是什麼東西,我決定跳過Neutron簡介,直接爆料。python
首先要介紹一下個人開發環境。我沒有使用DevStack,而是直接在電腦上安裝了三個Virtual Box,而後根據OpenStack的Ubuntu 安裝指南部署了一個環境:一個控制節點,一個網絡節點和一個計算節點。接下來我會直接在控制節點上修改 <your path>/neutron/ 下面的文件,而後經過重啓neutron 的各個service來更新個人修改。若是使用DevStack的話估計和個人狀況也差不太多。api
那個人neutron在安裝完以後的完整路徑是 /usr/lib/python2.7/dist-packages/neutron。neutron下的文件結構以下:網絡
- neutron/ - agent/ - api/ - cmd/ - common/ - db/ - debug/ - extensions/ - locale/ - notifiers/ - openstack/ - plugins/ - scheduler/ - server/ - services/ - manager.py - neutron_plugin_base_v2.py - service.py - wsgi.py - ...
其中,本身寫的plugin就會放在plugins/ 下面,而neutron_plugin_base_v2.py中定義了一個plugin應該實現的最小的API集合。其餘還有一些在extensions/ 和db/ 下面的文件也比較重要,會在接下來的一些文章中提到。最後省略了一些目前我沒有特別用到的文件。python2.7
若是有人對Neutron如何加載plugin感興趣,能夠再manager.py中加一些斷點用pdb進行debug。它裏面有一個class叫NeutronManager, 在初始化過程當中有一個語句加載了plugin:plugin_provider = cfg.CONF.core_plugin。具體debug方法能夠參考Yong Sheng Gong的一個ppt,連接在這裏:http://www.slideshare.net/gongys2004/inside-neutron-2ide
好,如今咱們就要開始實現本身的plugin了。spa
第一步就是在plugins下面建立本身的文件夾和一些文件:.net
- neutron - plugins - myplugin - __init__.py - plugin.py
上述兩個文件是最基本的,固然plugin.py也能夠用不一樣的名字。可是__init__.py的名字是不能改的,這個用來告訴Python myplugin能夠看作是一個module。plugin.py裏面能夠先定義一個基本空的class 叫作MyPlugin,雖然如今這個plugin什麼用都沒有。debug
from neutron.db import db_base_plugin_v2 from neutron.openstack.common import log LOG = log.getLogger(__name__) class MyPlugin(db_base_plugin_v2.NeutronDbPluginV2): def __init__(self): LOG.info("MyPlugin is started.")
代碼中出現的 neutron.db 和 neutron.openstack.common 我會在以後的章節中提到。如今暫時不用去管它們。 code
第二步,搞定plugin.py以後就要想辦法在Neutron裏註冊一下這個plugin,這樣Neutron啓動的時候就會認識這個plugin而且知道怎麼加載它。這時候須要找到一個entry_points.txt文件。它不在以前咱們提到的那個neutron大文件夾下面,而是在與之平行的一個neutron egg info 文件夾下。具體在個人環境中:server
- neutron - neutron-2014.1.egg-info - entry_points.txt
在這個文件中,有一個選項是[neutron.core_plugins],全部的註冊的core_plugins都在裏面。在它下面咱們能夠本身加一行:
myplugin = neutron.plugins.myplugin.plugin:MyPlugin
而後在 /etc/neutron/neturon.conf 中有一個選項是[DEFAULT],在它下面有一行用來設置core plugin:
core_plugin = myplugin
若是沒有找到entry_points.txt這個文件的話,聽說另一個辦法就是直接在 neutron.conf 中指明這個plugin:
core_plugin = neutron.plugins.myplugin.plugin.MyPlugin
不過這個方法我沒有嘗試過。
作完這兩步以後再重啓一下neutron就搞定收工了。看一下/var/log/neutron/server.log,若是出現了咱們那行log信息的話就說明Neutron已經加載了咱們的什麼都幹不了的plugin了。
那麼plugin具體是怎麼實現的呢?請看下回分解。