首页 > 其他分享 >实验7:基于REST API的SDN北向应用实践

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

时间:2022-11-02 23:57:05浏览次数:45  
标签:__ url self flow REST headers API SDN requests

(一)基本要求

编写Python程序,调用OpenDaylight的北向接口实现以下功能
(1) 利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;
(2) 下发指令删除s1上的流表数据。

del.py

点击查看代码
#!/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) 下发硬超时流表,实现拓扑内主机h1和h3网络中断20s。

timeout.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('timeout.json') as f:
        jstr = f.read()
    resp = http_put(url,jstr)
    print (resp.content)

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

gets1flow.py

点击查看代码
#!/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)

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

(1) 实现上述OpenDaylight实验拓扑上相同的硬超时流表下发。

ryutimeout.py

点击查看代码
#!/usr/bin/python
import requests
if __name__ == "__main__":
    url = 'http://127.0.0.1:8080/stats/flowentry/add'
    with open("ryu_timeout.json") as file:
        str = file.read()
    headers = {'Content-Type': 'application/json'}
    res = requests.post(url, str, headers=headers)
    print (res.content)

(2) 参考Ryu REST API的文档,基于VLAN实验的网络拓扑,编程实现相同的VLAN配置。
提示:拓扑生成后需连接Ryu,且Ryu应能够提供REST API服务

ryutopo.py

点击查看代码
from mininet.topo import Topo
 
class ryu_topo(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 = {'ryu_topo': (lambda: ryu_topo())}

ryuvlan.py

点击查看代码
import json
import requests

if __name__ == '__main__':
    url = 'http://127.0.0.1:8080/stats/flowentry/add'
    headers = {'Content-Type': 'application/json'}
    f = open('ryu_vlan.json').read()
    flows = json.loads(f)['flows']
    [requests.post(url, data=json.dumps(flows[i]), headers=headers) for i in range(0, 8)]

运行ryutopo.py创建拓扑后删除流表,运行ryuvlan.py完成配置

(三)进阶要求

OpenDaylight或Ryu任选其一,编程实现查看前序VLAN实验拓扑中所有节点(含交换机、主机)的名称,以及显示每台交换机的所有流表项。

ryu.py

点击查看代码
import requests
import time
import re


class GetNodes:
    def __init__(self, ip):
        self.ip = ip
        
    def get_switch_id(self):
        url = 'http://' + self.ip + '/stats/switches'
        re_switch_id = requests.get(url=url).json()
        switch_id_hex = []
        for i in re_switch_id:
            switch_id_hex.append(hex(i))

        return switch_id_hex

    def getflow(self):
        url = 'http://' + self.ip + '/stats/flow/%d'
        switch_list = self.get_switch_id()
        ret_flow = []
        for switch in switch_list:
            new_url = format(url % int(switch, 16))
            re_switch_flow = requests.get(url=new_url).json()
            ret_flow.append(re_switch_flow)
        return ret_flow

    def show(self):
        flow_list = self.getflow()
        for flow in flow_list:
            for dpid in flow.keys():
                dp_id = dpid
                switchnum= '{1}'.format(hex(int(dp_id)), int(dp_id))        
                print('s'+switchnum,end = " ")
                switchnum = int(switchnum)
            for list_table in flow.values():
                for table in list_table:          
                    string1 = str(table)
                    if re.search("'dl_vlan': '(.*?)'", string1) is not None:
                        num = re.search("'dl_vlan': '(.*?)'", string1).group(1);
                        if num == '0' and switchnum == 1:
                            print('h1',end = " ")
                        if num == '1' and switchnum == 1:
                            print('h2',end = " ")
                        if num == '0' and switchnum == 2:
                            print('h3',end = " ")
                        if num == '1' and switchnum == 2:
                            print('h4',end = " ")
        print("")
        flow_list = self.getflow()
        for flow in flow_list:
            for dpid in flow.keys():
                dp_id = dpid
                print('switch_name:s{1}'.format(hex(int(dp_id)), int(dp_id)))
            for list_table in flow.values():
                for table in list_table:
                    print(table)
s1 = GetNodes("127.0.0.1:8080")
s1.show()
![](/i/l/?n=22&i=blog/2147096/202211/2147096-20221102235144244-1388989616.png)

个人总结

本次实验个人感觉挺难的,在一些地方卡了很久,请教完成了的同学问题和代码后才勉强完成。
通过此次实验学习到了编写程序调用OpenDaylight REST API实现特定网络功能,能够编写程序调用Ryu REST API实现特定网络功能。
实验过程中也遇到了很多问题,第一次运行python文件时就报错ImportError: No module named requests,用pdf以及百度的办法也没用,卡了很久,后面受不了了重装后才解决。
遇到的代码的问题除了请教同学以外,在pdf中的这个网站https://ryu.readthedocs.io/en/latest/app/ofctl_rest.html也学习到了很多。

标签:__,url,self,flow,REST,headers,API,SDN,requests
From: https://www.cnblogs.com/whitetaru114/p/16852900.html

相关文章

  • 实验7:基于REST API的SDN北向应用实践
    一、实验目的1.能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;2.能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境1.下载虚拟机软件OracleVisua......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。实验要求(......
  • 实验7:基于REST API的SDN北向应用实践
    (一)基本要求编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;建立拓扑sudomn--topo=single,3--con......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验......
  • 无法发送具有此谓词类型的内容正文 RestSharp使用日志
    在使用RestSharp调用Api的时候,出现如下错误:无法发送具有此谓词类型的内容正文经过网上搜索,发现问题所在行:request.AddHeader("Content-Type",baseRequest.ContentType......
  • 实验7:基于REST API的SDN北向应用实践
     实验7:基于RESTAPI的SDN北向应用实践 一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二......
  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环......
  • FastAPI CRUD Router
    FastAPICRUDRouterhttps://github.com/awtkns/fastapi-crudrouterfastapi提供基础的制作API能力对于简单的业务来说,对于表仅仅需要CRUD接口,不需要其他额外的数据逻......