Addendum au didacticiel Ryu

Une note que j'ai eu du mal à le trouver dans la bibliothèque openflow python ryu car il semble être répertorié dans le tutoriel.

Tout d'abord, dans ryu, écrivez-le comme une application" pilotée par les événements ". Les événements sont des classes dérivées de ryu.event.EventBase.

Lors de l'écriture d'une application openflow, il est courant de dire «d'abord». Avec ryu, je me demande quel événement utiliser en ce moment, mais cela semble être une bonne chose.

app.py


from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import set_ev_cls, MAIN_DISPATCHER

class App1(app_manager.RyuApp):
    @set_ev_cls(ofp_event.EventOFPStateChange, MAIN_DISPATCHER)
    def on_switch_ready(self, ev):
        assert isinstance(ev, ofp_event.EventOFPStateChange)
        print("switch ready")

Exemple d'exécution. Par exemple, sur Ubuntu, vous pouvez l'exécuter en incluant le package ryu-bin.

ryu-manager --config-file=/dev/null app.py

Event

Puisque ryu est axé sur les événements, l'histoire ne commence pas sans connaître l'événement. Sous ryu.controller, qui est utilisé en standard, il y a les événements suivants. Tout d'abord, je vais les énumérer brièvement. J'écrirai un commentaire plus tard.

from représente le côté éditeur de l'événement et to représente le côté abonné.

ryu.controller.ofp_event

Les événements avec une correspondance 1: 1 avec des messages de protocole à flux relativement ouvert sont traités.

système de notification d'état du chemin de données

Ce qui suit est généré dynamiquement en tant que sous-classe de ʻEventOFPMsgBase`. Tous les événements sont générés à partir de la boucle recv.

Système de notification de l'état du port. Publié après EventOFPPortStatus.

ryu.controller.dpset

protocole openflow Un événement qui vous permet de gérer l'activation / la désactivation du chemin de données et l'état d'un port à une couche plus élevée que directement. Il peut être utilisé comme service DPSet.

Commentaire d'événement

Pris ensemble, lors de la connexion à un commutateur openflow 1.3, les événements suivants se dérouleront automatiquement:

Ainsi, les soi-disant points prêts pour le commutateur sont ʻEventOFPStateChange, MAIN_DISPATCHER ou ʻEventDP.

Service

Comme le DPSet ci-dessus, les sources d'événements peuvent maintenant être ajoutées en tant que services. Les services sont identifiés par des chaînes à l'intérieur de ryu. Les services suivants existent dans ryu. Ceux-ci sont généralement activés automatiquement lorsque vous enregistrez un gestionnaire d'événements et commencez à l'utiliser (set_ev_cls).

Par exemple, pour utiliser ryu.controller.dpset:

app2.py


from ryu.base import app_manager
from ryu.controller import dpset, ofp_event
from ryu.controller.handler import set_ev_cls

class App2(app_manager.RyuApp):
    @set_ev_cls(dpset.EventDP)
    def on_dp_change(self, ev):
        print("datapath event", ev.enter)

L'exemple suivant est également une fourmi en tant que point de commutation prêt à l'aide de Service.

app3.py


import ryu.topology.event
from ryu.base import app_manager
from ryu.controller.handler import set_ev_cls

class App3(app_manager.RyuApp):
    @set_ev_cls(ryu.topology.event.EventSwitchEnter)
    def on_enter(self, ev):
        print("switch ready")

Dependent singleton

En tant que formulaire non desservi, vous pouvez également vous inscrire et utiliser une classe qui dépend explicitement de RyuApp._CONTEXTS. Généré en tant que singleton au démarrage et passé via kwargs dans RyuApp .__ init__.

app4.py


from ryu.base import app_manager

class A(object):
   def __init__(self):
       print("init A")

class App4(app_manager.RyuApp):
    _CONTEXTS = dict(a=A)
    def __init__(self, *args, **kwargs):
        super(App4, self).__init__(*args, **kwargs)
        print(kwargs)

Cet exemple ne définit pas de gestionnaire pour le message openflow, quittez donc une fois l'initialisation terminée. Le ryu lui-même est un hub d'événements, et le protocole openflow semble avoir été créé avec l'idée qu'il s'agit d'une des applications pilotées par les événements de la catégorie ʻofp_event`.

Recommended Posts

Addendum au didacticiel Ryu
didacticiel sqlalchemy
Tutoriel PyODE 2
Tutoriel Python
Tutoriel PyODE 1
Tutoriel PyODE 3
Tutoriel du didacticiel TensorFlow