Ryu-OVSDB 被動管理
一、設定交換機為被動監聽模式
1.1檢視當前的配置
# Show current configuration
$ sudo ovs-vsctl get-manager
返回結果應該為:
ptcp:6640
1.2 對交換機設定為被動管理模式
被動管理模式設定:
# Set TCP listen address
$ sudo ovs-vsctl set-manager "ptcp:6640"
補充主動管理模式官網教程:http://ryu.readthedocs.io/en/latest/library_ovsdb_manager.html
- 控制器需要執行管理庫應用
- 交換機指定管理器為控制器的IP
可以使用1.1的檢視配置是否變化
二、控制器端應用
2.1 匯入 vsctl 模組
from ryu.lib.ovs import vsctl
2.2 獲取ovs交換機IP地址
可以通過交換機連線控制器時,根據datapath獲取交換機對應的IP地址。
舉個例子:通過監聽交換機與控制器連線後,獲取datapath 後讀取datapath.address :
@set_ev_cls(ofp_event.EventOFPStateChange,
[MAIN_DISPATCHER, DEAD_DISPATCHER])
def _state_change_handler(self, ev):
datapath = ev.datapath
print(datapath.address)
if ev.state == MAIN_DISPATCHER:
if not datapath.id in self.datapaths:
self.logger.debug(`Register datapath: %016x`, datapath.id)
self.datapaths[datapath.id] = datapath
elif ev.state == DEAD_DISPATCHER:
if datapath.id in self.datapaths:
self.logger.debug(`Unregister datapath: %016x`, datapath.id)
del self.datapaths[datapath.id]
結果為:
(`交換機的IP地址`,埠號)
如果採用的是Mininet模擬拓撲,那麼得到的地址:(`mininet虛擬機器的IP地址`, 埠號)
2.3 建立vsctl例項物件
OVSDB_ADDR = `tcp:127.0.0.1:6640`
ovs_vsctl = vsctl.VSCtl(OVSDB_ADDR)
2.4 編寫命令
等同於 $ ovs-vsctl show 作用:
command = vsctl.VSCtlCommand(`show`)
ovs_vsctl.run_command([command])
執行完run_command,結果返回到command
可以:print(command) 檢視執行結果
2.5 驗證
① 建立一個test_ovsdb.py,貼上進官網提供的程式碼:
from ryu.lib.ovs import vsctl
OVSDB_ADDR = `tcp:127.0.0.1:6640`
ovs_vsctl = vsctl.VSCtl(OVSDB_ADDR)
# Equivalent to
# $ ovs-vsctl show
command = vsctl.VSCtlCommand(`show`)
ovs_vsctl.run_command([command])
print(command)
# >>> VSCtlCommand(args=[],command=`show`,options=[],result=`830d781f-c3c8-4b4f-837e-106e1b33d058
ovs_version: "2.8.90"
`)
# Equivalent to
# $ ovs-vsctl list Port s1-eth1
command = vsctl.VSCtlCommand(`list`, (`Port`, `s1-eth1`))
ovs_vsctl.run_command([command])
print(command)
# >>> VSCtlCommand(args=(`Port`, `s1-eth1`),command=`list`,options=[],result=[<ovs.db.idl.Row object at 0x7f525fb682e8>])
print(command.result[0].name)
# >>> s1-eth1
遇到如列印的訊息是 u’’,可以採用encode(‘utf-8’)
如:print(command.result[0].encode(‘utf-8‘))官網 OVSDB 庫:
http://ryu.readthedocs.io/en/latest/library_ovsdb.html
② mininet 建立拓撲
sudo mn --topo=linear,3 —-controller=remote
生成一個三個交換機三個主機的拓撲
③ 執行 test_ovsdb.py
sudo python test_ovsdb.py
可以把程式碼寫進需要使用的Ryu應用中
三、vsctl.py 解析
class ryu.lib.ovs.vsctl.VSCtl(remote)
Open vSwitch instance.
run_command(commands, timeout_sec=None, exception=None)
執行命令&傳送OVSDB 訊息
vsctl.py的vsctl類中的方法
_run_command(self, commands)
列舉了可用的命令
timeout_sec:如果指定了,超時引發異常
exception:如果指定了,將使用給定異常類包裝異常
Retruns None but fills result attribute for each command instance.
class ryu.lib.ovs.vsctl.VSCtlCommand(command,args = None,options = None )
- command指定命令ovs-vsctl。
- args 指定給定命令的引數列表或元組。
- options指定給定命令的選項列表或元組。請注意,並非所有選項ovs-vsctl都受支援。例如,–id尚不支援選項。本課程支援以下內容。
–may-exist: 給定埠已存在時什麼都不做。支援的命令是add-port和 add-bond
–fake-iface:將埠建立為虛假介面。支援的命令是add-bond
–must-exist: 如果給定埠不存在,則引發異常。支援的命令是del-port
—-with-iface: 對具有相同名稱的介面生效。支援的命令是del-port
–if-exists: 找不到時忽略異常。支援的命令是get
ryu.lib.ovs.vsctl.valid_ovsdb_addr(addr)
如果 OVSDB 服務地址正確返回True,否則返回False
有效的地址如下:
- unix:file
- tcp:ip:port
- ssl:ip:port
四、可用的命令
4.1 檢視交換機所連的控制器
command = vsctl.VSCtlCommand(`get-controler`, ("s1", ))
ovs_vsctl.run_command([command])
4.2 設定交換機所連的控制器
如下所示,設定交換機連線控制器C1(192.168.59.150),C2(192.168.59.151)
command = vsctl.VSCtlCommand(`set-controller`, ("s1","tcp:192.168.59.150:6653","tcp:192.168.59.151"))
ovs_vsctl.run_command([command])
詳細怎麼更改可以參照ovs-vsctl的命令對照著改
ovs-vsctl 命令:https://blog.csdn.net/x_i_y_u_e/article/details/55105438