On Nov 12, 2013, at 5:08 AM, Giannis Sapountzis <[email protected]> wrote:

> Thank you Murphy.
> 
> I noticed that you also added this info in the POX wiki yesterday. That 
> should be really helpful. Much appreciated.

And yet more on revent in the wiki today. :)

> On Nov 11, 2013, at 9:26 PM, Murphy McCauley <[email protected]> 
> wrote:
> 
>> On Nov 11, 2013, at 4:31 AM, Giannis Sapountzis <[email protected]> 
>> wrote:
>> 
>>> Hello everyone. 
>>> 
>>> I'm looking for some explanation on event handling in POX. 
>> 
>> There's quite a bit of explanation on this subject in the POX manual and in 
>> the reference (docstrings).
>> 
>>> Lets say that i have 2 components registered in core with names Component_1 
>>> and Component_2. Component_1 raises some event called Event_1.
>> 
>> Just a sidenote: components and events in POX are both classes, and POX's 
>> naming convention uses TitleCase for these -- with no underscores. Names 
>> with underscores like yours should work fine with the more explicit 
>> functions (e.g., addListener), but you may find that some of the convenience 
>> features of POX expect POX style naming (e.g., listen_to_dependencies).
>> 
>>> I want to handle some events in Component_2 both from core.openflow and 
>>> from core.Component_1.
>>> 
>>> How should i name the handler methods in Component_2 and how should i 
>>> register the listeners? Is the following example correct?
>> 
>> As described in the manual, you can name them whatever you want if you set 
>> up the bindings yourself using addListener() or addListenerByName().  If you 
>> want to use addListeners(), you have to name them _handle_<EventName> or 
>> _handle_<Prefix>_<EventName>, where EventName is the name of the event type 
>> and Prefix is the prefix as specified in the call to addListeners.
>> 
>> If you want to use core.listen_to_dependencies, you have to name them 
>> _handle_<ObjectOnCore>_<EventName> by default, where ObjectOnCore is the 
>> name of the object (which is registered on core) which is sourcing the 
>> events you want. (More on this below.)
>> 
>>> In Component_2:
>>> 
>>> __init__(self):
>>>     core.Component_1.addListeners(self) 
>>>     core.openflow.addListeners(self)
>>> 
>>> def _handle_openflow_ConnectionUp(self):
>>>     ….
>>> 
>>> def _handle_Component_1_Event_1(self):
>>>     ….
>> 
>> Since you're using addListeners here with no prefix, it'd just be 
>> _handle_ConnectionUp.  You could use the prefix argument of addListeners() 
>> to make it _handle_WhateverYouLike_ConnectionUp.  If you're going to be 
>> handling events from multiple sources, this isn't a bad idea (to make sure 
>> that two sources don't try to fire the same handler).  
>> listen_to_dependencies() just automatically makes the prefix the name of the 
>> component on core.
>> 
>>> Secondly, i only want a component to start handling events afar having 
>>> received a notification from another component. Can i add the listeners 
>>> only after i have "caught" an event? Something like the following:
>>> 
>>> __init__(self):
>>>     core.Component_1.addListeners(self) 
>>> 
>>> def _handle_Component_1_Event_1(self):
>>>     core.openflow.addListeners(self)
>> 
>> Indeed, you can do this (though the above example has prefix/name issues).
>> 
>>> Third, can someone explain to me what the core.listen_to_dependencies does?
>> 
>> Here's the docstring.  You can get it yourself by reading the code, starting 
>> POX with the Python shell (py component) and doing 
>> "help(core.listen_to_dependencies)", or by building the pydoc or Sphinx 
>> documentation (neither of which are as accessible/used as they should be, 
>> but see POX's custom pydoc in the tools directory for the former and the 
>> pox-doc repo for the latter).
>> 
>> listen_to_dependencies(self, sink, components=None, attrs=True, 
>> short_attrs=False, listen_args={}) method of pox.core.POXCore instance
>>   Look through *sink* for handlers named like _handle_component_event.
>>   Use that to build a list of components, and append any components
>>   explicitly specified by *components*.
>> 
>>   listen_args is a dict of "component_name"={"arg_name":"arg_value",...},
>>   allowing you to specify additional arguments to addListeners().
>> 
>>   When all the referenced components are registered, do the following:
>>   1) Set up all the event listeners
>>   2) Call "_all_dependencies_met" on *sink* if it exists
>>   3) If attrs=True, set attributes on *sink* for each component
>>      (e.g, sink._openflow_ would be set to core.openflow)
>> 
>>   For example, if topology is a dependency, a handler for topology's
>>   SwitchJoin event must be defined as so:
>>      def _handle_topology_SwitchJoin (self, ...):
>> 
>> 
>> -- Murphy
> 

Reply via email to