Ryu基本操作的REST API调用示例

import urllib2
import json

def get_all_switches():
    url = "http://127.0.0.1:8080/v1.0/topology/switches"
    req = urllib2.Request(url)
    res_data = urllib2.urlopen(req)
    res = res_data.read()
    res = json.loads(res)
    return res

def get_all_links():
    url = "http://127.0.0.1:8080/v1.0/topology/links"
    req = urllib2.Request(url)
    res_data = urllib2.urlopen(req)
    res = res_data.read()
    res = json.loads(res)
    return res
def get_switch(dpid):
    url = "http://127.0.0.1:8080/v1.0/topology/switches/" + dpid
    req = urllib2.Request(url)
    res_data = urllib2.urlopen(req)
    res = res_data.read()
    res = json.loads(res)
    return res

def get_flow_entries(dpid):
    url = "http://127.0.0.1:8080/stats/flow/" + dpid
    req = urllib2.Request(url)
    res_data = urllib2.urlopen(req)
    res = res_data.read()
    res = json.loads(res)
    return res

def add_flow_entry(dpid,match,priority,actions):
    url = "http://127.0.0.1:8080/stats/flowentry/add"
    post_data = "{'dpid':%s,'match':%s,'priority':%s,'actions':%s}" % (dpid,str(match),priority,str(actions))
    req = urllib2.Request(url,post_data)
    res = urllib2.urlopen(req)
    return res.getcode()

def delete_flow_entry(dpid, match=None, priority=None, actions=None):
    url = "http://127.0.0.1:8080/stats/flowentry/delete"
    post_data = "{'dpid':%s" % dpid
    if match is not None:
        post_data += ",'match':%s" % str(match)
    if priority is not None:
        post_data += ",'priority':%s" % priority
    if actions is not None:
        post_data += ",'actions':%s" % str(actions)
    post_data += "}"

    req = urllib2.Request(url,post_data)
    res = urllib2.urlopen(req)
    return res.getcode()

函数说明:

#get_all_switches()

参数:无

返回结果:一个包含所有交换机信息的列表

结果示例:

[{"ports": [{"hw_addr": "12:ad:47:17:6d:1d", "name": "s1-eth1", "port_no": "00000001", "dpid": "0000000000000001"}, {"hw_addr": "62:bf:89:79:68:67", "name": "s1-eth2", "port_no": "00000002", "dpid": "0000000000000001"}], "dpid": "0000000000000001"}, {"ports":
[{"hw_addr": "da:d7:cb:f8:a4:7f", "name": "s2-eth1", "port_no": "00000001", "dpid": "0000000000000002"}, {"hw_addr": "ce:31:74:a1:c1:2d", "name": "s2-eth2", "port_no": "00000002", "dpid": "0000000000000002"}], "dpid": "0000000000000002"}, {"ports": [{"hw_addr":
"ea:c5:e8:ee:72:f7", "name": "s3-eth1", "port_no": "00000001", "dpid": "0000000000000003"}, {"hw_addr": "da:57:80:b2:74:67", "name": "s3-eth2", "port_no": "00000002", "dpid": "0000000000000003"}], "dpid": "0000000000000003"}]

#get_all_links()

参数:无

返回结果:一个包含所有链路信息的列表

结果示例:

[{"src": {"hw_addr": "12:ad:47:17:6d:1d", "name": "s1-eth1", "port_no": "00000001", "dpid": "0000000000000001"}, "dst": {"hw_addr": "da:d7:cb:f8:a4:7f", "name": "s2-eth1", "port_no": "00000001", "dpid": "0000000000000002"}}, {"src": {"hw_addr": "ea:c5:e8:ee:72:f7",
"name": "s3-eth1", "port_no": "00000001", "dpid": "0000000000000003"}, "dst": {"hw_addr": "ce:31:74:a1:c1:2d", "name": "s2-eth2", "port_no": "00000002", "dpid": "0000000000000002"}}, {"src": {"hw_addr": "da:d7:cb:f8:a4:7f", "name": "s2-eth1", "port_no": "00000001",
"dpid": "0000000000000002"}, "dst": {"hw_addr": "12:ad:47:17:6d:1d", "name": "s1-eth1", "port_no": "00000001", "dpid": "0000000000000001"}}, {"src": {"hw_addr": "ce:31:74:a1:c1:2d", "name": "s2-eth2", "port_no": "00000002", "dpid": "0000000000000002"}, "dst":
{"hw_addr": "ea:c5:e8:ee:72:f7", "name": "s3-eth1", "port_no": "00000001", "dpid": "0000000000000003"}}]

#get_switch(dpid)

参数:dpid为字符串,比如"0000000000000001"

返回结果:一个包含dpid对应的交换机的信息的列表

结果示例:

[{"ports": [{"hw_addr": "12:ad:47:17:6d:1d", "name": "s1-eth1", "port_no": "00000001", "dpid": "0000000000000001"}, {"hw_addr": "62:bf:89:79:68:67", "name": "s1-eth2", "port_no": "00000002", "dpid": "0000000000000001"}], "dpid": "0000000000000001"}]

#get_flow_entries(dpid)

参数:dpid为字符串,比如"0000000000000001"

返回结果:一个包含流表项的字典

结果示例:

{"1": [{"actions": ["OUTPUT:65533"], "idle_timeout": 0, "cookie": 0, "packet_count": 2252, "hard_timeout": 0, "byte_count": 114852, "duration_nsec": 370000000, "priority": 65535, "duration_sec": 2026, "table_id": 0, "match": {"dl_type": 35020, "nw_dst": "0.0.0.0",
"dl_vlan_pcp": 0, "dl_src": "00:00:00:00:00:00", "nw_tos": 0, "tp_src": 0, "dl_vlan": 0, "nw_src": "0.0.0.0", "nw_proto": 0, "tp_dst": 0, "dl_dst": "01:80:c2:00:00:0e", "in_port": 0}}, {"actions": ["OUTPUT:2"], "idle_timeout": 0, "cookie": 0, "packet_count":
0, "hard_timeout": 0, "byte_count": 0, "duration_nsec": 864000000, "priority": 1111, "duration_sec": 104, "table_id": 0, "match": {"dl_type": 0, "nw_dst": "0.0.0.0", "dl_vlan_pcp": 0, "dl_src": "00:00:00:00:00:00", "nw_tos": 0, "tp_src": 0, "dl_vlan": 0, "nw_src":
"0.0.0.0", "nw_proto": 0, "tp_dst": 0, "dl_dst": "00:00:00:00:00:00", "in_port": 1}}]}

其中开头的“1”表示dpid号

#add_flow_entry(dpid,match,priority,actions)

参数:

dpid为字符串,比如"0000000000000001"

match为字典,比如match = {"in_port":00000001},其他键的名称见《ryu Documentation》P161的Flow Match Structure

priority为字符串,比如"1111"

actions为列表,比如actions = [{"type":"OUTPUT","port":00000002}],其他元素名称见《ryu Documentation》P282的actions

返回结果:整数,HTTP状态码,200表示添加流表项成功

结果示例:200,403,404

#delete_flow_entry(dpid,match,priority,actions)

参数:

dpid为字符串,比如"0000000000000001"

match为字典,比如match = {"in_port":00000001},其他键的名称见《ryu Documentation》P161的Flow Match Structure

priority为字符串,比如"1111"

actions为列表,比如actions = [{"type":"OUTPUT","port":00000002}],其他元素名称见《ryu Documentation》P282的actions

返回结果:整数,HTTP状态码,200表示删除流表项成功

结果示例:200,403,404

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 18:30:40

Ryu基本操作的REST API调用示例的相关文章

Web Api跨域访问配置及调用示例

1.Web Api跨域访问配置. 在Web.config中的system.webServer内添加以下代码: <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="*" />

JAVA调用聚合天气api接口示例

查询天气预报在APP中常用的一个常用功能,聚合数据免费天气api接口可以根据根据城市名/id查询天气.根据IP查询天气.据GPS坐标查询天气.查询城市天气三小时预报,并且支持全国不同城市天气预报查询. 代码描述:基于JAVA的免费天气api接口调用示例,根据文档中注明的需求参数,调用接口返回数据. 关联数据:免费天气api 接口地址:https://www.juhe.cn/docs/api/id/39 step1:选择本文所示例的接口"免费天气api" url:https://www.

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

速码验证码接码平台API接入示例说明

速码平台API接口示例[通用版] 一.统一说明 接口地址:http://api.eobzz.com/httpApi.do?action= 接口统一编码:UTF-8 接口调用方式: HTTP,支持GET和POST两种方式. GET方式调用实例:http://api.eobzz.com/httpApi.do?action=方法名&参数1=值&参数2=值(具体方法名及参数请参考接口方法). 软件开发者说明:服务器返回no_data时表示系统暂时没有可用号码了,请使用死循环每隔一分钟请求一次手机号

Html5之高级-14 Web Socket(概述、API、示例)

一.Web Socket 概述 Web Socket 简介 - Web Socket 是 HTML5 提供的在 Web应用程序中客户端与服务器端之间进行的非 HTTP 的通信机制 - Web Socket 实现了用 HTTP 不容易实现的服务器端的数据推送等智能通讯技术 Web Socket 的特点 - Web Socket 可以在服务器与客户端之间建立一个非 HTTP 的双向连接 - 这个连接时实时的,也是永久的 - 服务器端可以主动推送消息 - 服务器端不再需要轮询客户端的请求 - 服务器端

(转)Sphinx中文分词安装配置及API调用

这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂时不要选择原版Sphinx(对中文的支持不是很好).又因为服务器所用 MySQL在当时编译时并没有编译Sphinx扩展,而重新编译MySQL并加入Sphinx暂时又无法实现(项目用到了多台服务器,在不影响现有业务的 情况下不可能去重新编译MySQL的),所以采用的是程序通过API来外部调用Sphin

SharePoint 2013 Search REST API 使用示例

原文:SharePoint 2013 Search REST API 使用示例 前言:在SharePoint2013中,提供Search REST service搜索服务,你可以在自己的客户端搜索方法或者移动应用程序中使用,该服务支持REST web request.你可以使用KeyWord Query Language(KQL)或者FAST Query Language(FQL)来对Search REST Service进行搜索查询,并且,试用与远程客户端应用程序.移动应用程序和其他应用程序.

jquery api调用

本框架内置组件以及部分插件都可以通过jquery选择器进行API调用,支持链式操作,如下示例. <script type="text/javascript"> $("a.api-test").click(function(){ $(this).dialog({id:'myid',url:'doc/mydialog.html',title:'测试弹框'}).text('OK'); }); </script> <a href="j

Sphinx中文分词安装配置及API调用

这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂时不要选择原版Sphinx(对中文的支持不是很好).又因为服务器所用 MySQL在当时编译时并没有编译Sphinx扩展,而重新编译MySQL并加入Sphinx暂时又无法实现(项目用到了多台服务器,在不影响现有业务的 情况下不可能去重新编译MySQL的),所以采用的是程序通过API来外部调用Sphin