RyuBook1.0案例三:REST Linkage

 

REST Linkage

该小结主要介绍如何添加一个REST Link 函数

RYU本身提供了一个类似WSGI的web服务器功能。借助这个功能,我们可以创建一个REST API。
基于创建的REST API,可以快速的将RYU系统与其他系统或者是浏览器相连接,非常实用的一个功能。

程序解析

在案例中,实现了两个类

  • SimpleSwitchRest13
    • 继承SimpleSwitch13的功能,即具备父类的三层交换机的基本功能。
    • 注册WSGI服务
    • 配置mac_to_port
  • SimpleSwitchController
    • REST API功能实现的主体类
    • 返回指定交换机的mac_table
    • 更新指定的mac_table条目

SimpleSwitchRest13类实现

_CONTEXTS = {'wsgi': WSGIApplication}

该成员变量用于指明Ryu的兼容WSGI的web服务对象。

wsgi = kwargs['wsgi'] wsgi.register(SimpleSwitchController,               {simple_switch_instance_name: self})

通过上一步设置的_CONTEXTS成员变量,可以通过kwargs进行实例化一个WSGIApplication。同时使用register方法注册该服务到
controller类上。

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER) def switch_features_handler(self, ev):     super(SimpleSwitchRest13, self).switch_features_handler(ev)     datapath = ev.msg.datapath     self.switches[datapath.id] = datapath     self.mac_to_port.setdefault(datapath.id, {})

重写父类的switch_features_handler函数

  • 存储datapath到switches
  • 初始化MAC 地址表
def set_mac_to_port(self, dpid, entry):     # 获取MAC table     mac_table = self.mac_to_port.setdefault(dpid, {})          # 获取datapath,如果为None,证明没有该交换机     datapath = self.switches.get(dpid)      entry_port = entry['port']     entry_mac = entry['mac']      if datapath is not None:         parser = datapath.ofproto_parser         # 如果entry_port不在mac_table中         if entry_port not in mac_table.values():             # 下发流表             for mac, port in mac_table.items():                  # from known device to new device                 actions = [parser.OFPActionOutput(entry_port)]                 match = parser.OFPMatch(in_port=port, eth_dst=entry_mac)                 self.add_flow(datapath, 1, match, actions)                  # from new device to known device                 actions = [parser.OFPActionOutput(port)]                 match = parser.OFPMatch(in_port=entry_port, eth_dst=mac)                 self.add_flow(datapath, 1, match, actions)              # 添加entry_mac, entry_port到mac_table             mac_table.update({entry_mac: entry_port})     return mac_table

该方法将MAC地址和端口注册到指定的交换机。该方法主要被REST API的PUT方法所调用。

SimpleSwitchController类实现

@route('simpleswitch', url, methods=['GET'],            requirements={'dpid': dpid_lib.DPID_PATTERN})

借助

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信