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

Reply via email to