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

实验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;

三、实验要求

(一)基本要求

OpenDaylight

(1) 利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;

  • 终端输入命令搭建拓扑并连接OpenDaylight

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

#!/usr/bin/python
import requests
from requests.auth import HTTPBasicAuth

def http_delete(url):
    url= 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) 编写Python程序,调用OpenDaylight的北向接口下发硬超时流表,实现拓扑内主机h1和h3网络中断20s。

  • .py
#!/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('flowTable.json') as f:
        jstr = f.read()
    resp = http_put(url,jstr)
    print (resp.content)
  • .json
{
    "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
import json
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/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0'
    resp = http_get(url)
    res = json.loads(resp.text)
    print(len(res['flow-node-inventory:table'][0]['flow']))

Ryu

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

#!/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('ryuFlowTable.json') as f:
        jstr = f.read()
    resp = http_post(url,jstr)
    print (resp.content)

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

#!/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())}

四、实验总结

本次实验让我学会用 python 编写程序调用 OpenDaylight REST API 和 Ryu REST API 实现特定网络功能以及流表下发,对北向接口有了一些了解,对 mininet 连接远程控制器更加熟练。实验时,在连接 OpenDaylight 后想查看可视化界面,打开网页发现一片空白,mininet 程序中输入 pingall 之后才会出现。完成 OpenDaylight 部分后接着完成 Ryu 部分,运行程序时出错:

查了一下是代理连接不上,找到了一些解决方法,尝试了但并没有成功解决。最后重新安装了 ryu。也可能是因为一开始运行 L2Switch.py 时没有加上
ryu.app.ofctl_rest 的原因。后按创建拓扑、运行 L2Switch.py ryu.app.ofctl_rest、ryu 流表下发的顺序操作就成功了。大部分错误都是在 ryu 部分发生的,可能是因为对其中的原理还没那么理解。

posted @ 2021-10-26 23:04  呜哩哇啦*  阅读(61)  评论(0编辑  收藏  举报