我是 python 新手。我正在尝试开发和 openflow 应用程序。我开始的应用程序是以下文件。如您所见,它实现了一个简单的以太网交换机。
https://github.com/osrg/ryu/blob/master/ryu/app/simple_switch.py
现在我有另一个文件
https://github.com/osrg/ryu/blob/master/ryu/topology/api.py
看起来它公开了在拓扑中返回链接和切换信息的功能。
如果我尝试在 simple_switch.py 的 init() 中调用如下函数,它会返回错误吗?
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {}
s_list = get_all_switch(app_manager)
这是我得到的错误。
loading app ryu/app/simple_switch.py
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler of OFPHandler
instantiating app ryu/app/simple_switch.py of SimpleSwitch
Traceback (most recent call last):
File "/usr/local/bin/ryu-manager", line 9, in <module>
load_entry_point('ryu==3.8', 'console_scripts', 'ryu-manager')()
File "/usr/local/lib/python2.7/dist-packages/ryu/cmd/manager.py", line 73, in main
services.extend(app_mgr.instantiate_apps(**contexts))
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 434, in instantiate_apps
self._instantiate(app_name, cls, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 420, in _instantiate
app = cls(*args, **kwargs)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 35, in __init__
s_list = get_all_switch(app_manager)
NameError: global name 'get_all_switch' is not defined
我的问题如下。
1) 我可以使用 ryu/topology/api.py 中定义的 -get_all_switch() 和 -get_all_link() 获取有关我的 mininet 拓扑的拓扑信息吗?
2)如果是,为什么上面的代码没有按预期工作?
我在这里问是因为我对 python 的工作知识不是很好。我希望能够在 simple_switch.py 中使用 topology/api.py 中的函数
我在应用程序 simple_switch.py 中的导入行如下
import logging
import struct
from ryu.base import app_manager
from ryu.controller import mac_to_port
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
from ryu.lib.mac import haddr_to_bin
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
根据答案 1 更新:
我修改了我的代码如下:
from ryu.base import app_manager
from ryu.controller import mac_to_port
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
from ryu.lib.mac import haddr_to_bin
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
import ryu.topology.api
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {}
s_list = ryu.topology.api.get_all_switch(app_manager.RyuApp)
我现在收到一个新错误:
loading app ryu/app/simple_switch.py
loading app ryu.topology.switches
loading app ryu.controller.ofp_handler
loading app ryu.controller.ofp_handler
instantiating app ryu.topology.switches of Switches
instantiating app ryu.controller.ofp_handler of OFPHandler
instantiating app ryu/app/simple_switch.py of SimpleSwitch
Traceback (most recent call last):
File "/usr/local/bin/ryu-manager", line 9, in <module>
load_entry_point('ryu==3.8', 'console_scripts', 'ryu-manager')()
File "/usr/local/lib/python2.7/dist-packages/ryu/cmd/manager.py", line 73, in main
services.extend(app_mgr.instantiate_apps(**contexts))
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 434, in instantiate_apps
self._instantiate(app_name, cls, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 420, in _instantiate
app = cls(*args, **kwargs)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 36, in __init__
s_list = ryu.topology.api.get_all_switch(app_manager.RyuApp)
File "/usr/local/lib/python2.7/dist-packages/ryu/topology/api.py", line 26, in get_all_switch
return get_switch(app)
File "/usr/local/lib/python2.7/dist-packages/ryu/topology/api.py", line 21, in get_switch
rep = app.send_request(event.EventSwitchRequest(dpid))
TypeError: unbound method send_request() must be called with RyuApp instance as first argument (got EventSwitchRequest instance instead)