怎樣寫 OpenStack Neutron 的 Plugin (一)

鑑於不知道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具體是怎麼實現的呢?請看下回分解。

相關文章
相關標籤/搜索