ONOS 提供了自動部屬 Mininet 環境的功能,方便大家進行測試。
再使用之前首先需要定義好需要使用的 Mininet 腳本以及要給 ONOS 看的 python 以及 recipe 檔案,另外,也需要撰寫一個相同名稱的 json 檔案,用於 network config。
以 VPLS 為例,假設我需要一個 5 個不同 VLAN ID 的 Host,包含 10 條 Link(5條雙向 Link)以及 4 個 Switch。
Mininet Script 如下:
#!/usr/bin/env python
from mininet.cli import CLI
from mininet.node import Link, Host
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.term import makeTerm
from mininet.topo import Topo
from functools import partial
class VLANHost( Host ):
"Host connected to VLAN interface"
def config( self, vlan=100, **params ):
"""Configure VLANHost according to (optional) parameters:
vlan: VLAN ID for default interface"""
r = super( VLANHost, self ).config( **params )
intf = self.defaultIntf()
# remove IP from default, "physical" interface
self.cmd( 'ifconfig %s inet 0' % intf )
# create VLAN interface
self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
# assign the host's IP to the VLAN interface
self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
# update the intf name and host's intf map
newName = '%s.%d' % ( intf, vlan )
# update the (Mininet) interface to refer to VLAN interface name
intf.name = newName
# add VLAN interface to host's name to intf map
self.nameToIntf[ newName ] = intf
return r
class VplsTopo(Topo):
''' VPLS demo Topology '''
def __init__(self):
Topo.__init__(self)
s1 = self.addSwitch('s1')
s2 = self.addSwitch('s2')
s3 = self.addSwitch('s3')
s4 = self.addSwitch('s4')
v100h1 = self.addHost('v100h1', cls=VLANHost, vlan=100, mac='00:00:00:00:00:01')
v200h1 = self.addHost('v200h1', cls=VLANHost, vlan=200, mac='00:00:00:00:00:02')
v300h1 = self.addHost('v300h1', cls=VLANHost, vlan=300, mac='00:00:00:00:00:03')
v400h1 = self.addHost('v400h1', cls=VLANHost, vlan=400, mac='00:00:00:00:00:04')
self.addLink(s1, v100h1, port1=1, port2=0)
self.addLink(s2, v200h1, port1=1, port2=0)
self.addLink(s3, v300h1, port1=1, port2=0)
self.addLink(s4, v400h1, port1=1, port2=0)
self.addLink(s1, s4)
self.addLink(s1, s2)
self.addLink(s2, s4)
self.addLink(s2, s3)
self.addLink(s3, s4)
topos = { 'vpls': ( lambda: VplsTopo() ) }
if __name__ == '__main__':
from onosnet import run
run(VplsTopo())
Receipt 中定義了預期的結果,例如 switch, host 以及 link 數量:
# Default VPLS topology recipe
export OTD=4 # ONOS Topology Devices
export OTL=10 # ONOS Topology Links
export OTH=4 # ONOS Topology Hosts
Receipt 中所定義的環境變數會給 onos-check-summary 這一支 script 使用,他會遠端操作 ONOS 去檢查 ONOS 是否正確抓到網路拓撲資料。
最後是 network config 的部份,json 文件中可以只寫一個空的 json,這樣就不會有任何設定,不過也可以先設定好每一個裝置的資料,如座標,名稱等。
{
"devices": {
"of:0000000000000001": { "basic": { "name": "s1", "latitude": 37.7576793, "longitude": -122.5076405 }},
"of:0000000000000002": { "basic": { "name": "s2", "latitude": 34.0502337, "longitude": -118.3263353 }},
"of:0000000000000003": { "basic": { "name": "s3", "latitude": 38.9082909, "longitude": -77.0886051 }},
"of:0000000000000004": { "basic": { "name": "s4", "latitude": 30.2787717, "longitude": -82.3069047 }}
},
"hosts": {
"00:00:00:00:00:01/100": { "basic": { "location": "of:0000000000000001/1", "ips": [ "10.0.0.1" ], "name": "v100h1", "latitude": 37.7576793, "longitude": -125.0076405 }},
"00:00:00:00:00:02/200": { "basic": { "location": "of:0000000000000002/1", "ips": [ "10.0.0.2" ], "name": "v200h1", "latitude": 34.0502337, "longitude": -120.8263353 }},
"00:00:00:00:00:03/300": { "basic": { "location": "of:0000000000000003/1", "ips": [ "10.0.0.3" ], "name": "v300h1", "latitude": 38.9082909, "longitude": -74.5886051 }},
"00:00:00:00:00:04/400": { "basic": { "location": "of:0000000000000004/1", "ips": [ "10.0.0.4" ], "name": "v400h1", "latitude": 30.2787717, "longitude": -79.8069047 }}
}
}
將上述 vpls.py vpls.json vpls.receipt 放到 onos/tools/test/topos 裡面即可。
接著,需要設定 deployment host 的 cell
export ONOS_NIC=10.100.198.*
export OCI="10.100.198.10"
export OC1="10.100.198.10"
export OCN="10.100.198.10"
export ONOS_APPS="drivers,openflow"
export ONOS_USER="sdndstw"
export ONOS_GROUP="sdndstw"
export ONOS_TOPO="vpls"
OCN 是我們預計要執行 mininet 的機器,要注意的是該機器必須要能夠透過 ONOS_USER 所設定的使用者透過 ssh 的方式連進去。
最後透過 stc 啟動即可部屬 minine(包含檢查):
$ stc setup && stc net-setup
要使用 mininet 的方法如下:
首先先登入 mininet 所在的主機中
$ ssh $ONOS_USER@$OCN
接著透過 screen 指令找到 mininet 的 session
$ screen -list
There is a screen on:
7503.mininet (10/21/2016 10:24:25 PM) (Detached)
1 Socket in /var/run/screen/S-sdndstw.
找到 session 名稱後進入即可使用 mininet
$ screen -r 7503.mininet