Ryu学习一
什么是Ryu
Ryu 是一个基于组件的SDN框架。Ryu提供了拥有很多易用API软件组件,使开发人员可以轻松创建新的网络管理和控制程序。Ryu支持各种管理网络设备的协议。如OpenFlow,Netconf, OF-config等。 关于OF,Ryu支持完全1.0,1.2,1.3,1.4,1.5和Nicira扩展。
开始写 Ryu应用
如果想用自己的方式管理网络设备(交换机,路由器等),你需要编写自己的Ryu应用程序。你的程序告诉Ryu你想如何管理设备。然后Ryu利用OF协议等配置网络设备。
Ryu 的组件
- bin/ryu-manager 使主要的执行器
- ryu.base.app_manager 对Ryu 应用的管理。 加载Ryu应用,提供Ryu的内容,以及在应用之间路由消息。
- ryu.controller.controller 是OF主要的控制器组件。 管理交换机之间的连接。 生成和路由时间到合适的 事件, 像 Ryu 应用。
- ryu.controller.dpset 管理交换机, 计划被ryu/topolog取代
- ryu.controller.ofp_event 定义OF 事件。
- ryu,controller.ofp_handler 基础的OF 句柄,包括negotiation.
OpenFlow 有线的 协议 编码器和解码器
- ryu.ofproto.ofproto_v1_x OF1.x的定义
- ryu.ofproto.ofproto_v1_x_parser OF1.x 编码器和解码器的实现
Ryu 应用
- ryu.app.cbench 一个傻 的 OF1.0 的测试控制器框架。 打算了 oflops cbench 一起使用。
- ryu.app.simple_switch 一个学习交换机的实现。
- ryu.topology 交换机和连接发现模型。 打算被 ryu/controller/dpset
库
- ryu.lib.packet Ryu 包库。 对TCP/IP 协议的 编码解码器实现。
- ryu.lib.ovs ovsdb 交互库
- ryu.lib.of_config of-config 的实现
- ryu.lib.netconf NETCONF 定义
- ryu.lib.xflow 对 netflow 和 sFlow 的实现
第三方库
- ryu.confrib.ovs OVS python 绑定
- ryu.contrib.oslo.config Oslo 配置库。 被用来 Ryu 管理者 命令行选项 和 配置文件。
- ryu.contrib.cnnlient NETCONF 客户端的Py库。 被ryu.lib.of_config 使用
Ryu 应用API,Ryu应用程序模型
- Ryu应用发送异步的信息给彼此。 此外,Ryu也有一些内部的事件源,不是Ryu应用发起的。比如说是 OPenFlow 控制器。 一个时间可以包含任意对象。但是不建议传递复杂的对象。
- 每一个Ryu应用有一个FIFO的队列来接收事件。每个Ryu应用有一个处理事件的线程。这个线程不断的提取事件,并调用响应的函数处理这个事件,要注意事件处理函数不要阻塞,否则后面的事件都无法处理。
- 有一些事件是实现同步 内部应用。 这些请求和普通事件用相同的机制。 他们的回复被放在专用队列中,以避免死锁。
Contexts
是一个普通的python对象。 被app之间共享。 新代码不建议使用上下文。
创建一个Ryu应用
一个Ryu应用是 ryu.base.app_manager.RyuApp 的一个子类。 Ryu APP 是独生子。 一个模块只允许一个应用。
观察事件
一个 Ryu 应用可以注册自己区监听特定的事件,通过使用
ryu.controller.handler.set_ev_cls |
这个装饰器。
生成事件
一个Ryu APP可以通过调用合适的 ryu.base.app_managerRyuApp’s methods like send_event or send_event_to_observers.
Event classes
一个事件类描述一个系统所生成的事件。 事件既可被Ryu 核心所发起, 也可以被APP发起。 一个APP可以注册他感兴趣的事件通过 提供一个处理方法,使用ryu.controller.handler.set_ev_cls_decorator.
OpenFlow 事件类
ryu.controller.ofp_event模块 提供 描述 接收到的来自交换机的消息。 按照惯例。他们被命名为
ryu.controller.ofp_event.EventOFPxxx |
其中xxx是OF通信的消息。例如, EventOFPPacketIn 代表packet-in 消息。Ryu的OF控制器,自动解码来自交换机的OpenFlow 消息,并且发送他们到Ryu的APP,当然这些APP通过装饰器表达了对这些信息的兴趣。OF classed 是下面这个类的子类。
class ryu.controller.ofp_event.EventOFPMsgBase(Msg) |
OF event class 至少有下面三个属性。
属性 | 描述 |
---|---|
msg | 一个对象,描述通信中的OF消息 |
msg.datapath | 一个 ryu.controller.controller.Datapath 的实例,which describes an OF switch from which we received this OF message. (描述发送消息的交换机) |
timestamp | datapath 实例 生成这个事件的时间戳 |
ryu.controller.handler.set_ev_cls(ev_cls,dispatchers=None)
这是一个装饰器, 被装饰方法将成为一个事件处理器。 ev_cls 是一个事件类,而这个类的实例,将会被Ray APP所接收。 而dispatchers 参数 明确以下协商语段(或多个),表示时间处理器接收什么样的事件(对事件中的属性进行进一步的划分)。
协商 | 描述 |
---|---|
ryu.controller.handler.HANDSHAKE_DISPATCHER | 发送并且等待 hello 消息 |
ryu.controller.handler.CONFIG_DISPATCHER | Version negotiated and sent features-request message |
ryu.controller.handler.MAIN_DISPATCHER | Switch-features message received and sent set-config message |
ryu.controller.handler.DEAD_DISPATCHER | Disconnect from the peer. Or disconnecting due to some unrecoverable errors. |
ryu.controller.controller.Datapath
class ryu.controller.controller.Datapath(socket, address) |
用来描述 OpenFlow 交换机的类。
它的实例包含下面属性。
Attribute | Description |
---|---|
id | 64-bit OpenFlow Datapath ID. Only available for ryu.controller.handler.MAIN_DISPATCHER phase. |
ofproto | A module which exports OpenFlow definitions, mainly constants appeared in the specification, for the negotiated OpenFlow version. For example, ryu.ofproto.ofproto_v1_0 for OpenFlow 1.0. |
ofproto_parser | A module which exports OpenFlow wire message encoder and decoder for the negotiated OpenFlow version. For example, ryu.ofproto.ofproto_v1_0_parser for OpenFlow 1.0. |
ofproto_parser.OFPxxxx(datapath,…) | A callable to prepare an OpenFlow message for the given switch. It can be sent with Datapath.send_msg later. xxxx is a name of the message. For example OFPFlowMod for flow-mod message. Arguemnts depend on the message. |
set_xid(self, msg) | Generate an OpenFlow XID and put it in msg.xid. |
send_msg(self, msg) | Queue an OpenFlow message to send to the corresponding switch. If msg.xid is None, set_xid is automatically called on the message before queueing. |
send_packet_out | deprecated |
send_flow_mod | deprecated |
send_flow_del | deprecated |
send_delete_all_flows | deprecated |
send_barrier | Queue an OpenFlow barrier message to send to the switch. |
send_nxt_set_flow_format | deprecated |
is_reserved_port | deprecated |
ryu.controller.event.EventBase
class ryu.controller.event.EventBase |
是所有事件类的 基类。 一个Ryu 可以通过它定义自己的事件。
ryu.controller.event.EventRequestBase
class ryu.controller.event.EventRequestBase |
The base class for synchronous request for RyuApp.send_request.
ryu.controller.event.EventReplyBase
class ryu.controller.event.EventReplyBase(dst) |
The base class for synchronous request reply for RyuApp.send_reply.
ryu.controller.ofp_event.EventOFPStateChange
class ryu.controller.ofp_event.EventOFPStateChange(dp) |
一个事件类,用于 判断条件 改变的通知。
改变negotiation之后,这个事件的实例被发送给 observer ,它的实例只好包含datapath,
ryu.controller.ofp_event.EventOFPPortStateChange
class ryu.controller.ofp_event.EventOFPPortStateChange(dp, reason, port_no) |
一个通知交换机端口状态改变的事件类。 这个事件行为像EventOFPPortStatus。
但是在更新了Datapath实例端口目录之后,Ryu将会发送这个事件, 这个使劲按的实例,至少包含下面的属性。
datapath ——— 谁的端口状态改变了
reason 原因 one of OFPPR_*
port_no 几号端口状态改变了。
ryu.controller.dpset.EventDP
class ryu.controller.dpset.EventDP(dp, enter_leave) |
通知 一个 交换机的连接与断开的事件类。
当然, 可以从 上一个事件类得到同样的消息。 它至少包含下面三个属性。
属性 | 描述 |
---|---|
dp | 哪个交换机 |
enter | True, 交换机连接到控制器。 False 断开连接 |
port | 端口实例的列表 |
ryu.controller.dpset.EventPortDelete
class ryu.controller.dpset.EventPortDelete(dp, port) |
事件类: 是交换机端口状态为 “DELETE” 的通知。
当一个端口从一个交换机上被移除时,会产生这个事件。 当然,可以从
ryu.controller.ofp_event.EventOFPPortStatus 得到相同的通知。 它的实例至少包含下面的属性。
属性 | 描述 |
---|---|
dp | 哪个交换机 |
port | 哪个端口 |
ryu.controller.dpset.EventPortModify
class ryu.controller.dpset.EventPortModify(dp, new_port) |
一个事件类, 当端口(一些属性)状态被改变时。 当然它至少包含dp,和port两个属性。
ryu.controller.network.EventNetworkPort
class ryu.controller.network.EventNetworkPort(network_id, dpid, port_no, add_del) |
当一个端口 被 调入, 或者被移除 从一个网络中(通过 REST API)。会发出这个事件。
Attribute | Description |
---|---|
network_id | Network ID |
dpid | OpenFlow Datapath ID of the switch to which the port belongs. |
port_no | OpenFlow port number of the port |
add_del | True for adding a port. False for removing a port. |
ryu.controller.network.EventNetworkDel
class ryu.controller.network.EventNetworkDel(network_id) |
当一个网络被删除时(通过REST API),生成这个事件。 最少包含 network_id 这个属性。
ryu.controller.network.EventMacAddress
class ryu.controller.network.EventMacAddress(dpid, port_no, network_id, mac_address, add_del) |
当一个中断的MAC地址被 REST API 更新时, 产生这个事件。
Attribute | Description |
---|---|
network_id | Network ID |
dpid | OpenFlow Datapath ID of the switch to which the port belongs. |
port_no | OpenFlow port number of the port |
mac_address | The old MAC address of the port if add_del is False. Otherwise the new MAC address. |
add_del | False if this event is a result of a port removal. Otherwise True. |
ryu.controller.tunnels.EventTunnelKeyAdd
class ryu.controller.tunnels.EventTunnelKeyAdd(network_id, tunnel_key) |
This event is generated when a tunnel key is registered or updated by the REST API. An instance has at least the following attributes.
Attribute | Description |
---|---|
network_id | Network ID |
tunnel_key | Tunnel Key |
ryu.controller.tunnels.EventTunnelKeyDel
class ryu.controller.tunnels.EventTunnelKeyDel(network_id, tunnel_key) |
An event class for tunnel key registration.
This event is generated when a tunnel key is removed by the REST API. An instance has at least the following attributes.
Attribute | Description |
---|---|
network_id | Network ID |
tunnel_key | Tunnel Key |
ryu.controller.tunnels.EventTunnelPort
class ryu.controller.tunnels.EventTunnelPort(dpid, port_no, remote_dpid, add_del) |
An event class for tunnel port registration.This event is generated when a tunnel port is added or removed by the REST API.
An event class for tunnel port registration.This event is generated when a tunnel port is added or removed by the REST API.
Attribute | Description |
---|---|
dpid | OpenFlow Datapath ID |
port_no | OpenFlow port number |
remote_dpid | OpenFlow port number of the tunnel peer |
add_del | True for adding a tunnel. False for removal. |