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%
就业率
