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

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

时间:2023-10-24 20:55:21浏览次数:42  
标签:__ url REST headers json API SDN type requests

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

一、实验目的

  1. 能够编写程序调用OpenDaylight REST API实现特定网络功能;
  2. 能够编写程序调用Ryu REST API实现特定网络功能。

二、实验环境

Ubuntu 21.10

三、实验内容

利用Mininet平台搭建拓扑,并连接控制器。编写Python程序,调用相应控制器(OpenDaylight)的北向接口编程实现相关功能

1.编程实现下发硬超时流表,实现拓扑内主机h1和h3网络中断20s

代码

#!/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("./timeout.json") as file:
        str = file.read()
    headers = {'Content-Type': 'application/json'}
    res = requests.put(url, str, headers=headers, auth=HTTPBasicAuth('admin', 'admin'))
    print (res.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"
        }
    ]
 }

运行结果

2.编程实现获取s1上实时的流表数,并通过添加和删除流表项实现更新当前交换机的实时流表数

(1)获取s1上实时的流表数

代码

#!/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)通过删除流表项更新当前交换机的实时流表数

代码

#!/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.编程实现拓扑信息,包括主机、交换机和链路

代码

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

运行结果

4.编程复现前序VLAN实验且可查看前序VLAN实验的拓扑信息,包括主机、交换机和链路,以及显示每台交换机的所有流表项

代码

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)

运行结果

四、实验总结

通过本次实验,我学会了编写程序调用OpenDaylight REST API来实现特定网络功能。此次实验是在之前的实验基础上进行,难度有所提升,花费了许多时间,但也起到了复习巩固的作用。由于我的电脑无法使用ODL,所以借用同学电脑使用ODL完成实验中的查看实时流表功能。

标签:__,url,REST,headers,json,API,SDN,type,requests
From: https://www.cnblogs.com/102101310hxy/p/17785729.html

相关文章

  • Apipost自动化测试使用教程
    Apipost提供可视化的API自动化测试功能,使用Apipost研发人员可以设计、调试接口,测试人员可以基于同一数据源进行测试,Apipost接口自动化功能在上次更新中进行了逻辑调整,带来更好的交互操作、更多的控制器选择,同时新增同步接口模式选择、测试数据选择功能。添加接口使用Apipost,研发......
  • Apipost自动化测试使用教程
    Apipost提供可视化的API自动化测试功能,使用Apipost研发人员可以设计、调试接口,测试人员可以基于同一数据源进行测试,Apipost接口自动化功能在上次更新中进行了逻辑调整,带来更好的交互操作、更多的控制器选择,同时新增同步接口模式选择、测试数据选择功能。添加接口使用Apipost,......
  • API用户行为分析监测
    一、认证鉴权技术基于Session-Cookie认证相信大家对Session-Cookie认证并不陌生,它是一种利用服务端的Session(会话)和浏览器(客户端)的Cookie来实现的前后端通信认证模式,长期以来一直处于主流地位。由于HTTP是无状态的,借助Cookie,客户端登陆成功后,服务端能识别出其后续请求,无需......
  • 发布 ASP.NET Core WebAPI 至 IIS
    一、在VS上1.在VS项目上右键,选择发布:2.根据服务器情况,选择目标运行时;将开发时使用的框架作为目标框架;目标位置上已有的文件是否删除,通过删除现有文件进行配置指定。点击发布之后,将在目标位置成生相应的文件。VS上也有相应的输出 二、在目标服务器上 1.复制发布......
  • apisix etcd集群数据备份恢复
     #etcd数据备份/home/apisix-etcd-backup.sh#!/bin/bash#创建备份目录mkdir-p /data/{apisix-etcd-0,apisix-etcd-1,apisix-etcd-2}#apisixetcd数据备份ETCDCTL_API=3/opt/etcd/bin/etcdctl--endpoints="http://apisix-etcd-0.apisix-etcd-headless.ingress-apisix.......
  • 淘宝/天猫API对接中您所遇到的那些事
    淘宝天猫的发展历程是一个不断创新和变革的过程,其强大的实力和创新能力使其在竞争激烈的电商市场中保持领先地位。                                 APIsessionkey             ......
  • @Controller和@RestController的区别
    总体上,@Controller和@RestController都是SpringMVC框架中的注解,用于标识一个类是SpringMVCcontroller处理器,可以接收HTTP请求。但它们在处理请求和返回结果方面存在一些不同。返回类型:@Controller:如果使用@Controller注解,那么类中的方法可以直接通过返回String跳转到jsp、......
  • Mysql接口API相关函数详细使用说明
    MySql接口API相关函数1、部分API函数总览1.1、部分API函数表1.2、部分MySql结构体说明    1.3、API函数使用步骤2、mysql_init()——MYSQL对象初始化     2.1、函数原型及参数说明     2.2、简单使用3、mysql_real_connect()——数据库引擎建立连......
  • 8、SpringMVC之RESTful案例
    阅读本文前,需要先阅读SpringMVC之RESTful概述8.1、前期工作8.1.1、创建实体类Employeepackageorg.rain.pojo;importjava.io.Serializable;/***@authorliaojy*@date2023/10/19-21:31*/publicclassEmployeeimplementsSerializable{privateInte......
  • 为什么一些前端不喜欢 Restful Api?
    做过不少系统架构,全栈、前后端一起设计,我认为至少在部分领域restful可以扔了。第一个被淘汰的是URI风格,主要是现在都是纯JSON请求和返回,例如post一般情况下id都和JSON放一起提交了,就没URI的必要。然后既然post都润了,那get、put、delete也一样了。且在js代码里面单独为URI设置......