Hi Giorgio, Your client is disconnecting before the reply is sent. If you look at nox-console.py, it should be a good example to follow.
Regards KK On 27 January 2012 05:12, Kyriakos Zarifis <kyr.zari...@gmail.com> wrote: > A JSONMsg_event is just another NOX event and us such it will either passed > on to all components down the event handler chain or stopped by one of them. > Your handler needs to return a valid NOX event disposition ( > http://noxrepo.org/noxwiki/index.php/Disposition ) > So in your case you just need to add a "return STOP" and the error will > disappear. > > > As for the other comment, I'm not sure how messenger_core cleans the > connections state/closes socket. It might very well be a timing issue, maybe > the connection state hasn't been cleaned when the event is processed. I > don't know if the log messages represent the reality 100%. In any case the > last message is either never really sent or it's sent to the void. Either > way I'd just ignore it, I doubt it will affect anything > > > On Fri, Jan 27, 2012 at 3:02 AM, Giorgio Mazza <giorgio.mazza...@gmail.com> > wrote: >> >> I tried this way: I replaced zaku's default messenger folder with >> destiny's messenger one (nox/src/nox/coreapps/messenger), that I had >> previously downloaded and installed. >> Then I recompiled zaku and the import error disappeared, so that when I >> run >> ./nox_core -v -i ptcp:6633 jsonmessenger=tcpport=3334 my_component >> I do not get errors anymore and components are installed successfully. >> However, when I try to send a json message from my external application I >> get a strange behaviour. I don't understand very well what is happening and >> why I get this error, so I do not know if it is my fault in doing something >> or if I need to hack something because the simple replacement of messenger >> folder is not enough. >> >> My callback is fairly simple for the moment and the only thing it does is >> to store the value of the received json message and to answer with a "Hello >> world" message, like that: >> def json_message_callback(self, e): >> import json >> global cache_server_table #the global dict where I >> want to store received json information >> cache_server_table = json.loads(e.jsonstring) >> print cache_server_table >> >> e.reply(json.dumps({"msg":"Hello world"})) >> >> >> This is my simple external application: >> >> import json >> import socket >> >> HOST = '10.0.10.1' >> PORT = 3334 >> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >> s.connect((HOST, PORT)) >> print "Connected to server: " + str(s.getpeername()) >> message={"msg":"CS-setup","mac":"xxxxx","ip":"10.0.10.2"} >> json_message=json.dumps(message) >> s.send(json_message) >> print "Sent JSON message" >> data = s.recv(1024) >> print 'Received', repr(data) >> >> >> And this is what I get in the controller prompt, after executing the above >> code: >> >> 00045|openflow|DBG:Passive tcp interface bound to port 6633 >> 00046|nox|INFO:nox bootstrap complete >> 00047|messenger_core|DBG:Starting connection with idleInterval 0 >> 00048|jsonmessenger|DBG:JSON message of length 18 (connect) >> 00049|jsonmessenger|DBG:JSON message of length 18 >> 00050|jsonmessenger|DBG:JSON: {"type":"connect"} >> {u'type': u'connect'} >> 00051|messenger_core|DBG:Sent string of length 22 socket 0x8b9ff48 >> 00052|pyrt|ERR:Python handler returned invalid Disposition. >> <------------------------ No idea >> 00053|messenger_core|DBG:TCP socket connection accepted >> 00054|messenger_core|DBG:Copy 54 bytes to message >> 00055|messenger_core|DBG:Received packet of length 54 >> 00056|jsonmessenger|DBG:JSON message of length 54 >> 00057|jsonmessenger|DBG:Message posted as JSONMsg_event >> 00058|jsonmessenger|DBG:JSON: >> {"mac":"xxxxx","msg":"CS-setup","ip":"10.0.10.2"} >> 00059|jsonmessenger|DBG:JSON message of length 21 (disconnect) >> 00060|jsonmessenger|DBG:JSON message of length 21 >> 00061|messenger_core|DBG:socket closed >> 00062|jsonmessenger|DBG:JSON: {"type":"disconnect"} >> 00063|jsonmessenger|DBG:Clear connection state for 0x8b9ff48 >> {u'type': u'disconnect'} >> 00064|messenger_core|DBG:Sent string of length 22 socket >> 0x8b9ff48 <-------------------------- It seems that my >> callback tries to answer when the socket is already closed. Why? >> 00065|pyrt|ERR:Python handler returned invalid Disposition. >> >> >> Any idea or suggestion will be appreciated. >> >> Regards, >> Giorgio >> >> >> >> On 26/01/2012 23:39, Kyriakos Zarifis wrote: >> >> That's the reason; the jsonmsg_event isn't exposed in python on zaku. >> I'd really encourage you to try to migrate to destiny. Not only because >> this will work, but more importantly because destiny is a far more developed >> branch by now, with many fixes and added features. >> >> If you really don't want to switch to destiny, maybe you could just grab >> jsonmsg_event.i from destiny and stick it in your zaku tree. (I can't >> remember if this is going to just work or you'll need to hack something, but >> give it a try and see what breaks?) >> >> On Thu, Jan 26, 2012 at 1:37 PM, Giorgio Mazza >> <giorgio.mazza...@gmail.com> wrote: >>> >>> Yes, I'm using zaku... >>> And I do not have any file called "jsonmsg_event.i". >>> Any idea about how can I receive json messages and handle them in order >>> to install flow entries? >>> Do I have to use destiny branch? >>> I don't know if it could be simple to switch from zaku to destiny, but >>> i'd rather to keep zaku, as I already worked a bit on it in order to extend >>> it with other classes and with the component I am try to improve. >>> Is it possible to implement those functionalities going on with zaku? >>> >>> Giorgio >>> >>> >>> On 26/01/2012 21:38, Kyriakos Zarifis wrote: >>> >>> Hi Girogio, >>> >>> I forgot to ask, but, are you using the destiny branch or zaku? It looks >>> like you're using zaku. >>> >>> In your _source_ directory, not the build dir, (so: >>> nox/src/nox/coreapps/messenger), you should have a file called >>> "jsonmsg_event.i", which creates the module you're missing. That exists only >>> in destiny >>> >>> On Thu, Jan 26, 2012 at 5:27 AM, Giorgio Mazza >>> <giorgio.mazza...@gmail.com> wrote: >>>> >>>> Actually I get the same error, because I do not have neither >>>> pyjsonmsgevent nor pymsgevent in messenger folder... >>>> This is the list of what I have in messenger folder: >>>> >>>> giorgio@controller:~/nox/build/src$ ls -a nox/coreapps/messenger/ >>>> . jsonmessenger.la >>>> messenger.la >>>> .. jsonmessenger_la-jsonmessenger.lo >>>> messenger_la-messenger.lo >>>> cacert.pem .libs >>>> messenger.py >>>> .deps Makefile >>>> meta.json >>>> __init__.py messenger_core.la >>>> servercert.pem >>>> __init__.pyc messenger_core_la-messenger_core.lo serverkey.pem >>>> >>>> >>>> Do I miss anything in my folders or did I make something wrong? >>>> >>>> Giorgio >>>> >>>> >>>> On 26/01/2012 13:05, Murphy McCauley wrote: >>>> >>>> Oops, that was my bad -- as I said, I had adapted that from another >>>> message. >>>> The correct import should be: >>>> from nox.coreapps.messenger.pyjsonmsgevent import JSONMsg_event >>>> >>>> -- Murphy >>>> >>>> On Jan 26, 2012, at 3:40 AM, Giorgio Mazza wrote: >>>> >>>> Thanks, I think I will specify a port. >>>> >>>> Another question... >>>> At the moment I get an error while importing the JSON_Msg event in the >>>> install() of my component. >>>> >>>> "in install >>>> from nox.coreapps.messenger.pymsgevent import JSONMsg_event >>>> ImportError: No module named pymsgevent " >>>> >>>> I blindly followed your instructions at first, but then I looked in my >>>> messenger folder without finding where this event is defined. >>>> Could you please tell me where is it, so that I can insert the correct >>>> path in my install function? I'm using the standard message folder. >>>> Thank you. >>>> Regards, >>>> >>>> Giorgio >>>> >>>> On 25/01/2012 22:28, Murphy McCauley wrote: >>>> >>>> I believe it defaults to port 2703. You should be able to set the port >>>> number by specifying it on the commandline... >>>> ./nox_core -i ptcp: jsonmessenger=tcpport=4096 your_app_here >>>> >>>> It listens on all IP addresses; there is currently no way to specify >>>> just one. >>>> >>>> -- Murphy >>>> >>>> On Jan 25, 2012, at 1:11 PM, Giorgio Mazza wrote: >>>> >>>> A question about the socket opened when invoking jsonmessenger. >>>> What are the IP address, the tcp port and the interface that this socket >>>> refers to? Is there any way to set them? >>>> I undersotood the mechanism, but I don't know where to send my messages >>>> from the external application. >>>> Thank you. >>>> Regards, >>>> >>>> Giorgio >>>> >>>> On 24/01/2012 13:49, Murphy McCauley wrote: >>>> >>>> The minimum to get up and going should be something like this: >>>> >>>> 1) In your component's install function: >>>> from nox.coreapps.messenger.pymsgevent import JSONMsg_event >>>> JSONMsg_event.register_event_converter(self.ctxt) >>>> self.register_handler(JSONMsg_event.static_get_name(), myHandler) >>>> >>>> 2) Implement a handler: >>>> def myHandler (e): >>>> import json >>>> print json.loads(e.jsonstring) >>>> e.reply(json.dumps({"msg":"Hello world"})) >>>> >>>> 3) Include jsonmessenger on the commandline or as a dependency >>>> >>>> >>>> That may not be exactly correct -- it's adapted from a quick writeup I >>>> did in December about using the new Python support for the "regular" >>>> messenger (as opposed to the JSON messenger), which has not yet been pushed >>>> to the repository. For reference, that post was: >>>> http://noxrepo.org/pipermail/nox-dev/2011-December/008382.html >>>> >>>> (If using the new version of messenger that I linked to in that post, >>>> you remove the register_event_converter() call from step 1 and include >>>> pyjsonmessenger instead of jsonmessenger in step 3.) >>>> >>>> Invoking the jsonmessenger component (on the commandline or by including >>>> it as a dependency in your app's meta.json) will create the server socket >>>> for you. >>>> >>>> You absolutely do not have to use the messenger.py class. I'm removing >>>> it from that directory, because all it ever does is confuse people -- it >>>> really doesn't belong there. messenger.py is a library for writing JSON >>>> messenger *clients* (external programs) in Python. That may be useful to >>>> you, but you don't need it for the NOX side of things. >>>> >>>> Hope that helps. >>>> >>>> -- Murphy >>>> >>>> On Jan 24, 2012, at 4:12 AM, Giorgio Mazza wrote: >>>> >>>> Thank you. >>>> I try to sum up the operations I need to perform, to see if I understood >>>> correctly. >>>> Basically in my external application I have to set up a socket that >>>> sends json messages and this would be quite simple. >>>> In my nox component, instead, I have to import the "JSONMsg_event" and, >>>> within the "install()" instruction, to handle it with my specific method, >>>> that, in my case, would only save these json messages into a dictionary, >>>> for >>>> using them later, according to some conditions. >>>> Is that correct? >>>> >>>> A couple of things that I didn't understand: >>>> - I assume I also have to set up a server socket in my nox component, in >>>> order to receive json messages and handle JSONMsg_events. So, I think this >>>> socket has to be already up and running when I handle the event. So, when >>>> do >>>> I have to create it and how? Do I have to use messenger.py channel class? >>>> - Second question, probably related to the first. I think to be pretty >>>> confused about jsonmessenger: what are the jsonmessenger files I could look >>>> into in order to understand fields and methods that I would need to use? >>>> Are >>>> the jsonmessenger.cc and jsonmessenger.hh in >>>> nox/src/nox/coreapps/messenger? >>>> And, if it is the case, how can I integrate them into a python component? >>>> >>>> Thanks again, >>>> >>>> Giorgio >>>> >>>> On 24/01/2012 12:28, Kyriakos Zarifis wrote: >>>> >>>> Hi Giorgio, >>>> >>>> yes, I think using jsonmessenger would be the best approach for this. >>>> >>>> you need to implement a send/receive interface on the external >>>> application and in your nox component. For the external application, it's >>>> pretty straightforward - Connect to the jsonmessenger socket and send json >>>> strings. In your nox application you need to register for JSON messages, >>>> and >>>> handle them appropriately. >>>> >>>> The wiki explains the communication in a few steps (specifically for the >>>> GUI<->NOX, but it will be similar and simpler for any external app) here: >>>> >>>> If you want to see a full example, the GUI and the monitoring component >>>> in destiny could be a place to look. I'm afraid it's much more complex than >>>> what you need, but the bits you need are in there if you dig in the code a >>>> bit. >>>> >>>> >>>> On Tue, Jan 24, 2012 at 2:16 AM, Giorgio Mazza >>>> <giorgio.mazza...@gmail.com> wrote: >>>>> >>>>> Hi all! >>>>> I have written a simple component in python that works fine. >>>>> Now I would to improve it, making it to install flow entries depending >>>>> on parameters received from an external application. >>>>> In particular I want to pass those parameters via json messages to my >>>>> component, which, in my thougths, has to open a "permanent" socket >>>>> listening >>>>> for them, save those parameters in a dictionary and, as a consequence, >>>>> decide the desired switch behaviour (whether install or not a flow entry >>>>> for >>>>> the received parameters). >>>>> In previous threads I found that I have to use jsonmessenger (even in >>>>> python?) or to have a look to discovery.py, but I am not sure to have >>>>> understood what I have to do and where in order to realize such a >>>>> behaviour. >>>>> Could anyone, please, help me? >>>>> Thank you in advance, >>>>> >>>>> Giorgio Mazza >>>>> _______________________________________________ >>>>> nox-dev mailing list >>>>> nox-dev@noxrepo.org >>>>> http://noxrepo.org/mailman/listinfo/nox-dev >>>> >>>> >>>> >>>> _______________________________________________ >>>> nox-dev mailing list >>>> nox-dev@noxrepo.org >>>> http://noxrepo.org/mailman/listinfo/nox-dev >>>> >>>> >>>> >>>> _______________________________________________ >>>> nox-dev mailing list >>>> nox-dev@noxrepo.org >>>> http://noxrepo.org/mailman/listinfo/nox-dev >>>> >>>> >>>> >>>> _______________________________________________ >>>> nox-dev mailing list >>>> nox-dev@noxrepo.org >>>> http://noxrepo.org/mailman/listinfo/nox-dev >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> nox-dev mailing list >>>> nox-dev@noxrepo.org >>>> http://noxrepo.org/mailman/listinfo/nox-dev >>>> >>> >>> >>> >>> _______________________________________________ >>> nox-dev mailing list >>> nox-dev@noxrepo.org >>> http://noxrepo.org/mailman/listinfo/nox-dev >>> >> >> >> >> _______________________________________________ >> nox-dev mailing list >> nox-dev@noxrepo.org >> http://noxrepo.org/mailman/listinfo/nox-dev >> > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > _______________________________________________ nox-dev mailing list nox-dev@noxrepo.org http://noxrepo.org/mailman/listinfo/nox-dev