1. 程式人生 > >ONOS程式設計系列(二)命令列命令與服務開發

ONOS程式設計系列(二)命令列命令與服務開發

此文章承接ONOS程式設計系列(一) Application Tutorial ,如果尚未看過上一篇,請先看完上一篇,再回過頭來看此篇。
本文章的目的在於讓讀者明白:

  • 如何將新建的application擴充套件為新的服務,以便其他服務或者應用可以呼叫它
  • 如何將該application的功能擴充套件為Karaf命令列介面下的一個新命令

我們假設你已經安裝並且能初步掌握Mininet,因為後面的測試工作需要用到它。

專案架構

ONOS程式設計系列(二)圖1

一、擴充套件為服務

1.1 定義服務介面

首先,在onos-api包下定義一個新的服務的介面,該包目錄是${ONOS_ROOT}/core/api/src/main/java/org/onosproject/net/。在此目錄下,建立一個新資料夾apps/,作為新介面的位置。介面檔案放在此處的意義在於只有這樣cli的包才能訪問到它,而cli包正是實現命令列命令的包。

ONOS程式設計系列(二)圖2 ONOS程式設計系列(二)圖3

1.2 匯入服務介面

接下來,我們會在IntentReactiveForwarding檔案中實現該服務介面。

ONOS程式設計系列(二)圖4

在本教程中我們用不到該應用生成的服務,不過如果要呼叫該服務,只需要這樣既可:

ONOS程式設計系列(二)圖5

1.3 實現該服務介面

要實現該服務介面,我們向類IntentReactiveForwarding增加了新的Map,endPoints成員變數。Map成員在process()方法中用來儲存HostService提供的終端資訊。

ONOS程式設計系列(二)圖6 ONOS程式設計系列(二)圖7

現在,一個引用了ForwardingMapService的模組就可以通過呼叫getEndPoints()方法獲取能夠雙向通訊的終端列表了,這些終端上都安裝了本模組的intents。

接下來,建立一個新的Karaf CLI命令來使用這個新的服務。該命令的動能是列出map的內容,並且可選地提供一個過濾引數,來過濾主機源的地址。

二、建立karaf的一個新命令

Karaf CLI命令定義在專案目錄${ONOS_ROOT}/cli/之下。有兩種型別的命令,分別在不同的目錄下:

  • ${ONOS_ROOT}/cli/src/main/java/org/onosproject/cli 系統配置與監視相關的命令所在目錄
  • ${ONOS_ROOT}/cli/src/main/java/org/onosproject/cli/net 網路配置與監視相關的命令所在目錄

我們要建立的命令要顯示網路相關的資訊,所以我們要在第二個目錄下增加我們的command類。

2.1 新建一個command類

在第二個目錄下,建立一個名為ForwardingMapCommand的類檔案。該類是AbstractShellCommand的子類,在類中要使用命令相關的一些註解:

  • @Command 該註解用來設定命令的名字,作用範圍以及功能描述
  • @Argument 該註解用來指定命令的引數

該檔案內容如下:

ONOS程式設計系列(二)圖8

2.2 建立command類與新服務的關係

接下來,要實現該類繼承自介面的方法execute(),以實現相關功能。本例功能比較簡單,就是向之前生成的新服務請求終端map的資訊,如果命令帶引數,則做一層過濾。程式碼實現如下:

ONOS程式設計系列(二)圖9

2.3 註冊這個command,使其能在karaf CLI下使用

接下來,我們需要編輯shell-config.xml檔案,該檔案位於${ONOS_ROOT}/cli/src/main/resources/OSGI-INF/blueprint/,其作用是告訴karaf有新的命令加入了。編輯格式是在裡面填上我們的命令的相關資訊:

ONOS程式設計系列(二)圖10

三、驗證

3.1 重編譯,重啟動ONOS

一切修改完畢之後,進入onos根目錄重新編譯,編譯成功之後執行onos:

ONOS程式設計系列(二)圖11

進入歡迎介面之後,可以鍵入“fwdmap --help”檢視我們新建命令的描述:

ONOS程式設計系列(二)圖12

3.2 啟動Mininet,構建測試網路

新開一個命令列介面,在此介面下開啟mininet(預設是本地啟動,所以ip是127.0.0.1):
sudomn --topo=tree,2,2 --controller=remote,ip=127.0.0.1 --mac
此時,在ONOS介面下可以看到四個終端,三個交換機:

ONOS程式設計系列(二)圖13

3.3 測試命令列

鍵入fwdmap,可以看到沒有什麼結果返回,因為這個時候網路中的主機之間還沒有進行通訊呢。

ONOS程式設計系列(二)圖14

切換到mininet控制介面,鍵入pingall,執行一次主機間的通訊。

ONOS程式設計系列(二)圖15

然後再切換回onos命令列,再次鍵入fwdmap命令:

ONOS程式設計系列(二)圖16

問題一

在onos命令列下鍵入fwdmap,如果出現以下結果:

ONOS程式設計系列(二)圖17

就要回頭看看IntentReactiveForwarding類前面有沒有加@Service註解了。

如果註解沒問題,那麼就有可能是當前並沒有安裝ifwd模組。用命令“feature:list -i | grepifwd”檢視當前是否安裝了ifwd模組,如果返回結果為空,則要手動安裝一下:feature:installonos-app-ifwd 。

問題二

在用mininet命令列下pingall以後,再次在onos下鍵入fwdma,如果還沒有任何輸出,可能就是原始碼哪裡又出了問題。

我下載到原始碼以後,切換版本到了onos-1.1,該版本下,本來就是有一個ifwd的專案的,不過比教程裡的東西要少一些。在手動敲入程式碼的時候,我大致略過了已有的程式碼,但是注意,教程裡的程式碼並非完全在原有程式碼基礎上進行的增加,在IntentReactiveForwarding檔案中,函式setUpConnectivity中,紅框框住的部分是原有的部分,藍框框住的部分是教程中的部分,可以看到,兩者還是有一點區別的:

ONOS程式設計系列(二)圖18

解決這個問題以後,再次走一遍流程,應該就能看到結果了吧。

尊重勞動成果,以上轉載自:http://www.sdnlab.com/10712.html