Hi Kobayashi-san, Thank you for review. (2014/05/15 11:20), Satoshi Kobayashi wrote: > Hi YAMADA-san, > > 2014-05-14 19:11 GMT+09:00 YAMADA Hideki <yamada.hid...@po.ntts.co.jp>: > >> >> Signed-off-by: YAMADA Hideki <yamada.hid...@po.ntts.co.jp> >> --- >> ryu/app/simple_switch_websocket_13.py | 91 >> +++++++++++++++++++++++++++++++++ >> 1 file changed, 91 insertions(+) >> create mode 100644 ryu/app/simple_switch_websocket_13.py >> >> diff --git a/ryu/app/simple_switch_websocket_13.py >> b/ryu/app/simple_switch_websocket_13.py >> new file mode 100644 >> index 0000000..fa68fc5 >> --- /dev/null >> +++ b/ryu/app/simple_switch_websocket_13.py >> @@ -0,0 +1,91 @@ >> +# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. >> +# >> +# Licensed under the Apache License, Version 2.0 (the "License"); >> +# you may not use this file except in compliance with the License. >> +# You may obtain a copy of the License at >> +# >> +# http://www.apache.org/licenses/LICENSE-2.0 >> +# >> +# Unless required by applicable law or agreed to in writing, software >> +# distributed under the License is distributed on an "AS IS" BASIS, >> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> +# implied. >> +# See the License for the specific language governing permissions and >> +# limitations under the License. >> + >> +""" >> +Usage example >> + >> +Run this application: >> +$ PYTHONPATH=. ./bin/ryu run --verbose ryu.app.simple_switch_websocket_13 >> + >> +Install and run websocket client(in other terminal): >> +$ pip install websocket-client >> +$ wsdump.py ws://127.0.0.1:8080/simpleswitch/ws >> +""" >> + >> +import json >> +from webob import Response >> + >> +from ryu.app import simple_switch_13 >> +from ryu.app.wsgi import route, ControllerBase, WSGIApplication >> +from ryu.controller import ofp_event >> +from ryu.controller.handler import set_ev_cls >> +from ryu.lib import hub >> +from ryu.lib.packet import packet >> + >> + >> +simple_switch_instance_name = 'simple_switch_api_app' >> +url = '/simpleswitch/ws' >> + >> + >> +class SimpleSwitchWebSocket13(simple_switch_13.SimpleSwitch13): >> + _CONTEXTS = { >> + 'wsgi': WSGIApplication, >> + } >> + >> + def __init__(self, *args, **kwargs): >> + super(SimpleSwitchWebSocket13, self).__init__(*args, **kwargs) >> + >> + self.ws_send_queue = hub.Queue() >> + self.ws_lock = hub.BoundedSemaphore() >> + >> + wsgi = kwargs['wsgi'] >> + wsgi.register( >> + SimpleSwitchWebSocketController, >> + data={simple_switch_instance_name: self}, >> + ) >> + >> + @set_ev_cls(ofp_event.EventOFPPacketIn) >> + def _packet_in_handler(self, ev): >> + super(SimpleSwitchWebSocket13, self)._packet_in_handler(ev) >> + >> + pkt = packet.Packet(ev.msg.data) >> + self.ws_send_queue.put(str(pkt)) >> + >> + >> +class SimpleSwitchWebSocketController(ControllerBase): >> + def __init__(self, req, link, data, **config): >> + super(SimpleSwitchWebSocketController, self).__init__( >> + req, link, data, **config) >> + self.simpl_switch_spp = data[simple_switch_instance_name] >> > > Is this a typo? > s/simpl_switch_spp/simple_switch_app/g > I followed Ryu-book's style. http://osrg.github.io/ryu-book/ja/html/rest_api.html#simpleswitchcontroller
I don't know it is a typo or not... > >> + >> + def _websocket_handler(self, ws): >> + simple_switch = self.simpl_switch_spp >> + simple_switch.logger.debug('WebSocket connected: %s', ws) >> + while True: >> + data = simple_switch.ws_send_queue.get() >> + ws.send(unicode(json.dumps(data))) >> + >> + @route('simpleswitch', url) >> + def websocket(self, req, **kwargs): >> + simple_switch = self.simpl_switch_spp >> + if simple_switch.ws_lock.acquire(blocking=False): >> > > This is able to connect only a single client? > Yes. I think it is complex to handle multiple connection and broadcast data. I want to keep simple this sample app. > >> + try: >> + self.websocket_handshake(req, self._websocket_handler) >> + return >> + finally: >> + simple_switch.logger.debug('WebSocket disconnected') >> + simple_switch.ws_lock.release() >> + else: >> + return Response(status=503) >> -- >> 1.7.9.5 >> >> >> >> ------------------------------------------------------------------------------ >> "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE >> Instantly run your Selenium tests across 300+ browser/OS combos. >> Get unparalleled scalability from the best Selenium testing platform >> available >> Simple to use. Nothing to install. Get started now for free." >> http://p.sf.net/sfu/SauceLabs >> _______________________________________________ >> Ryu-devel mailing list >> Ryu-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/ryu-devel >> > ------------------------------------------------------------------------------ "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE Instantly run your Selenium tests across 300+ browser/OS combos. Get unparalleled scalability from the best Selenium testing platform available Simple to use. Nothing to install. Get started now for free." http://p.sf.net/sfu/SauceLabs _______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel