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
