# 实验7:基于REST API的SDN北向应用实践 |
---|
## 一、实验目的 |
1. 能够编写程序调用OpenDaylight REST API实现特定网络功能; |
2. 能够编写程序调用Ryu REST API实现特定网络功能。 |
## 二、实验环境 |
1. 下载虚拟机软件Oracle VisualBox或VMware; |
2. 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet、OpenDaylight(Carbon版本)、Postman和Ryu; |
## 三、实验要求 |
### (一)基本要求 |
1. OpenDaylight |
(1) |
|
| |
| (2) |
| |
#!/usr/bin/python import requests from requests.auth import HTTPBasicAuth if __name__ == "__main__": url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/' headers = {'Content-Type': 'application/json'} res = requests.delete(url, headers=headers, auth=HTTPBasicAuth('admin', 'admin')) print (res.content)
|
| |
| |
| |
|
|
| |
| (3) |
| |
#!/usr/bin/python import requests from requests.auth import HTTPBasicAuth if __name__ == "__main__": url = 'http://127.0.0.1:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1' with open("./flowtable.json") as f: jstr = f.read() headers = {'Content-Type': 'application/json'} res = requests.put(url, jstr, headers=headers, auth=HTTPBasicAuth('admin', 'admin')) print (res.content)
|
| |
| |
| |
|
|
| |
| (4) |
| |
#!/usr/bin/python import requests from requests.auth import HTTPBasicAuth if __name__ == "__main__": url = 'http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/opendaylight-flow-table-statistics:flow-table-statistics' headers = {'Content-Type': 'application/json'} res = requests.get(url,headers=headers, auth=HTTPBasicAuth('admin', 'admin')) print (res.content)
|
| |
|
|
| |
| 2. Ryu |
| (1) |
| |
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('flowtable2.json') as f: jstr = f.read() resp = http_post(url,jstr) print (resp.content)
|
| |
| |
| |
|
|
| |
| (2) |
| |
#!/usr/bin/env python from mininet.topo import Topo class MyTopo(Topo): def __init__(self): # initilaize topology Topo.__init__(self) self.addSwitch("s1") self.addSwitch("s2") self.addHost("h1") self.addHost("h2") self.addHost("h3") self.addHost("h4") self.addLink("s1", "h1") self.addLink("s1", "h2") self.addLink("s2", "h3") self.addLink("s2", "h4") self.addLink("s1", "s2") topos = {'mytopo': (lambda: MyTopo())}
|
| |
| |
| |
| |
| |
|
|
| |
| (3) |
| |
| | VLAN_ID | Hosts | |
| | :------ | :---- | |
| | 0 | h1 h3 | |
| | 1 | h2 h4 | |
| |
curl -X POST -d '{ "dpid": 1, "match": { "in_port": 1 }, "actions": [ { "type": "PUSH_VLAN", "ethertype": 33024 }, { "type": "SET_FIELD", "field": "vlan_vid", "value": 4096 }, { "type":"OUTPUT", "port": 3 } ], "priority":5 }' http://localhost:8080/stats/flowentry/add curl -X POST -d ' { "dpid": 1, "priority":5, "match": { "in_port": 2 }, "actions": [ { "type": "PUSH_VLAN", "ethertype": 33024 }, { "type": "SET_FIELD", "field": "vlan_vid", "value": 4097 }, { "type":"OUTPUT", "port": 3 } ] }' http://localhost:8080/stats/flowentry/add curl -X POST -d ' { "dpid": 1, "match": { "vlan_vid": 0 }, "actions": [ { "type": "POP_VLAN", "ethertype": 33024 }, { "type":"OUTPUT", "port": 1 } ], "priority":5 } ' http://localhost:8080/stats/flowentry/add curl -X POST -d' { "dpid": 1, "match": { "vlan_vid": 1 }, "actions": [ { "type": "POP_VLAN", "ethertype": 33024 }, { "type":"OUTPUT", "port": 2 } ], "priority":5 } ' http://localhost:8080/stats/flowentry/add curl -X POST -d '{ "dpid": 2, "match": { "in_port": 1 }, "actions": [ { "type": "PUSH_VLAN", "ethertype": 33024 }, { "type": "SET_FIELD", "field": "vlan_vid", "value": 4096 }, { "type":"OUTPUT", "port": 3 } ], "priority":5 }' http://localhost:8080/stats/flowentry/add curl -X POST -d ' { "dpid": 2, "match": { "in_port": 2 }, "actions": [ { "type": "PUSH_VLAN", "ethertype": 33024 }, { "type": "SET_FIELD", "field": "vlan_vid", "value": 4097 }, { "type":"OUTPUT", "port": 3 } ], "priority":5 }' http://localhost:8080/stats/flowentry/add curl -X POST -d ' { "dpid": 2, "match": { "vlan_vid": 0 }, "actions": [ { "type": "POP_VLAN", "ethertype": 33024 }, { "type":"OUTPUT", "port": 1 } ], "priority":5 } ' http://localhost:8080/stats/flowentry/add curl -X POST -d' { "dpid": 2, "match": { "vlan_vid": 1 }, "actions": [ { "type": "POP_VLAN", "ethertype": 33024 }, { "type":"OUTPUT", "port": 2 } ], "priority":5 }' http://localhost:8080/stats/flowentry/add
|
| |
| ### 四、实验总结 |
| |
| 首先,这次的实验对于我来说是比较困难的,因为Python我也不太熟悉,所以写代码对我来说很痛苦,而且写的时候,总是遇到很多的错误,很奔溃,最后请教了同学才写出来,多亏了同学的帮助,才能完成此次的实验,还有最后的shell脚本,也有借鉴同学代码的地方,之后也会在代码这个薄弱的地方继续加强学习。 |