Hi Oleg,<div><br></div><div>Folks from the API-subteam can correct me, but I believe this use model is outside of what the API framework was trying to enable with "actions".  The idea is that you use POST/DELETE to create an delete API "resources" (which actually have UUIDs, for example, the "pool" in your example below) and then do a PUT to an "action" to cause some kind of change that you can affect on a resource (e.g., "add_health_monitor" or "remove_health_monitor").  It sounds like what you are proposing is more treating "health_monitors" almost as a "sub-resource", which is not really what the "actions" stuff was designed for.  </div>

<div><br></div><div>I haven't been deeply involved in the LBaaS api design discussion though, so I'd also like to hear from Salvatore, et al. on the API sub-team.</div><div><br></div><div>Dan</div><div><br></div>
<div>
<br></div><div><div class="gmail_quote">On Wed, Nov 14, 2012 at 6:05 AM, Oleg Bondarev <span dir="ltr"><<a href="mailto:obondarev@mirantis.com" target="_blank">obondarev@mirantis.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="color:#1f497d">Hi guys,<u></u><u></u></span></p><p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal">

<span style="color:#1f497d">While working on the API extension for LBaaS I didn’t find a way to use custom member actions if they have the same name and differ only by request method, for example<u></u><u></u></span></p>
<p class="MsoNormal">
<u></u> <u></u></p><p class="MsoNormal" style="background:#f3f5f7"><span lang="EN" style="font-family:Courier">List all health monitors of a specific pool: GET /pool/pool_id/health_monitors<u></u><u></u></span></p><p class="MsoNormal" style="background:#f3f5f7">

<span><span lang="EN" style="font-family:Courier">Associate health monitors with a pool: POST</span></span><span><span lang="EN" style="font-family:Courier"> /</span></span><span lang="EN" style="font-family:Courier">pool/pool_id/health_monitors<u></u><u></u></span></p>

<p class="MsoNormal" style="background:#f3f5f7"><span lang="EN"><u></u> <u></u></span></p><p class="MsoNormal"><span style="color:#1f497d">In quantum extension framework we pass </span><span lang="EN" style="color:#1f497d">“health_monitors” as member actions for a controller (quantum.api.v2.base.create_resource())<u></u><u></u></span></p>

<p class="MsoNormal"><span lang="EN"><u></u> <u></u></span></p><p class="MsoNormal">member_actions = {'<span lang="EN">health_monitors</span>': 'GET',<u></u><u></u></p><p class="MsoNormal">                                        '<span lang="EN">health_monitors</span>': 'POST'}<u></u><u></u></p>

<p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">controller = base.create_resource(collection_name,<u></u><u></u></p><p class="MsoNormal">                                    resource_name,<u></u><u></u></p><p class="MsoNormal">

                                    plugin, params,<u></u><u></u></p><p class="MsoNormal">                                    member_actions=member_actions)<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">

<span style="color:#1f497d">According to the Controller implementation it dispatches all custom member actions to its plugin attr:<u></u><u></u></span></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">def __getattr__(self, name):<u></u><u></u></p>

<p class="MsoNormal">        if name in self._member_actions:<u></u><u></u></p><p class="MsoNormal">            def _handle_action(request, id, body=None):<u></u><u></u></p><p class="MsoNormal">                return getattr(self._plugin, name)(request.context, id, body)<u></u><u></u></p>

<p class="MsoNormal">            return _handle_action<u></u><u></u></p><p class="MsoNormal">        else:<u></u><u></u></p><p class="MsoNormal">            raise AttributeError<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p>

<p class="MsoNormal"><span style="color:#1f497d">Where request.context is of type quantum.context.Context and does not contain info about request method.<u></u><u></u></span></p><p class="MsoNormal"><span style="color:#1f497d">As a result there is no way to distinguish two custom actions in the plugin. <u></u><u></u></span></p>

<p class="MsoNormal"><span style="color:#1f497d">Is it an issue in the framework?<u></u><u></u></span></p><p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="color:#1f497d">Possible solution may be in concatenation of request method and action name (“get_health_monitors”, “post_health_monitors”) in a controller before dispatching them to a plugin.<u></u><u></u></span></p>

<p class="MsoNormal"><span style="color:#1f497d">What do you think? <u></u><u></u></span></p><p class="MsoNormal"><span style="color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="color:#1f497d">Thanks,<u></u><u></u></span></p>

<p class="MsoNormal"><span style="color:#1f497d">Oleg<u></u><u></u></span></p></div></div><br>_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>Dan Wendlandt <div>Nicira, Inc: <a href="http://www.nicira.com" target="_blank">www.nicira.com</a><br><div>twitter: danwendlandt<br>

~~~~~~~~~~~~~~~~~~~~~~~~~~~<br></div></div><br>
</div>