首页 > 其他分享 >实验七

实验七

时间:2022-11-03 10:36:57浏览次数:35  
标签:url self flow headers 实验 requests type

一、实验目的
能够编写程序调用OpenDaylight REST API实现特定网络功能;
能够编写程序调用Ryu REST API实现特定网络功能。
三、实验要求
(一)基本要求
编写Python程序,调用OpenDaylight的北向接口实现以下功能
(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;

搭建拓扑 命令行输入

sudo mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13

Beryllium 版本 连接OpenDaylight

./distribution-karaf-0.4.4-Beryllium-SR4/bin/karaf

feature:install odl-restconf odl-l2switch-switch-ui odl-openflowplugin-all odl-mdsal-apidocs odl-dlux-core odl-dlux-node odl-dlux-yangui

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

(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)

创建并编写 timeout.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": "flow",
"priority": "65535",
"hard-timeout": "20",
"cookie": "2",
"table_id": "0"
}
]
}

`


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

创建并编写 getflow.py 文件
`#!/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)

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

创建并编写 ryu_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_ryu.json") as f:
jstr = f.read()
resp = http_post(url,jstr)
print (resp.content)

创建并编写 ryu_timeout.json 文件{
"dpid": 1,
"cookie": 1,
"cookie_mask": 1,
"table_id": 0,
"hard_timeout": 20,
"priority": 65535,
"flags": 1,
"match":{
"in_port":1
},
"actions":[

]

}

`
启动ryu控制器
ryu-manager ryu.app.simple_switch_13 ryu.app.ofctl_rest

创建拓扑

sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13

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

创建并编写 ryu_topo.py 文件

`# ryu_topo.py
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())}

`
创建并编写 ryu_vlan.py 文件

`# ryu_vlan.py
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)

`
启动Ryu控制器

ryu-manager ryu.app.simple_switch_13 ryu.app.ofctl_rest

创建拓扑

sudo sudo mn --custom ryu_topo.py --topo mytopo --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13


删除流表

curl -X DELETE http://127.0.0.1:8080/stats/flowentry/clear/1

curl -X DELETE http://127.0.0.1:8080/stats/flowentry/clear/2

运行python ryu_vlan.py

(二)进阶要求

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

创建并编写 getall.py 文件

`# getall.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()

`
运行python getall.py

mininet>dpctl dump-flows -O OpenFlow13 s1
mininet>dpctl dump-flows -O OpenFlow13 s2

mininet>dpctl dump-flows -O OpenFlow13

实验心得:
有错误的要反复的排错、看报错信息找到报错原因,不断地总结规律和经验,避免下一次再犯同样的错误。对于有些进程会占用的问题,需要将前面一个进程删除后再加入现有并需要的进程,当找不到进程的时候也可以重启客户机。

标签:url,self,flow,headers,实验,requests,type
From: https://www.cnblogs.com/212006111hxy/p/16853549.html

相关文章

  • 实验7:基于REST API的SDN北向应用实践
    实验7:基于RESTAPI的SDN北向应用实践一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环......
  • 记CentOS7里搭建日志服务器实验
    记CentOS7里搭建日志服务器实验实验环境:win7-64(攻击者)centos7(被攻击者与发送日志者)centos7-2(接收日志者---日志服务器)实验开始:步骤一配置网络并能互相通......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight 一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验......
  • Python实验报告(第八周)
    一、实验目的1.认识程序运行中的异常2.学会处理异常语句3.学会调试程序二、实验环境python版本:3.10(64-bit)三、实验内容1.实例一:  实验结果:  2.实例二:  ......
  • 实验环境安装配置
    实验环境安装配置一、实验目的熟悉实验环境熟悉Linux基本操作二、实验要求(一)任务请根据实验环境安装文档,完成特定开源软件的安装(二)实验报告请用Markdown排版,提交在......
  • 实验7:基于REST API的SDN北向应用实践
    一.实验目的1.能够编写程序调用OpenDaylightRESTAPI实现特定网络功能2.能够编写程序调用RyuRESTAPI实现特定网络功能。二.实验环境1.下载虚拟机软件Or......
  • 实验7:基于REST API的SDN北向应用实践
    编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;点击查看代码sudomn--topo=single,3--controlle......
  • 实验7:基于REST API的SDN北向应用实践
    三、实验报告3.1请用Markdown排版;3.2将所有本实验相关文件保存在目录/home/用户名/学号/lab7/中;3.2.1只需要提交实现相应Python代码和执行结果截图,其余文字请勿赘述;......
  • 实验7:基于REST API的SDN北向应用实践..
    (一)基本要求编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;(2)下发指令删除s1上的流表数据。#!/......
  • 实验7:基于REST API的SDN北向应用实践 实验
    一、实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。二、实验环境下载虚拟机软件OracleVisualBox或......