I added the necessary arguments in the definition of the Event and it worked. Thank you very much!
About the way the events are raised, i am trying to find another solution that doesn't involve the use of of_01. I only used this approach because out of the many solutions i tried, only this one worked. I looked up a bit and i noticed that the GoingUp Event in core.py is raised like this:"core.raiseEvent(GoingUp*() *) " So at first i thought that i found the mistake i made in my previous attempts and did some tweaking in the _handle_PacketIn of the l2_learning module: "core._eventMixin_events.add(CustomEvent)" "core.raiseEvent(CustomEvent(event.connection, msg))" Nothing happened. However if i delete the first command i get an error saying what i expected, that i haven't add the CustomEvent to the event set. Also if i add the command "core.raiseEvent(CustomEvent(msg))" i get another error saying as expected that __init__() expects 3 arguments. If i provide the arguments needed like i did before nothing happens. The commands core.raiseEvent(CustomEvent) and/or core.raiseEvent(CustomEvent, msg) don't work without raising any errors. If i replace with core.raiseEvent(CustomEvent()) a TypeError is raised as i said above. This is a skeleton of my component: CustomModule.py: class CustomModule (EventMixin): def __init__ (self): self.listenTo(core.openflow) log.debug("...Enabling Custom Module...") def _handle_CustomEvent (self, event): log.debug(‘Event was raised!!!’) def _handle_FlowRemoved (self, event): log.debug('Flow Removed from switch: %s', event.connection) self._eventMixin_events = set([SpamSpam,]) self.raiseEvent(SpamSpam(event.connection, event.ofp)) def launch (): ''' Starting the module ''' core.registerNew(CustomModule) I tried raising the event, when a flow is removed. Nothing happens this way either. I don't know if am missing something obvious or if i should try anything else. In any case, thanks again for all your help so far, i really appreciate it. On Thu, Nov 6, 2014 at 12:30 AM, Murphy McCauley <murphy.mccau...@gmail.com> wrote: > > On Nov 5, 2014, at 2:48 AM, Adam Pavlidis <adampavli...@gmail.com> wrote: > > I also found it strange that i get no error message whatsoever. > I was always running POX with --verbose plus log.level —DEBUG, > and i did not use .raiseEventNoErrors() method. > > I haven't really given much thought on how i want the events to be > raised, i experimented a little in order to find a way that works. > > Adding the CustomEvent, in the _eventMixin set of OpenFlowNexus and > did the trick. > > In the end it doesn’t really matter for me which way the event is raised. > I have a module, with 2 distinct functions. > > 1. Flow removal that is called automatically > 2. Flow insertion that has to be manually called everywhere a new flow > is added. > > I used the same logic as FlowRemoved, PacketIn e.t.c. events/handlers, > so i added the following lines in of_01.py > > def handle_CUSTOM_EVENT (con, msg): #A >> e = con.ofnexus.raiseEvent( >> CustomEvent, con, msg) >> if e is None or e.halt != True: >> con.raiseEvent(CustomEvent, con, msg) >> > > and in order to call the above (e.g. l2_learning): > > of_01.handle_CUSTOM_EVENT(event.connection, msg) >> > > The above doesn't work unless i delete the arguments in > handle_CUSTOM_EVENT(). > Traceback is: > > File "/home/mininet/pox/pox/lib/revent/revent.py", line 234, in >> raiseEventNoErrors >> >> return self.raiseEvent(event, *args, **kw) >> >> File "/home/mininet/pox/pox/lib/revent/revent.py", line 281, in >> raiseEvent >> >> rv = event._invoke(handler, *args, **kw) >> >> File "/home/mininet/pox/pox/lib/revent/revent.py", line 159, in _invoke >> >> return handler(self, *args, **kw) >> >> File "/home/mininet/pox/pox/forwarding/l2_learning.py", line 182, in >> _handle_PacketIn >> >> of_01.handle_CUSTOM_EVENT(event.connection, msg) >> >> File "/home/mininet/pox/pox/openflow/of_01.py", line 68, in >> handle_CUSTOM_EVENT >> >> e = con.ofnexus.raiseEvent(CustomEvent, con, msg) >> >> File "/home/mininet/pox/pox/lib/revent/revent.py", line 265, in >> raiseEvent >> >> event = eventType(*args, **kw) >> >> TypeError: __init__() takes exactly 1 argument (3 given) >> > > > From what i understand raiseEvent method expects 1 argument but > receives 3. I don't understand however why handle_PACKET_IN/FLOW_REMOVED > get to .raiseEventNoErrors the exact same way, and no TypeError occurs. > > > Not quite. What it's actually talking about here is the constructor for > the event class itself. In your case, I am guessing your > CustomEvent.__init__() just took self. You'll want to add additional > parameters. As you say below, you want the match, so you'd pass that into > your event object's constructor. > > Something to keep in mind: > foo.raiseEvent(BarEvent, spam, eggs) > .. is more or less the same as... > new_event = BarEvent(spam, eggs) > foo.raiseEvent(new_event) > > The latter is perhaps a bit easier to understand, though. > > Truth is i don't need the connection part, but is necessary for my > module that the msg.match object representing the flow that is installed is > passed to the handler. > > def _handle_CustomEvent(self, msg): >> > > I don’t know if what i did is conceptually correct or if there is a > cleaner way (programming-wise). I just thought that using a separate > module instead of hard-coding the actions i need executed was better, > considering i will also be able to pass some arguments from the CLI to > the module less painfully, e.g. misc.CustomModule --<server>_<hostname>. > > I would greatly appreciate your opinion on this. > > > If there's no compelling reason, I think you shouldn't mess with > of_01/openflow at all. Keep your events within your own module. Have your > component register itself on core, and raise your two new event types on > your component instead of on the OpenFlowNexus or Connection. Other > components can listen there. > > Thanks for all your help so far, > Adam Pavlidis > > On Tue, Nov 4, 2014 at 12:42 AM, Murphy McCauley < > murphy.mccau...@gmail.com> wrote: > >> I'm a bit surprised that you're getting no result at all as opposed to, >> say, exceptions in the POX log. Have you tried turning logging to DEBUG >> level and reading through to make sure there are no hints as to what might >> be going wrong? It's possible that raiseEventNoErrors() is masking the >> exceptions. You might try at least temporarily replacing such calls with >> just plain raiseEvent(). >> >> It looks like you want these events to be raised using the same sources >> as normal OpenFlow events. Normally, sources need to be aware of the >> events they'll be raising. In your case, these sources are the Connection >> (in of_01) and OpenFlowNexus (in openflow/__init__) classes. Have you >> added your event to their set of _eventMixin_events? >> >> On Nov 3, 2014, at 2:15 AM, Adam Pavlidis <adampavli...@gmail.com> wrote: >> >> > Hello, >> > >> > i am trying to implement a controller module that handles two types of >> Events: >> > the already existing FlowRemoved and another of my own creation >> > "CustomEvent" that i will execute in various circumstances. >> > >> > I have read the section on custom events contained in the POX manual >> > ( >> https://openflow.stanford.edu/display/ONL/POX+Wiki#POXWiki-TheEventSystem%3Apox.lib.revent >> > ) >> > and have successfully executed the examples. >> > >> > I have looked up a bit how the POX raises events such as PacketIn. >> > I added the following lines of code in pox/pox/openflow/__init__.py >> > >> > class CustomEvent(Event): >> > """ >> > Our own custom event >> > """ >> > def __init__(self): >> > Event.__init__(self) >> > >> > Then i added a handler for that event in an already existing controller >> module, >> > >> > def _handle_CustomEvent (self, event): >> > log.debug('The Event was raised successfully') >> > >> > However when i manually raise the above event, >> > (e.g. during the handling of a PacketIn event in >> > forwarding.l2_learning) nothing happens. >> > I used both the method explained in the manual (creating a subclass of >> > EventMixin with _eventMixin_set=([CustomEvent], creating an instance >> > of that class and raising the event on that instance), and the >> > core.raiselater method. >> > >> > Important note: In the same module there is a handler for FlowRemoved >> > Events, that is notified without issues, when a flow is removed from the >> > switch, so i don't think there is a listener issue. >> > >> > In my efforts to find the problem i tried to experiment in >> > openflow/of_01.py and specifically in lines 85, 177 where FlowRemoved >> > and PacketIn events are raised from the Controller, i tried to force >> > raise my own >> > event when a PacketIn was supposed to be raised. >> > >> > def handle_PACKET_IN (con, msg): #A >> > e = con.ofnexus.raiseEventNoErrors(CustomEvent, con, msg) >> > if e is None or e.halt != True: >> > con.raiseEventNoErrors(CustomEvent, con, msg) >> > >> > Nothing happened either (apart from losing connectivity between the >> hosts). >> > >> > I would appreciate any help, >> > Adam Pavlidis >> >> > >