保留 Datapath#ports 以保持兼容性
Datapath#ports is kept for compatibility
我正在努力让 ryu 运行,尤其是拓扑发现。
现在我运行在 ryu/topology/dumper.py
下安装演示应用程序,它应该转储所有拓扑事件。我在 ryu/topology
目录中,运行 使用 ryu-manager dumper.py
。 ryu-manager的版本是2.23.2.
启动后不久,它给我这个错误:
/usr/local/lib/python2.7/dist-packages/ryu/topology/switches.py:478: UserWarning:
Datapath#ports is kept for compatibility with the previous openflow versions (< 1.3).
This not be updated by EventOFPPortStatus message. If you want to be updated,
you can use 'ryu.controller.dpset' or 'ryu.topology.switches'.
for port in dp.ports.values():
对我来说真正奇怪的是它建议使用 ryu.topology.switches
,但该错误是由该文件的第 478 行触发的!
有问题的函数是这样的:
class Switches(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION, ofproto_v1_2.OFP_VERSION,
ofproto_v1_3.OFP_VERSION, ofproto_v1_4.OFP_VERSION]
_EVENTS = [event.EventSwitchEnter, event.EventSwitchLeave,
event.EventPortAdd, event.EventPortDelete,
event.EventPortModify,
event.EventLinkAdd, event.EventLinkDelete]
DEFAULT_TTL = 120 # unused. ignored.
LLDP_PACKET_LEN = len(LLDPPacket.lldp_packet(0, 0, DONTCARE_STR, 0))
LLDP_SEND_GUARD = .05
LLDP_SEND_PERIOD_PER_PORT = .9
TIMEOUT_CHECK_PERIOD = 5.
LINK_TIMEOUT = TIMEOUT_CHECK_PERIOD * 2
LINK_LLDP_DROP = 5
#...
def _register(self, dp):
assert dp.id is not None
self.dps[dp.id] = dp
if dp.id not in self.port_state:
self.port_state[dp.id] = PortState()
for port in dp.ports.values(): # THIS LINE
self.port_state[dp.id].add(port.port_no, port)
有没有其他人遇到过这个问题?我该如何解决?
我以前遇到过这个问题,但我只是忽略了它,到目前为止一切都按预期进行。
如果您正在尝试学习拓扑,我建议您使用 ryu.topology.api
。即
from ryu.topology.api import get_switch, get_link
有这个tutorial。但是,缺少一些东西。
这是我目前的情况:Controller.py
在 Controller.py 中,两个函数 get_switch(self, None)
和 get_link(self, None)
将为您提供链接和开关列表。
我 运行 遇到了同样的问题(取决于您的应用程序,也许这不是问题,只是一个您可以忽略的警告)。这是我在 find . -type f | xargs grep "ports is kept"
之后得出的结论
此警告是在 ryu.topology.switches
中通过调用文件 ryu/controller/controller.py
.
的 class Datapath
中的 _get_ports()
触发的
class Datapath(ofproto_protocol.ProtocolDesc):
#......
def _get_ports(self):
if (self.ofproto_parser is not None and
self.ofproto_parser.ofproto.OFP_VERSION >= 0x04):
message = (
'Datapath#ports is kept for compatibility with the previous '
'openflow versions (< 1.3). '
'This not be updated by EventOFPPortStatus message. '
'If you want to be updated, you can use '
'\'ryu.controller.dpset\' or \'ryu.topology.switches\'.'
)
warnings.warn(message, stacklevel=2)
return self._ports
def _set_ports(self, ports):
self._ports = ports
# To show warning when Datapath#ports is read
ports = property(_get_ports, _set_ports)
我的理解是,如果警告来自ryu.topology.switches
或ryu.controller.dpset
,可以忽略;因为这两个 类 会为您处理事件。但是如果直接使用Datapath
,端口状态不会自动更新。如果我错了,请大家指正。
class Switches(app_manager.RyuApp):
#......
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
我正在努力让 ryu 运行,尤其是拓扑发现。
现在我运行在 ryu/topology/dumper.py
下安装演示应用程序,它应该转储所有拓扑事件。我在 ryu/topology
目录中,运行 使用 ryu-manager dumper.py
。 ryu-manager的版本是2.23.2.
启动后不久,它给我这个错误:
/usr/local/lib/python2.7/dist-packages/ryu/topology/switches.py:478: UserWarning:
Datapath#ports is kept for compatibility with the previous openflow versions (< 1.3).
This not be updated by EventOFPPortStatus message. If you want to be updated,
you can use 'ryu.controller.dpset' or 'ryu.topology.switches'.
for port in dp.ports.values():
对我来说真正奇怪的是它建议使用 ryu.topology.switches
,但该错误是由该文件的第 478 行触发的!
有问题的函数是这样的:
class Switches(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION, ofproto_v1_2.OFP_VERSION,
ofproto_v1_3.OFP_VERSION, ofproto_v1_4.OFP_VERSION]
_EVENTS = [event.EventSwitchEnter, event.EventSwitchLeave,
event.EventPortAdd, event.EventPortDelete,
event.EventPortModify,
event.EventLinkAdd, event.EventLinkDelete]
DEFAULT_TTL = 120 # unused. ignored.
LLDP_PACKET_LEN = len(LLDPPacket.lldp_packet(0, 0, DONTCARE_STR, 0))
LLDP_SEND_GUARD = .05
LLDP_SEND_PERIOD_PER_PORT = .9
TIMEOUT_CHECK_PERIOD = 5.
LINK_TIMEOUT = TIMEOUT_CHECK_PERIOD * 2
LINK_LLDP_DROP = 5
#...
def _register(self, dp):
assert dp.id is not None
self.dps[dp.id] = dp
if dp.id not in self.port_state:
self.port_state[dp.id] = PortState()
for port in dp.ports.values(): # THIS LINE
self.port_state[dp.id].add(port.port_no, port)
有没有其他人遇到过这个问题?我该如何解决?
我以前遇到过这个问题,但我只是忽略了它,到目前为止一切都按预期进行。
如果您正在尝试学习拓扑,我建议您使用 ryu.topology.api
。即
from ryu.topology.api import get_switch, get_link
有这个tutorial。但是,缺少一些东西。
这是我目前的情况:Controller.py
在 Controller.py 中,两个函数 get_switch(self, None)
和 get_link(self, None)
将为您提供链接和开关列表。
我 运行 遇到了同样的问题(取决于您的应用程序,也许这不是问题,只是一个您可以忽略的警告)。这是我在 find . -type f | xargs grep "ports is kept"
此警告是在 ryu.topology.switches
中通过调用文件 ryu/controller/controller.py
.
class Datapath
中的 _get_ports()
触发的
class Datapath(ofproto_protocol.ProtocolDesc):
#......
def _get_ports(self):
if (self.ofproto_parser is not None and
self.ofproto_parser.ofproto.OFP_VERSION >= 0x04):
message = (
'Datapath#ports is kept for compatibility with the previous '
'openflow versions (< 1.3). '
'This not be updated by EventOFPPortStatus message. '
'If you want to be updated, you can use '
'\'ryu.controller.dpset\' or \'ryu.topology.switches\'.'
)
warnings.warn(message, stacklevel=2)
return self._ports
def _set_ports(self, ports):
self._ports = ports
# To show warning when Datapath#ports is read
ports = property(_get_ports, _set_ports)
我的理解是,如果警告来自ryu.topology.switches
或ryu.controller.dpset
,可以忽略;因为这两个 类 会为您处理事件。但是如果直接使用Datapath
,端口状态不会自动更新。如果我错了,请大家指正。
class Switches(app_manager.RyuApp):
#......
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):