RYU应用程序API

来源:互联网 发布:js滚轮时间选择控件 编辑:程序博客网 时间:2024/06/08 18:50

  本文分为两大部分,一个是RYU应用程序编程模型,另一个是事件类。
  首先来讲第一部分,RYU应用程序是实现各种功能的单线程实体,事件是各实体间的消息。应用程序彼此间发送异步事件,还包括一些RYU内部事件源,这些内部事件源并不是RYU应用程序,比如openflow控制器就是这样的事件源。尽管一个事件可以是一些python对象,但最好不要使用一些应用程序间的复杂对象。 每个RYU应用程序都有一个事件接收队列。事件是先进先出,保证事件的顺序。每个应用程序都有一个事件处理线程。线程通过事件的出队列和调用事件类型的专用事件处理程序来保持接收队列的流动。事件处理程序在阻塞时应该小心,因为它是在事件处理线程的上下文中调用的。当事件处理程序被阻塞时,Ryu应用程序将不会处理其他事件。 在应用程序之间,有一些事件用于实现同步的应用程序间调用。尽管此类请求使用与普通事件相同的机制,但他们的响应被放在一个用于事务的队列中,以避免死锁。虽然线程和队列目前由eventlet/greenlet实现,但是在ryu应用程序中直接使用它们是非常不鼓励的。 contexts(上下文)是在ryu应用程序中共享的普通python对象。对于新代码,不鼓励使用上下文。 创建一个ryu应用程序,Ryu应用程序是一个python模块,它定义了ryu.base.app_manager.ryuapp的子类。如果在一个模块中定义了两个或多个类,第一个(按名称顺序)将由app_manager选择。Ryu应用程序是单例的:只支持给定应用程序的单个实例。 观察事件,Ryu应用程序使用ryu.controller.handler.set_ev_cls decorator来监听特定的事件。 生成事件,Ryu应用程序通过调用特定的ryu.base.app_manager可以产生事件,RyuApp的方法有send_event或者send_event_to_obervers.
  接下来我们来研究第二部分事件类。 事件类描述系统中生成的Ryu事件,这里约定一下,事件类的名称以Event开头,事件是由Ryu应用程序的核心部分生成的。Ryu应用程序可以通过使用ryu.controller.handler.set_ev_cls装饰器提供的处理方法注册一个特定类型的事件。 openflows事件类,ryu.controller.ofp_event 模块导出的事件类是用来描述从连接的交换机接收的openflow消息。约定一下,这些事件类被命名为ryu.controller.ofp_event.EventOFPxxxx,在这里,xxxx是相应的openflow消息的名称,比如,EventOFPPacketIn对应packet-in消息。Ryu的openflow控制器部分可以自动解析来自交换机的消息,并且发送这些事件给Ryu应用程序,这些Ryu应用程序使用ryu.controller.handler.set_ev_cls传递消息。openflow事件类是ryu.controller.ofp_event.EventOFPMsgBase(msg)的子类,该基类至少有这样几个特征,msg是一个对象,用来描述相应的openflow消息,msg.datapath是一个ryu.controller.controller.Datapath的实体,用来描述我们收到openflow消息的交换机,timestamp是当Datapath实体产生事件时的时间戳。msg对象有一些额外的成员,这些成员的值是从原始的openflow消息中提取出来的。 当然还有一些非常重要的事件类。

ryu.base.app_manager.RyuAppryu.controller.handler.set_ev_clsryu.controller.controller.Datapathryu.controller.event.EventBaseryu.controller.event.EventRequestBaseryu.controller.event.EventReplyBaseryu.controller.ofp_event.EventOFPStateChangeryu.controller.ofp_event.EventOFPPortStateChangeryu.controller.dpset.EventDPryu.controller.dpset.EventPortAddryu.controller.dpset.EventPortDeleteryu.controller.dpset.EventPortModifyryu.controller.network.EventNetworkPortryu.controller.network.EventNetworkDelryu.controller.network.EventMacAddressryu.controller.tunnels.EventTunnelKeyAddryu.controller.tunnels.EventTunnelKeyDelryu.controller.tunnels.EventTunnelPort
原创粉丝点击