Ein Hinweis, dass ich es schwer hatte, ihn in der ryu
Python Openflow-Bibliothek zu finden, da er im Tutorial aufgeführt zu sein scheint.
Schreiben Sie es zunächst in "ryu" als "ereignisgesteuerte" Anwendung. Ereignisse sind abgeleitete Klassen von ryu.event.EventBase
.
Beim Schreiben einer Openflow-Anwendung wird häufig "first" gesagt. Mit ryu
frage ich mich, welches Ereignis ich zu diesem Zeitpunkt verwenden soll, aber das scheint gut zu sein.
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")
Ausführungsbeispiel. Unter Ubuntu können Sie es beispielsweise ausführen, indem Sie das Paket "ryu-bin" einschließen.
ryu-manager --config-file=/dev/null app.py
Event
Da Ryu ereignisgesteuert ist, beginnt die Geschichte nicht, ohne das Ereignis zu kennen. Unter ryu.controller, das standardmäßig verwendet wird, gibt es die folgenden Ereignisse. Zunächst werde ich sie kurz auflisten. Ich werde später einen Kommentar schreiben.
from repräsentiert die Herausgeberseite der Veranstaltung und to repräsentiert die Abonnentenseite.
ryu.controller.ofp_event
Ereignisse mit einer 1: 1-Entsprechung zu relativ offenen Protokollnachrichten werden behandelt.
Datenpfadstatus Benachrichtigungssystem
Das Folgende wird dynamisch als Unterklasse von "EventOFPMsgBase" generiert. Alle Ereignisse werden aus der recv-Schleife generiert.
Portstatus Benachrichtigungssystem. Wird nach EventOFPPortStatus ausgegeben.
ryu.controller.dpset
openflow-Protokoll Ein Ereignis, mit dem Sie das Aktivieren / Deaktivieren von Datenpfaden und den Status eines Ports auf einer höheren Ebene als direkt behandeln können. Es kann als DPSet-Dienst verwendet werden.
Zusammengenommen werden beim Anschließen an einen Openflow 1.3-Switch die folgenden Ereignisse automatisch abgespielt.
--TCP-Verbindung hergestellt
Die sogenannten Einschaltbereitschaftspunkte sind also "EventOFPStateChange", "MAIN_DISPATCHER" oder "EventDP".
Service
Wie beim obigen DPSet können Ereignisquellen jetzt als Dienste hinzugefügt werden. Dienste werden durch Zeichenfolgen in "ryu" gekennzeichnet. Die folgenden Dienste sind in Ryu vorhanden. Diese werden normalerweise automatisch aktiviert, wenn Sie einen Ereignishandler registrieren und ihn verwenden (set_ev_cls
).
Zum Beispiel, um ryu.controller.dpset
zu verwenden:
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)
Das folgende Beispiel ist auch eine Ameise als Einschaltbereitschaftspunkt unter Verwendung von 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
Als nicht bedientes Formular können Sie auch eine Klasse registrieren und verwenden, die explizit von "RyuApp._CONTEXTS" abhängt. Wird beim Start als Singleton generiert und über kwargs in RyuApp .__ init__
übergeben.
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)
In diesem Beispiel wird kein Handler für die Openflow-Nachricht festgelegt. Beenden Sie den Vorgang nach Abschluss der Initialisierung. Das ryu
selbst ist ein Ereignis-Hub, und das Openflow-Protokoll scheint mit der Idee erstellt worden zu sein, dass es eine der Anwendungen ist, die von Ereignissen in der Kategorie ofp_event
gesteuert werden.