On 01/06/2015 06:25 AM, Chen CH Ji wrote:
Based on nova-specs api-microversions.rst
we support following function definition format, but it violate the
hacking rule pep8 F811 because duplicate function definition
we should use #noqa for them , but considering microversion may live for
long time ,
keep adding #noqa may be a little bit ugly, can anyone suggest a good
solution for it ? thanks

 >   @api_version(min_version='2.1')
 >   def _version_specific_func(self, req, arg1):
 >      pass
 >
 >   @api_version(min_version='2.5')
 >   def _version_specific_func(self, req, arg1):
 >      pass

Hey Kevin,

This was actually one of my reservations about the proposed microversioning implementation -- i.e. having functions that are named exactly the same, only decorated with the microversioning notation. It kinda reminds me of the hell of debugging C++ code that uses STL: how does one easily know which method one is in when inside a debugger?

That said, the only other technique we could try to use would be to not use a decorator and instead have a top-level dispatch function that would inspect the API microversion (only when the API version makes a difference to the output or input of that function) and then dispatch the call to a helper method that had the version in its name.

So, for instance, let's say you are calling the controller's GET /$tenant/os-hosts method, which happens to get routed to the nova.api.openstack.compute.contrib.hosts.HostController.index() method. If you wanted to modify the result of that method and the API microversion is at 2.5, you might do something like:

 def index(self, req):
     req_api_ver = utils.get_max_requested_api_version(req)
     if req_api_ver == (2, 5):
         return self.index_2_5(req)
     return self.index_2_1(req)

 def index_2_5(self, req):
     results = self.index_2_1(req)
     # Replaces 'host' with 'host_name'
     for result in results:
         result['host_name'] = result['host']
         del result['host']
     return results

 def index_2_1(self, req):
     # Would be a rename of the existing index() method on
     # the controller....

Another option would be to use something like JSON-patch to determine the difference between two output schemas and automatically translate one to another... but that would be a huge effort.

That's the only other way I can think of besides disabling F811, which I really would not recommend, since it's a valuable safeguard against duplicate function names (especially duplicated test methods).

Best,
-jay

_______________________________________________
OpenStack-dev mailing list
OpenStack-dev@lists.openstack.org
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to