Ryu-OVSDB 被動管理

Neal發表於2019-02-16

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

相關文章