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.