Hi Kobayashi-san

Thanks for the comment.

On Mon, 7 Jul 2014 14:00:30 +0900
Satoshi KOBAYASHI <[email protected]> wrote:
> Hi Takahashi-san,
> 
> In the case of such API, PUT should be used. Please refer to "RFC2616 9.6 
> PUT" for details. 

That's right.
But all of API which already exist has been implemented in the "POST" all.
https://github.com/osrg/ryu/blob/master/ryu/app/ofctl_rest.py#L72-106

For consistency,I would like to implement by the "POST" this time.
#Future, I plan to implement the API of the correct REST-API.

> 
> And how is the resource for "ports" from "portmod" more simply? I think that 
> it may be user friendly to unify with "portdesc". 

Sure, it's nicer.
Already exist "GET /stats/port/<dpid>".
https://github.com/osrg/ryu/blob/master/ryu/app/ofctl_rest.py#L51-52
Therefore,The following format: how about you?

before)
      /stats/portmod/<dpid>
      /stats/portdesc/<dpid>

after)
      /stats/portdesc/modify
      /stats/portdesc/<dpid>

> 
> Thanks,
> Satoshi
> 
> 2014-07-07 11:03 GMT+09:00 takahashi.minoru <[email protected] 
> <mailto:[email protected]>>:
> 
>     this patch makes ofctl_rest enable use of Port Modification Message.
> 
>     usage)
> 
>       URI:    /stats/portmod/{dpid}
>       method: POST
> 
>     the message body is as follows:
> 
>       port_no    (default:0)
>       config     (default:0)
>       hw_addr    (default:automatic-setting)
>       mask       (default:0)
>       advertise  (default:automatic-setting)
> 
>     e.g. )
> 
>       curl -X POST -d '{"port_no": 1,
>                         "mask": 0b0000001,
>                         "config": 0b0000001}' 
> http://localhost:8080/stats/portmod/1
> 
>     Signed-off-by: TAKAHASHI Minoru <[email protected] 
> <mailto:[email protected]>>
>     ---
>      ryu/app/ofctl_rest.py |   43 +++++++++++++++++++++++++++++++++++++++++++
>      ryu/lib/ofctl_v1_0.py |   13 +++++++++++++
>      ryu/lib/ofctl_v1_2.py |   13 +++++++++++++
>      ryu/lib/ofctl_v1_3.py |   13 +++++++++++++
>      4 files changed, 82 insertions(+)
> 
>     diff --git a/ryu/app/ofctl_rest.py b/ryu/app/ofctl_rest.py
>     index 51c1eef..ac301e3 100644
>     --- a/ryu/app/ofctl_rest.py
>     +++ b/ryu/app/ofctl_rest.py
>     @@ -101,6 +101,9 @@ LOG = logging.getLogger('ryu.app.ofctl_rest')
>      # delete a group entry
>      # POST /stats/groupentry/delete
>      #
>     +# modify behavior of the physical port
>     +# POST /stats/portmod/<dpid>
>     +#
>      #
>      # send a experimeter message
>      # POST /stats/experimenter/<dpid>
>     @@ -380,6 +383,41 @@ class StatsController(ControllerBase):
> 
>              return Response(status=200)
> 
>     +    def mod_port_behavior(self, req, dpid, **_kwargs):
>     +        try:
>     +            port_config = eval(req.body)
>     +        except SyntaxError:
>     +            LOG.debug('invalid syntax %s', req.body)
>     +            return Response(status=400)
>     +        port_no = int(port_config.get('port_no', 0))
>     +        port_info = self.dpset.port_state[int(dpid)].get(port_no)
>     +
>     +        if 'hw_addr' not in port_config:
>     +            if port_info is not None:
>     +                port_config['hw_addr'] = port_info.hw_addr
>     +            else:
>     +                return Response(status=404)
>     +
>     +        if 'advertise' not in port_config:
>     +            if port_info is not None:
>     +                port_config['advertise'] = port_info.advertised
>     +            else:
>     +                return Response(status=404)
>     +
>     +        dp = self.dpset.get(int(dpid))
>     +        if dp is None:
>     +            return Response(status=404)
>     +
>     +        if dp.ofproto.OFP_VERSION == ofproto_v1_0.OFP_VERSION:
>     +            ofctl_v1_0.mod_port_behavior(dp, port_config)
>     +        elif dp.ofproto.OFP_VERSION == ofproto_v1_2.OFP_VERSION:
>     +            ofctl_v1_2.mod_port_behavior(dp, port_config)
>     +        elif dp.ofproto.OFP_VERSION == ofproto_v1_3.OFP_VERSION:
>     +            ofctl_v1_3.mod_port_behavior(dp, port_config)
>     +        else:
>     +            LOG.debug('Unsupported OF protocol')
>     +            return Response(status=501)
>     +
>          def send_experimenter(self, req, dpid, **_kwargs):
>              dp = self.dpset.get(int(dpid))
>              if dp is None:
>     @@ -493,6 +531,11 @@ class RestStatsApi(app_manager.RyuApp):
>                             controller=StatsController, 
> action='mod_group_entry',
>                             conditions=dict(method=['POST']))
> 
>     +        uri = path + '/portmod/{dpid}'
>     +        mapper.connect('stats', uri,
>     +                       controller=StatsController, 
> action='mod_port_behavior',
>     +                       conditions=dict(method=['POST']))
>     +
>              uri = path + '/experimenter/{dpid}'
>              mapper.connect('stats', uri,
>                             controller=StatsController, 
> action='send_experimenter',
>     diff --git a/ryu/lib/ofctl_v1_0.py b/ryu/lib/ofctl_v1_0.py
>     index ea317f7..729e7db 100644
>     --- a/ryu/lib/ofctl_v1_0.py
>     +++ b/ryu/lib/ofctl_v1_0.py
>     @@ -308,3 +308,16 @@ def delete_flow_entry(dp):
>              command=dp.ofproto.OFPFC_DELETE)
> 
>          dp.send_msg(flow_mod)
>     +
>     +
>     +def mod_port_behavior(dp, port_config):
>     +    port_no = int(port_config.get('port_no', 0))
>     +    hw_addr = port_config.get('hw_addr')
>     +    config = int(port_config.get('config', 0))
>     +    mask = int(port_config.get('mask', 0))
>     +    advertise = int(port_config.get('advertise'))
>     +
>     +    port_mod = dp.ofproto_parser.OFPPortMod(
>     +        dp, port_no, hw_addr, config, mask, advertise)
>     +
>     +    dp.send_msg(port_mod)
>     diff --git a/ryu/lib/ofctl_v1_2.py b/ryu/lib/ofctl_v1_2.py
>     index ce49a45..d4794ce 100644
>     --- a/ryu/lib/ofctl_v1_2.py
>     +++ b/ryu/lib/ofctl_v1_2.py
>     @@ -796,6 +796,19 @@ def mod_group_entry(dp, group, cmd):
>          dp.send_msg(group_mod)
> 
> 
>     +def mod_port_behavior(dp, port_config):
>     +    port_no = int(port_config.get('port_no', 0))
>     +    hw_addr = port_config.get('hw_addr')
>     +    config = int(port_config.get('config', 0))
>     +    mask = int(port_config.get('mask', 0))
>     +    advertise = int(port_config.get('advertise'))
>     +
>     +    port_mod = dp.ofproto_parser.OFPPortMod(
>     +        dp, port_no, hw_addr, config, mask, advertise)
>     +
>     +    dp.send_msg(port_mod)
>     +
>     +
>      def send_experimenter(dp, exp):
>          experimenter = exp.get('experimenter', 0)
>          exp_type = exp.get('exp_type', 0)
>     diff --git a/ryu/lib/ofctl_v1_3.py b/ryu/lib/ofctl_v1_3.py
>     index c63c4e1..8d6da8a 100644
>     --- a/ryu/lib/ofctl_v1_3.py
>     +++ b/ryu/lib/ofctl_v1_3.py
>     @@ -988,6 +988,19 @@ def mod_group_entry(dp, group, cmd):
>          dp.send_msg(group_mod)
> 
> 
>     +def mod_port_behavior(dp, port_config):
>     +    port_no = int(port_config.get('port_no', 0))
>     +    hw_addr = port_config.get('hw_addr')
>     +    config = int(port_config.get('config', 0))
>     +    mask = int(port_config.get('mask', 0))
>     +    advertise = int(port_config.get('advertise'))
>     +
>     +    port_mod = dp.ofproto_parser.OFPPortMod(
>     +        dp, port_no, hw_addr, config, mask, advertise)
>     +
>     +    dp.send_msg(port_mod)
>     +
>     +
>      def send_experimenter(dp, exp):
>          experimenter = exp.get('experimenter', 0)
>          exp_type = exp.get('exp_type', 0)
>     --
>     1.7.10.4
> 
> 
>     
> ------------------------------------------------------------------------------
>     Open source business process management suite built on Java and Eclipse
>     Turn processes into business applications with Bonita BPM Community 
> Edition
>     Quickly connect people, data, and systems into organized workflows
>     Winner of BOSSIE, CODIE, OW2 and Gartner awards
>     http://p.sf.net/sfu/Bonitasoft
>     _______________________________________________
>     Ryu-devel mailing list
>     [email protected] <mailto:[email protected]>
>     https://lists.sourceforge.net/lists/listinfo/ryu-devel
> 
> 
> 
> 
> -- 
> Satoshi KOBAYASHI <[email protected] 
> <mailto:[email protected]>>


 

------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to