Hi Yikai,

Hmm... sounds strange...

First, could you confirm "dst" attribute is pointing to "service.py"?
  https://github.com/osrg/ryu/blob/master/ryu/topology/event.py#L77

In this case,

class EventDeleteXXRequest(event.EventRequestBase):

    def __init__(self, ...):
        super(EventDeleteXXRequest, self).__init__()
        self.dst = 'service'  # Specify your service app name
        ...

Thanks,
Iwase


On 2017年05月19日 10:56, Yikai Lin wrote:
> you are right, this was the cause. But the second problem still exists, the 
> output is as follows:
> 
> loading app test-xx.py
> require_app: service is required by test-xx
> loading app xx.service
> instantiating app xx.service of Service
> instantiating app test-xx.py of testxx
> BRICK testxx
> BRICK service
>   CONSUMES EventDeleteXXRequest
>   CONSUMES EventCreateXXRequest
> EVENT testxx->service EventCreateXXRequest
> ...service.py prints out request...
> ...testxx.py prints out reply...
> EVENT LOST testxx->service EventDeleteXXRequest
> 
> 
>> On May 18, 2017, at 9:50 PM, Iwase Yusuke <[email protected] 
>> <mailto:[email protected]>> wrote:
>>
>> Hi Yikai,
>>
>> Could you share the command you invoked?
>> If "xx/service.py" is specified by handler.register_service(), you don't
>> need to add it for "ryu-manager" argument, I guess.
>> In that case, "xx/service.py" should be automatically detected as the
>> required service.
>> If specified, "xx/service.py" will be loaded doubly, then will raise
>> AssertionError at "assert app.name not in SERVICE_BRICKS".
>>
>> # NG --> "xx/service.py" will be loaded doubly
>> $ ryu-manager test-xx.py xx/service.py
>>
>> # OK
>> $ ryu-manager test-xx.py
>>
>> Thanks,
>> Iwase
>>
>>
>> On 2017年05月19日 10:10, Yikai Lin wrote:
>>> And regarding the first problem, my PYTHONPATH is like this /path/to/myapp
>>>
>>> and the service.py is at /path/to/myapp/xx/service.py
>>>
>>> in event.py I wrote handler.register_service(‘xx.service’)
>>> in api.py I wrote app_manager.require_app(‘xx.service’, api_style=True)
>>>
>>> and the output was like this:
>>>
>>> loading app test-xx.py
>>> require_app: xx.service is required by test-xx
>>> *loading app xx/service.py*
>>> *loading app xx.service*
>>> *instantiating app xx/service.py of Service*
>>> *instantiating app xx.service of Service*
>>> Traceback (most recent call last):
>>>  File "/home/yikai/.local/bin/ryu-manager", line 11, in <module>
>>>    sys.exit(main())
>>>  File "/home/yikai/.local/lib/python2.7/site-packages/ryu/cmd/manager.py", 
>>> line 81, in main
>>>    services.extend(app_mgr.instantiate_apps(**contexts))
>>>  File 
>>> "/home/yikai/.local/lib/python2.7/site-packages/ryu/base/app_manager.py", 
>>> line 509, in instantiate_apps
>>>    self._instantiate(app_name, cls, *args, **kwargs)
>>>  File 
>>> "/home/yikai/.local/lib/python2.7/site-packages/ryu/base/app_manager.py", 
>>> line 496, in _instantiate
>>>    register_app(app)
>>>  File 
>>> "/home/yikai/.local/lib/python2.7/site-packages/ryu/base/app_manager.py", 
>>> line 62, in register_app
>>>    assert app.name not in SERVICE_BRICKS
>>> AssertionError
>>>
>>> The bolded lines are what confuse me and where the errors come from
>>>
>>> Yikai
>>>
>>>> On May 18, 2017, at 1:03 PM, Yikai Lin <[email protected] 
>>>> <mailto:[email protected]> <mailto:[email protected]>> wrote:
>>>>
>>>> Hi Iwase,
>>>>
>>>> I did actually enable --verbose and saw that the service was loaded, and I 
>>>> was able to see the first request processed. The second request however 
>>>> was lost.
>>>>
>>>> The test app looks something like this:
>>>>
>>>> from xxx import api
>>>>
>>>> def __init__(...):
>>>>    hub.spawn(_test)
>>>>
>>>> def _test(...):
>>>>    rep = api.getsomething(a,b)
>>>>    print(rep) # success
>>>>    rep = api.getsomethingelse(a,b)
>>>>    print(rep) # failure
>>>>
>>>>
>>>> On Wed, May 17, 2017 at 9:13 PM Iwase Yusuke <[email protected] 
>>>> <mailto:[email protected]> <mailto:[email protected]>> wrote:
>>>>
>>>>    Hi Yikai,
>>>>
>>>>    Sorry if I couldn't understand your question well.
>>>>
>>>>
>>>>    On 2017年05月17日 15:20, Yikai Lin wrote:
>>>>> The first problem was somehow fixed by removing xxx from that line of 
>>>>> code, so it goes handler.register_service('service)', which is weird. But 
>>>>> the second problem was not resolved.
>>>>
>>>>    The arguments of handler.register_service() is the string which is the 
>>>> "Python module path"
>>>>    from your current "sys.path".
>>>>    For example, if you set PYTHONPATH=/path/to/yourapp and service is 
>>>> placed at
>>>>    /path/to/yourapp/service.py, you need to specify just "service" to 
>>>> register_service.
>>>>
>>>>    For the second problem, if you got "EVENT LOST", this messages shows 
>>>> your application or
>>>>    service were not loaded as expected.
>>>>    Please confirm the dump of services at starting of ryu-manager with 
>>>> "--verbose" option.
>>>>    e.g.)
>>>>    $ ryu-manager --verbose ryu/app/simple_switch_13.py
>>>>    Registered VCS backend: git
>>>>    Registered VCS backend: hg
>>>>    Registered VCS backend: svn
>>>>    Registered VCS backend: bzr
>>>>    loading app ryu/app/simple_switch_13.py
>>>>    loading app ryu.controller.ofp_handler
>>>>    instantiating app ryu/app/simple_switch_13.py of SimpleSwitch13
>>>>    instantiating app ryu.controller.ofp_handler of OFPHandler
>>>>    BRICK ofp_event
>>>>      PROVIDES EventOFPSwitchFeatures TO {'SimpleSwitch13': {'config'}}
>>>>      PROVIDES EventOFPPacketIn TO {'SimpleSwitch13': {'main'}}
>>>>      CONSUMES EventOFPSwitchFeatures
>>>>      CONSUMES EventOFPHello
>>>>      CONSUMES EventOFPPortStatus
>>>>      CONSUMES EventOFPEchoRequest
>>>>      CONSUMES EventOFPErrorMsg
>>>>      CONSUMES EventOFPPortDescStatsReply
>>>>      CONSUMES EventOFPEchoReply
>>>>    BRICK SimpleSwitch13
>>>>      CONSUMES EventOFPSwitchFeatures
>>>>      CONSUMES EventOFPPacketIn
>>>>
>>>>    Thanks,
>>>>    Iwase
>>>>
>>>>
>>>>>
>>>>> On Wed, May 17, 2017 at 2:15 AM Yikai Lin <[email protected] 
>>>>> <mailto:[email protected]> <mailto:[email protected]> <mailto:[email protected] 
>>>>> <mailto:[email protected]>>> wrote:
>>>>>
>>>>>    Hi,
>>>>>
>>>>>    I was trying to wrote an "topology" like service app that exposes APIs 
>>>>> for other applications. So I started from mimicing the topology app, and 
>>>>> I created the api.py, event.py and the main file service.py. I have 
>>>>> another test program that basically calls the api and sends several 
>>>>> sequential requests to the service app and it basically just returns a 
>>>>> reply for the test program to print out. I ran into some issues:
>>>>>
>>>>>    1. I didn't put the codes under ryu's folder, I actually added my 
>>>>> project path and tried to run from there, but if I added 
>>>>> "handler.register_service('myapp.xxx.service')" to event.py, ryu-manager 
>>>>> tried to load two services xxx/service and xxx.service and it couldn't 
>>>>> find the latter
>>>>>    2. If I didn't put that code in event.py, the two apps can run, but 
>>>>> only the first request was received and replied, after which an "event 
>>>>> lost" was reported. I didn't spawn any new threads in the service.py, 
>>>>> just a bunch of functions with decorators.
>>>>>
>>>>>    So my questions will be, what will be a nice way to write a low-level 
>>>>> service app and where should I place them(if that matters)? And what is 
>>>>> the right way to implement that service app?
>>>>>
>>>>>    Thanks a lot
>>>>>    Yikai
>>>>>
>>>>>
>>>>>
>>>>> ------------------------------------------------------------------------------
>>>>> Check out the vibrant tech community on one of the world's most
>>>>> engaging tech sites, Slashdot.org <http://slashdot.org/> 
>>>>> <http://Slashdot.org <http://slashdot.org/>>! http://sdm.link/slashdot
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Ryu-devel mailing list
>>>>> [email protected] <mailto:[email protected]> 
>>>>> <mailto:[email protected]>
>>>>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to