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.

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.

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
>
>

Reply via email to