Порты Datapath# сохранены для совместимости

Я пытаюсь запустить рю, особенно открытие топологии.

Теперь я запускаю демонстрационное приложение для этого под ryu/topology/dumper.py, которое должно выводить все события топологии. Я нахожусь в каталоге ryu/topology и запускаю его с помощью ryu-manager dumper.py. Версия рю-менеджера 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)

Кто-нибудь еще сталкивался с этой проблемой раньше? Как я могу это исправить?


person Dakkaron    schedule 15.07.2015    source источник
comment
Дайте мне знать, помог ли приведенный ниже ответ.   -  person Ehsan Ab    schedule 15.07.2015


Ответы (2)


Я столкнулся с той же проблемой (в зависимости от вашего приложения, возможно, это не проблема, а просто предупреждение, которое вы можете игнорировать). Вот что я понял после find . -type f | xargs grep "ports is kept"

Это предупреждение вызывается в ryu.topology.switches вызовом _get_ports() в class Datapath файла ryu/controller/controller.py.

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):
person lqu    schedule 11.09.2015

Я сталкивался с этой проблемой раньше, но просто игнорировал ее, и до сих пор все работало так, как ожидалось.

Если вы пытаетесь изучить топологию, я бы рекомендовал использовать ryu.topology.api. то есть

from ryu.topology.api import get_switch, get_link

Это руководство. Однако некоторые вещи отсутствуют.

Вот что у меня есть: Controller.py

В Controller.py две функции get_switch(self, None) и get_link(self, None) дадут вам список ссылок и коммутаторов.

person Ehsan Ab    schedule 15.07.2015
comment
Спасибо за ответ! Я не могу проверить это прямо сейчас. Я свяжусь с вами, когда смогу проверить это. Кажется, полезно! - person Dakkaron; 16.07.2015