实验7:基于REST API的SDN北向应用实践

一、基本要求

 1.编写Python程序,调用OpenDaylight的北向接口实现以下功能

 1)利用Mininet搭建拓扑,并连接OpenDaylight

OpenDaylight连接拓扑

 2)下发指令删除s1上的流表数据



  这里不知道什么原因,首先Ptyhon执行Delete.py时,会报数据模型不存在的错误。然后不执行python程序的环境下,直接用OLD自带的YangUI查找(或删除)流表时,自己也找不到这个数据模型。然而对于Mininet或者ODL的数据库来说,确实有收到一个流表。

Ryu删除拓扑流表

deletel.py
#!/usr/bin/python
import requests
from requests.auth import HTTPBasicAuth
def http_delete(url):
	headers = {'Content-Type':'application/json'}
	resp = requests.delete(url,headers=headers,auth=HTTPBasicAuth('admin', 'admin'))
	return resp
if __name__ == "__main__": 
	url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/'
	resp = http_delete(url)
	print (resp.content)

 3)下发硬超时流表,实现拓扑内主机h1和h3网络中断20s

 4)获取s1上活动的流表数

 2.编写Python程序,调用Ryu的北向接口实现以下功能

 1)实现第1步上相同的硬超时流表下发。

  • 1).搭建拓扑
$ sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13
  • 2).开启ryu控制器
$ ryu-manager ryu.app.simple_switch_13 ryu.app.ofctl_rest
  • 3).测试拓扑连通性,并开启(任意)两设备ping命令
mininet> pingall
mininet> h1 ping h3
  • 4).下发硬超时流表
$ python3 timeout.py
timeout.py
    #!/usr/bin/python
    import requests
    from requests.auth import HTTPBasicAuth
    def http_post(url,jstr):
    	url = url
    	headers = {'Content-Type':'application/json'}
    	resp = requests.post(url,jstr,headers=headers)
    	return resp 
    if __name__ == "__main__":
    	url = 'http://127.0.0.1:8080/stats/flowentry/add'
    	with open("./timeout.json") as f:
    		jstr = f.read()
    	resp = http_post(url,jstr)
    	print (resp.content)
    
  
timeout.json
    {
        "dpid": 1,
        "cookie": 1,
        "cookie_mask": 1,
        "table_id": 0,
        "hard_timeout": 20,
        "priority": 65535,
        "flags": 1,
        "match":{
            "in_port":1
        },
        "actions":[]
    }
</code>


 2)参考Ryu REST API的文档,基于VLAN实验的网络拓扑,编程实现相同的VLAN配置。

  • 1).搭建topo
  • 略v
  • 2).开启ryu控制器
  • 3).测试拓扑连通性
  • 4).下发VLAN划分流表
$ python VLANCreat.py
VLANCreate.py
#!/usr/bin/python
import json
import requests

if name == "main":
url = 'http://127.0.0.1:8080/stats/flowentry/add'
headers = {'Content-Type': 'application/json'}
flow1 = {
"dpid": 1,
"priority": 1,
"match":{
"in_port": 1
},
"actions":[
{
"type": "PUSH_VLAN",
"ethertype": 33024
},
{
"type": "SET_FIELD",
"field": "vlan_vid",
"value": 4096
},
{
"type": "OUTPUT",
"port": 3
}
]
}
flow2 = {
"dpid": 1,
"priority": 1,
"match":{
"in_port": 2
},
"actions":[
{
"type": "PUSH_VLAN",
"ethertype": 33024
},
{
"type": "SET_FIELD",
"field": "vlan_vid",
"value": 4097
},
{
"type": "OUTPUT",
"port": 3
}
]
}
flow3 = {
"dpid": 1,
"priority": 1,
"match":{
"vlan_vid": 0
},
"actions":[
{
"type": "POP_VLAN",
"ethertype": 33024
},
{
"type": "OUTPUT",
"port": 1
}
]
}
flow4 = {
"dpid": 1,
"priority": 1,
"match": {
"vlan_vid": 1
},
"actions": [
{
"type": "POP_VLAN",
"ethertype": 33024
},
{
"type": "OUTPUT",
"port": 2
}
]
}
flow5 = {
"dpid": 2,
"priority": 1,
"match": {
"in_port": 1
},
"actions": [
{
"type": "PUSH_VLAN",
"ethertype": 33024
},
{
"type": "SET_FIELD",
"field": "vlan_vid",
"value": 4096
},
{
"type": "OUTPUT",
"port": 3
}
]
}
flow6 = {
"dpid": 2,
"priority": 1,
"match": {
"in_port": 2
},
"actions": [
{
"type": "PUSH_VLAN",
"ethertype": 33024
},
{
"type": "SET_FIELD",
"field": "vlan_vid",
"value": 4097
},
{
"type": "OUTPUT",
"port": 3
}
]
}
flow7 = {
"dpid": 2,
"priority": 1,
"match": {
"vlan_vid": 0
},
"actions": [
{
"type": "POP_VLAN",
"ethertype": 33024
},
{
"type": "OUTPUT",
"port": 1
}
]
}
flow8 = {
"dpid": 2,
"priority": 1,
"match": {
"vlan_vid": 1
},
"actions": [
{
"type": "POP_VLAN",
"ethertype": 33024
},
{
"type": "OUTPUT",
"port": 2
}
]
}
res1 = requests.post(url, json.dumps(flow1), headers=headers)
res2 = requests.post(url, json.dumps(flow2), headers=headers)
res3 = requests.post(url, json.dumps(flow3), headers=headers)
res4 = requests.post(url, json.dumps(flow4), headers=headers)
res5 = requests.post(url, json.dumps(flow5), headers=headers)
res6 = requests.post(url, json.dumps(flow6), headers=headers)
res7 = requests.post(url, json.dumps(flow7), headers=headers)
res8 = requests.post(url, json.dumps(flow8), headers=headers)

三、实验总结

 1.实验心得

  这次实验大部分时间花在第一步上,可能由于环境有问题,或者操作不当。导致第一步中OpenDaylight流表的数据没办法通过URL进行正常获取、修改等操作。这里试过重装系统、更换版本、用Debian系统等等一系列办法,虽然最后仍然没有解决这个问题,但也算是几次不错的尝试吧(尤其是Debian的sudo用户要手动配置)。
  第二步相对来说比较一帆风顺一点。

 2.实验问题

  • ODL流表模型不存在
    • 至今未解决
  • ryu下发流表VLAN后Mininet设备仍然全部是连通状态
    • ryu的流表似乎并不会因为ryu关闭而删除,这里需要curl将旧有的(第一步中的硬超时)流表删掉
$ sudo apt install curl #安装curl
$ curl -X DELETE http://127.0.0.1:8080/stats/flowentry/clear/1 http://127.0.0.1:8080/stats/flowentry/clear/2
$ #删除流表
posted @ 2022-11-03 00:00  NullPointerDailytion  阅读(32)  评论(0编辑  收藏  举报
@format