)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"85b917fa685f1af09cef96ac3ee708c33a3bfea5","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds ability for a v3 loaded extension to be visible in"},{"line_number":10,"context_line":"/v3/extensions to be dependent on the discoverable action policy"},{"line_number":11,"context_line":"for that extension. Note that this does not actually effect whether"},{"line_number":12,"context_line":"or not the functionality provided by the extension is accessible"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements blueprint nova-v3-api-filter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAPn%2F%2Fpbg%3D","line":11,"updated":"2013-06-26 01:12:04.000000000","message":"s/effect/affect/","commit_id":"614b209d00cc369f5ea87a81c5a9eff47c29c43a"}],"nova/api/openstack/compute/plugins/v3/extension_info.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a201fbb24c13a1b97622896f1e301d4a24002d58","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        sorted_ext_list \u003d sorted("},{"line_number":88,"context_line":"            self._get_extensions(context).iteritems())"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        extensions \u003d []"},{"line_number":91,"context_line":"        for _alias, ext in sorted_ext_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F5Ow%3D","line":88,"updated":"2013-06-06 15:50:06.000000000","message":"nit, this result can be cached? all the extension are loaded after startup. so it needn\u0027t call each time. Maybe can save nano seconds... so depend on you....","commit_id":"7375681557234ff2fcd4231500381058554957ff"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"4242ae0d7b9af94ebc43d9f3aae7988b5bb7826e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        sorted_ext_list \u003d sorted("},{"line_number":88,"context_line":"            self._get_extensions(context).iteritems())"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        extensions \u003d []"},{"line_number":91,"context_line":"        for _alias, ext in sorted_ext_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F3t8%3D","line":88,"in_reply_to":"AAAAPX%2F%2F32Q%3D","updated":"2013-06-07 00:59:12.000000000","message":"context is also passed there to nova.policy.enforce and the credentials in the context is used to determine whether or not the client has permission to see the extension","commit_id":"7375681557234ff2fcd4231500381058554957ff"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d3ea896253891ced32024d0811886983eec39e87","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        sorted_ext_list \u003d sorted("},{"line_number":88,"context_line":"            self._get_extensions(context).iteritems())"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        extensions \u003d []"},{"line_number":91,"context_line":"        for _alias, ext in sorted_ext_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F32Q%3D","line":88,"in_reply_to":"AAAAPX%2F%2F4Ic%3D","updated":"2013-06-07 00:03:01.000000000","message":"Check the nova.api.openstack.extensions.py:382, the context was copied to target. So it shouldn\u0027t care who is doing the request.","commit_id":"7375681557234ff2fcd4231500381058554957ff"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"56e7f19ba2e5fbb03f4ee236f8af2c5c1e9c30dc","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        sorted_ext_list \u003d sorted("},{"line_number":88,"context_line":"            self._get_extensions(context).iteritems())"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        extensions \u003d []"},{"line_number":91,"context_line":"        for _alias, ext in sorted_ext_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F4Ic%3D","line":88,"in_reply_to":"AAAAPX%2F%2F5Ow%3D","updated":"2013-06-06 22:00:30.000000000","message":"No this can\u0027t be cached because what is returned from _get_extensions can vary depending on the auth credentials for who is doing the request.","commit_id":"7375681557234ff2fcd4231500381058554957ff"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b3f6597d04ee59896e9b6285f7f3f2c695f0f6e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.api.openstack import wsgi"},{"line_number":21,"context_line":"from nova.api.openstack import xmlutil"},{"line_number":22,"context_line":"from nova.openstack.common import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def make_ext(elem):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F1Ns%3D","line":23,"updated":"2013-06-08 04:27:45.000000000","message":"I think usually there are two blank lines here.","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"2173e5961042fa5f79c8b5df281537046f2db115","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.api.openstack import wsgi"},{"line_number":21,"context_line":"from nova.api.openstack import xmlutil"},{"line_number":22,"context_line":"from nova.openstack.common import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def make_ext(elem):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2Fz04%3D","line":23,"in_reply_to":"AAAAPX%2F%2F1Ns%3D","updated":"2013-06-10 01:25:12.000000000","message":"Done","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b3f6597d04ee59896e9b6285f7f3f2c695f0f6e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from nova.openstack.common import log as logging"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def make_ext(elem):"},{"line_number":27,"context_line":"    elem.set(\u0027name\u0027)"},{"line_number":28,"context_line":"    elem.set(\u0027namespace\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F1No%3D","line":25,"updated":"2013-06-08 04:27:45.000000000","message":"And here.","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b3f6597d04ee59896e9b6285f7f3f2c695f0f6e","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        discoverable_extensions \u003d dict()"},{"line_number":73,"context_line":"        for alias, ext in self.extension_info.get_extensions().iteritems():"},{"line_number":74,"context_line":"            LOG.debug(\"looking to filter %s\", alias)"},{"line_number":75,"context_line":"            authorize \u003d extensions.soft_extension_authorizer("},{"line_number":76,"context_line":"                \u0027compute\u0027, \u0027v3:\u0027 + alias)"},{"line_number":77,"context_line":"            if authorize(context, action\u003d\u0027discoverable\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F1OE%3D","line":74,"updated":"2013-06-08 04:27:45.000000000","message":"Should the logging have the _( and ) around the string?","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"2173e5961042fa5f79c8b5df281537046f2db115","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        discoverable_extensions \u003d dict()"},{"line_number":73,"context_line":"        for alias, ext in self.extension_info.get_extensions().iteritems():"},{"line_number":74,"context_line":"            LOG.debug(\"looking to filter %s\", alias)"},{"line_number":75,"context_line":"            authorize \u003d extensions.soft_extension_authorizer("},{"line_number":76,"context_line":"                \u0027compute\u0027, \u0027v3:\u0027 + alias)"},{"line_number":77,"context_line":"            if authorize(context, action\u003d\u0027discoverable\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2Fz0o%3D","line":74,"in_reply_to":"AAAAPX%2F%2F1OE%3D","updated":"2013-06-10 01:25:12.000000000","message":"I\u0027ll just get rid of that debug message - its not really needed.","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"}],"nova/tests/api/openstack/compute/plugins/v3/test_extension_info.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a201fbb24c13a1b97622896f1e301d4a24002d58","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova.api.openstack.compute import plugins"},{"line_number":20,"context_line":"from nova.api.openstack.compute.plugins.v3 import extension_info"},{"line_number":21,"context_line":"#from nova import context"},{"line_number":22,"context_line":"from nova import exception"},{"line_number":23,"context_line":"from nova import policy"},{"line_number":24,"context_line":"from nova import test"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F5SE%3D","line":21,"updated":"2013-06-06 15:50:06.000000000","message":"nit, this should be removed","commit_id":"7375681557234ff2fcd4231500381058554957ff"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"56e7f19ba2e5fbb03f4ee236f8af2c5c1e9c30dc","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova.api.openstack.compute import plugins"},{"line_number":20,"context_line":"from nova.api.openstack.compute.plugins.v3 import extension_info"},{"line_number":21,"context_line":"#from nova import context"},{"line_number":22,"context_line":"from nova import exception"},{"line_number":23,"context_line":"from nova import policy"},{"line_number":24,"context_line":"from nova import test"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPX%2F%2F4IU%3D","line":21,"in_reply_to":"AAAAPX%2F%2F5SE%3D","updated":"2013-06-06 22:00:30.000000000","message":"oh yes. good point :-) Thanks!","commit_id":"7375681557234ff2fcd4231500381058554957ff"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"99a7bb00da6c2c8f037bc8adf692eaae3ff06a6a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \u0027ext3-alias\u0027: fake_extension(\u0027ext3\u0027, \u0027ext3-alias\u0027, \u0027ext3 description\u0027,"},{"line_number":40,"context_line":"                           \u0027ext3 namespace\u0027, 1)"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def fake_policy_enforce(context, action, target, do_raise\u003dTrue):"},{"line_number":44,"context_line":"    return True"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPX%2F%2F2LE%3D","line":42,"updated":"2013-06-07 17:32:14.000000000","message":"Two lines between top-level functions.","commit_id":"c7aa51f724883cacc7c395bf36cc112a67eee3c8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b3f6597d04ee59896e9b6285f7f3f2c695f0f6e","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_extension_info_list(self):"},{"line_number":64,"context_line":"        self.stubs.Set(policy, \u0027enforce\u0027, fake_policy_enforce)"},{"line_number":65,"context_line":"        req \u003d fakes.HTTPRequestV3.blank(\u0027/v3/extensions\u0027)"},{"line_number":66,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":67,"context_line":"        self.assertEqual(3, len(res_dict[\u0027extensions\u0027]))"},{"line_number":68,"context_line":"        for e in res_dict[\u0027extensions\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F1OA%3D","line":65,"updated":"2013-06-08 04:27:45.000000000","message":"maurosr went through removing the /v3 from all of the fakes.HTTPRequestV3.blank calls in test_servers.py because it\u0027s part of already part of kwargs[\u0027base_url\u0027]. Do we need to do that across the board?\n\nhttps://github.com/openstack/nova/blob/f5d790/nova/tests/api/openstack/fakes.py#L341","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"2173e5961042fa5f79c8b5df281537046f2db115","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_extension_info_list(self):"},{"line_number":64,"context_line":"        self.stubs.Set(policy, \u0027enforce\u0027, fake_policy_enforce)"},{"line_number":65,"context_line":"        req \u003d fakes.HTTPRequestV3.blank(\u0027/v3/extensions\u0027)"},{"line_number":66,"context_line":"        res_dict \u003d self.controller.index(req)"},{"line_number":67,"context_line":"        self.assertEqual(3, len(res_dict[\u0027extensions\u0027]))"},{"line_number":68,"context_line":"        for e in res_dict[\u0027extensions\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2Fz0Q%3D","line":65,"in_reply_to":"AAAAPX%2F%2F1OA%3D","updated":"2013-06-10 01:25:12.000000000","message":"yea, sort of. In this context it doesn\u0027t actually matter what you pass to the blank function because the controller object is called directly with the parameters to it explicitly specified rather than relying on something higher up parsing the URL. We just need a dummy Request object to pass to the controller.\n\nBut its still a good idea to have something plausibly correct.","commit_id":"c39a01dd20f562121dbce46499e0a8fb5d15898e"}]}
