Hi Douglas,

I checked "L2DestForwardStaticRyu.py", and it seems to be "hacked" to run
app without "ryu-manager".
To start the built-in Ryu application with "L2DestForwardStaticRyu.py",
how about the following?
The following appends to "ofctl_rest" app to the argument of "manager".

e.g.) around line 91:

 if __name__ == "__main__":
-    manager.main(args=sys.argv)
+    manager.main(args=sys.argv + ['ryu.app.ofctl_rest'])


Thanks,
Iwase


On 2017年06月09日 21:00, Douglas Harewood-Gill wrote:
> Hi Iwase. Thank you for contacting me and apologies for my delay in 
> responding. I have tried what you have suggested but the problem I have is 
> that the L2DestForwardStaticRyu.py program is designed to run on its own. It 
> imports the the ryu.cmd import manager and uses the Ryu controller but you 
> start it by typing "|python l2DestForwardStaticRyu.py 
> --netfile=ExNetwithLoops1A.json" |where  it imports =ExNetWithLoops1A.Json.
> When this program is started, it automatically loads Ryu and implements the 
> code within this program. I am not sure how to start the this and 
> ryu.app.ofctl_rest at the same time. I have tried starting them separately in 
> different terminals but that did not work.
> 
> Thank you also for the information you have sent. I have looked at it before 
> but I do not know how to implement this with my custom code. I have been 
> looking for examples but they seem to be few and far between. Any advice as 
> always would be greatly appreciated.
> 
> Thanks again.
> 
> Douglas
> 
> On 8 June 2017 at 01:27, Iwase Yusuke <iwase.yusu...@gmail.com 
> <mailto:iwase.yusu...@gmail.com>> wrote:
> 
>     Hi Douglas,
> 
>     Excuse me for cutting in.
> 
>     Just for getting flow statistics, how about running your app and 
> ofctl_rest
>     together as Fujimoto said.
>     e.g.)
>      $ ryu-manager your_app.py ryu.app.ofctl_rest
> 
> 
>     If you want to implement your own REST APIs on your app, Ryu-Book is the
>     most helpful as far as I know.
>     (You might already be aware of this though...)
>       http://osrg.github.io/ryu-book/en/html/rest_api.html 
> <http://osrg.github.io/ryu-book/en/html/rest_api.html>
> 
> 
>     FYI, here is an sample implementation on simple_switch_13.py for getting
>     flow statistics.
>     The usage of "WSGI" framework is described on Ryu-Book.
> 
> 
>     $ git diff
>     diff --git a/ryu/app/simple_switch_13.py b/ryu/app/simple_switch_13.py
>     index 3e7c598..f33e474 100644
>     --- a/ryu/app/simple_switch_13.py
>     +++ b/ryu/app/simple_switch_13.py
>     @@ -13,6 +13,8 @@
>      # See the License for the specific language governing permissions and
>      # limitations under the License.
> 
>     +import json
>     +
>      from ryu.base import app_manager
>      from ryu.controller import ofp_event
>      from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
>     @@ -21,14 +23,26 @@ from ryu.ofproto import ofproto_v1_3
>      from ryu.lib.packet import packet
>      from ryu.lib.packet import ethernet
>      from ryu.lib.packet import ether_types
>     +from ryu.app.ofctl import api as ofctl_api
>     +from ryu.app.wsgi import ControllerBase
>     +from ryu.app.wsgi import Response
>     +from ryu.app.wsgi import route
>     +from ryu.app.wsgi import WSGIApplication
>     +
>     +
>     +_URI_PREFIX = '/simpleswitch/stats/{dpid}'
> 
> 
>      class SimpleSwitch13(app_manager.RyuApp):
>          OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
>     +    _CONTEXTS = {'wsgi': WSGIApplication}
> 
>          def __init__(self, *args, **kwargs):
>              super(SimpleSwitch13, self).__init__(*args, **kwargs)
>              self.mac_to_port = {}
>     +        wsgi = kwargs['wsgi']
>     +        wsgi.register(SimpleSwitchController,
>     +                      {SimpleSwitch13.__name__: self})
> 
>          @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
>          def switch_features_handler(self, ev):
>     @@ -117,3 +131,32 @@ class SimpleSwitch13(app_manager.RyuApp):
>              out = parser.OFPPacketOut(datapath=datapath, 
> buffer_id=msg.buffer_id,
>                                        in_port=in_port, actions=actions, 
> data=data)
>              datapath.send_msg(out)
>     +
>     +    def get_flow_stats(self, dpid):
>     +        datapath = ofctl_api.get_datapath(self, dpid)
>     +        if datapath is None:
>     +            return None
>     +
>     +        parser = datapath.ofproto_parser
>     +        req = parser.OFPFlowStatsRequest(datapath)
>     +
>     +        rep = ofctl_api.send_msg(
>     +            app=self, msg=req,
>     +            reply_cls=parser.OFPFlowStatsReply, reply_multi=True)
>     +        return [r.to_jsondict() for r in rep]
>     +
>     +
>     +class SimpleSwitchController(ControllerBase):
>     +
>     +    def __init__(self, req, link, data, **config):
>     +        super(SimpleSwitchController, self).__init__(req, link, data, 
> **config)
>     +        self.simple_switch_app = data[SimpleSwitch13.__name__]
>     +
>     +    @route('simpleswitch', _URI_PREFIX, methods=['GET'])
>     +    def list_mac_table(self, req, **kwargs):
>     +        dpid = int(str(kwargs['dpid']))
>     +        ret = self.simple_switch_app.get_flow_stats(dpid)
>     +        if ret is None:
>     +            return Response(status=404)
>     +
>     +        return Response(content_type='application/json', 
> body=json.dumps(ret))
> 
> 
>     $ ryu-manager 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
>     loading app ryu.app.ofctl.service
>     loading app ryu.controller.ofp_handler
>     creating context wsgi
>     instantiating app ryu.app.ofctl.service of OfctlService
>     instantiating app ryu/app/simple_switch_13.py of SimpleSwitch13
>     instantiating app ryu.controller.ofp_handler of OFPHandler
>     (10332) wsgi starting up on http://0.0.0.0:8080
>     ...
> 
> 
>     $ curl -X GET http://localhost:8080/simpleswitch/stats/1 
> <http://localhost:8080/simpleswitch/stats/1> | python -m json.tool
>     [
>         {
>             "OFPFlowStatsReply": {
>                 "body": [
>                     {
>                         "OFPFlowStats": {
>                             "byte_count": 140,
>                             "cookie": 0,
>                             "duration_nsec": 771000000,
>                             "duration_sec": 1,
>                             "flags": 0,
>                             "hard_timeout": 0,
>                             "idle_timeout": 0,
>                             "instructions": [
>                                 {
>                                     "OFPInstructionActions": {
>                                         "actions": [
>                                             {
>                                                 "OFPActionOutput": {
>                                                     "len": 16,
>                                                     "max_len": 65535,
>                                                     "port": 4294967293,
>                                                     "type": 0
>                                                 }
>                                             }
>                                         ],
>                                         "len": 24,
>                                         "type": 4
>                                     }
>                                 }
>                             ],
>                             "length": 80,
>                             "match": {
>                                 "OFPMatch": {
>                                     "length": 4,
>                                     "oxm_fields": [],
>                                     "type": 1
>                                 }
>                             },
>                             "packet_count": 2,
>                             "priority": 0,
>                             "table_id": 0
>                         }
>                     }
>                 ],
>                 "flags": 0,
>                 "type": 1
>             }
>         }
>     ]
> 
> 
>     Thanks,
>     Iwase
> 
> 
>     On 2017年06月07日 20:21, Douglas Harewood-Gill wrote:
>     > Hi there. That is fantastic. Sounds exactly like what I am looking for 
> so thank you.
>     >
>     > One last question for the minute. I know you provided a link but how do 
> you implement this with custom Ryu controller code?
>     >
>     > My apologies if I am asking something really obvious.
>     >
>     > Cheers
>     >
>     > Douglas
>     >
>     > On 7 June 2017 at 01:15, Fujimoto Satoshi <satoshi.fujimo...@gmail.com 
> <mailto:satoshi.fujimo...@gmail.com> <mailto:satoshi.fujimo...@gmail.com 
> <mailto:satoshi.fujimo...@gmail.com>>> wrote:
>     >
>     >     Hi, Douglas
>     >
>     >     Ryu has ofctl_rest.py, which is a sample application and provides 
> REST API to get flow statistics.
>     >             http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html 
> <http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html> 
> <http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html 
> <http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html>>
>     >
>     >     I think it is better to use ofctl_rest.py than to implement your 
> own REST API in your app.
>     >
>     >     Thanks,
>     >     Fujimoto
>     >
>     >
>     >     On 2017年06月06日 21:18, Douglas Harewood-Gill wrote:
>     >>
>     >>     Greetings  I am a PhD student new to both Python and Ryu and I was 
> wondering if anyone could give me some advice.
>     >>
>     >>
>     >>     I am using the Ryu controller program (L2DestForwardStaticRyu.py) 
> provided by Dr Grey Bernstein 
> (https://www.grotto-networking.com/SDNfun.html#programming-switches-with-ryu 
> <https://www.grotto-networking.com/SDNfun.html#programming-switches-with-ryu> 
> <https://www.grotto-networking.com/SDNfun.html#programming-switches-with-ryu 
> <https://www.grotto-networking.com/SDNfun.html#programming-switches-with-ryu>>)
>  for shortest path computation for a full Mesh network in Mininet but the 
> example provided does not include REST which I require to be able to collect 
> flow statistics such as the flows in each router, bandwidth, latency, etc.
>     >>
>     >>
>     >>     Unfortunately I have been looking and with the exception of 
> (https://osrg.github.io/ryu-book/en/html/rest_api.html 
> <https://osrg.github.io/ryu-book/en/html/rest_api.html> 
> <https://osrg.github.io/ryu-book/en/html/rest_api.html 
> <https://osrg.github.io/ryu-book/en/html/rest_api.html>>) which seems overly 
> specific, I am unable to find a good example that would allow me to work out 
> how to integrate REST into the above Ryu control program.
>     >>
>     >>     So if anyone can point me in the right direction or can provide 
> some examples, I would be most grateful.
>     >>
>     >>
>     >>     Thank you for your time.
>     >>
>     >>
>     >>     Best Regards
>     >>
>     >>
>     >>     Douglas
>     >>
>     >>
>     >>
>     >>     --
>     >>     *Douglas Harewood-Gill MSc MIET*
>     >>     CDT Student in Communications (PhD), University of Bristol
>     >>     Post-Graduate Student (Taught and Research)
>     >>     e-mail: douglas.harewood-g...@bristol.ac.uk 
> <mailto:douglas.harewood-g...@bristol.ac.uk> 
> <mailto:douglas.harewood-g...@bristol.ac.uk 
> <mailto:douglas.harewood-g...@bristol.ac.uk>>
>     >>
>     >>     *
>     >>     CDT Communications*
>     >>
>     >>     University of Bristol, Merchant Venturers' Building, Woodland 
> Road, Clifton, Bristol. BS8 1UB
>     >>
>     >>     http://www.bristol.ac.uk/
>     >>
>     >>
>     >>
>     >>
>     >>     
> ------------------------------------------------------------------------------
>     >>     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
>     >>     Ryu-devel@lists.sourceforge.net 
> <mailto:Ryu-devel@lists.sourceforge.net> 
> <mailto:Ryu-devel@lists.sourceforge.net 
> <mailto:Ryu-devel@lists.sourceforge.net>>
>     >>     https://lists.sourceforge.net/lists/listinfo/ryu-devel 
> <https://lists.sourceforge.net/lists/listinfo/ryu-devel> 
> <https://lists.sourceforge.net/lists/listinfo/ryu-devel 
> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>>
>     >
>     >
>     >
>     >
>     > --
>     > *Douglas Harewood-Gill MSc MIET*
>     > CDT Student in Communications (PhD), University of Bristol
>     > Post-Graduate Student (Taught and Research)
>     > e-mail: douglas.harewood-g...@bristol.ac.uk 
> <mailto:douglas.harewood-g...@bristol.ac.uk> 
> <mailto:douglas.harewood-g...@bristol.ac.uk 
> <mailto:douglas.harewood-g...@bristol.ac.uk>>
>     >
>     > *
>     > CDT Communications*
>     >
>     > University of Bristol, Merchant Venturers' Building, Woodland Road, 
> Clifton, Bristol. BS8 1UB
>     >
>     > http://www.bristol.ac.uk/
>     >
>     >
>     >
>     >
>     > 
> ------------------------------------------------------------------------------
>     > 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
>     > Ryu-devel@lists.sourceforge.net <mailto:Ryu-devel@lists.sourceforge.net>
>     > https://lists.sourceforge.net/lists/listinfo/ryu-devel 
> <https://lists.sourceforge.net/lists/listinfo/ryu-devel>
>     >
> 
> 
> 
> 
> -- 
> *Douglas Harewood-Gill MSc MIET*
> CDT Student in Communications (PhD), University of Bristol
> Post-Graduate Student (Taught and Research)
> e-mail: douglas.harewood-g...@bristol.ac.uk 
> <mailto:douglas.harewood-g...@bristol.ac.uk>
> 
> *
> CDT Communications*
> 
> University of Bristol, Merchant Venturers' Building, Woodland Road, Clifton, 
> Bristol. BS8 1UB
> 
> http://www.bristol.ac.uk/
> 
> 
> 
> 
> ------------------------------------------------------------------------------
> 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
> Ryu-devel@lists.sourceforge.net
> 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
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to