第七次实验

实验7:基于REST API的SDN北向应用实践
(1) 利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;


(2) 编写Python程序,调用OpenDaylight的北向接口下发指令删除s1上的流表数据。


(3) 编写Python程序,调用OpenDaylight的北向接口下发硬超时流表,实现拓扑内主机h1和h3网络中断20s。
[`#!/usr/bin/python
import requests
from requests.auth import HTTPBasicAuth
def http_put(url,jstr):
url= url
headers = {'Content-Type':'application/json'}
resp = requests.put(url,jstr,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/flow-node-inventory:table/0/flow/1'
with open('timeout.json') as f:
jstr = f.read()
resp = http_put(url,jstr)
print (resp.content)`]

{ "flow": [ { "id": "1", "match": { "in-port": "1", "ethernet-match": { "ethernet-type": { "type": "0x0800" } }, "ipv4-destination": "10.0.0.3/32" }, "instructions": { "instruction": [ { "order": "0", "apply-actions": { "action": [ { "order": "0", "drop-action": {} } ] } } ] }, "flow-name": "flow1", "priority": "65535", "hard-timeout": "20", "cookie": "2", "table_id": "0" } ] }

(4) 编写Python程序,调用OpenDaylight的北向接口获取s1上活动的流表数。
`#!/usr/bin/python
import requests
from requests.auth import HTTPBasicAuth
def http_get(url):
url= url
headers = {'Content-Type':'application/json'}
resp = requests.get(url,headers=headers,auth=HTTPBasicAuth('admin','admin'))
return resp

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'
resp = http_get(url)
print(resp.content)`

Ryu

(1) 编写Python程序,调用Ryu的北向接口,实现上述OpenDaylight实验拓扑上相同的硬超时流表下发。

`#!/usr/bin/python
import requests

if name == "main":
url = 'http://127.0.0.1:8080/stats/flowentry/add'
with open("addtimeout.json") as f:
jstr = f.read()
headers = {'Content-Type': 'application/json'}
res = requests.post(url, jstr, headers=headers)
print (res.content) {
"dpid": 1,
"cookie": 1,
"cookie_mask": 1,
"table_id": 0,
"hard_timeout": 20,
"priority": 65535,
"flags": 1,
"match":{
"in_port":1
},
"actions":[

]

}`

(2) 利用Mininet平台搭建下图所示网络拓扑,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。拓扑生成后需连接Ryu,且Ryu应能够提供REST API服务。

`#!/usr/bin/env python
from mininet.topo import Topo
class MyTopo(Topo):
def init(self):
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())}`

连接:
ryu-manager ryu.app.simple_switch_13 ryu.app.ofctl_rest

(3) 整理一个Shell脚本,参考Ryu REST API的文档,利用curl命令,实现和实验2相同的VLAN。

vlanid host
0 h1 h3
1 h2 h4

实验总结:

代码部分有点奇怪一直弄不出来,后面是借鉴了同学的代码。前期把每个文件运行的cd搞得有点混乱出了点error,后面捋清楚了。一开始odl都忘记怎么开了...整体还是有点困难做下来。这个排版有毒,搞半天这个代码为什么不能出现框框

posted @ 2021-10-25 18:07  KUNJI  阅读(49)  评论(0)    收藏  举报