)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cf597d4e27d09659b2226423057e873676ce4192","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add keystone call to validate the tenant id."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Implements: blueprint add-support-to-get-tenant-id-from-keystone"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partial-Bug: #1307475"},{"line_number":14,"context_line":"Partial-Bug: #1307491"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"ba3cc151_7faa281b","line":11,"updated":"2015-07-07 02:01:10.000000000","message":"Can we add a note here as to why the requirements change Is needed.  Just helps to trace back if necessary.","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"dd3840eefbff7da1f53df40b879a41c51be4b27f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add keystone call to validate the tenant id."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Implements: blueprint add-support-to-get-tenant-id-from-keystone"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partial-Bug: #1307475"},{"line_number":14,"context_line":"Partial-Bug: #1307491"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"ba3cc151_1e9f5360","line":11,"in_reply_to":"ba3cc151_7faa281b","updated":"2015-07-07 08:53:22.000000000","message":"Sure, I\u0027ve updated commit message","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"f136300b02bad262a98259a5935fe0b3e739dacf","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add tenant validation to quota"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In cinder, tenant-id is a positional arguments for many commands"},{"line_number":10,"context_line":"(e.g. quota update, show, etc) and if we pass an invalid tenant-id,"},{"line_number":11,"context_line":"the commands do not throw an error and runs successfully. Whereas,"},{"line_number":12,"context_line":"if an invalid tenant-id is provided, it should validate the tenant-id"},{"line_number":13,"context_line":"and throw an error. This will provide help as the user will get to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba3cc151_79e387a4","line":10,"updated":"2015-07-09 15:02:37.000000000","message":"\u0027show\u0027 is being fixed in this change anymore.","commit_id":"4ebca05d377dd0aae526dffc7a26587c970ccf4c"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"f136300b02bad262a98259a5935fe0b3e739dacf","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint add-support-to-get-tenant-id-from-keystone"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partial-Bug: #1307475"},{"line_number":23,"context_line":"Partial-Bug: #1307491"},{"line_number":24,"context_line":"Partial-Bug: #1307487"},{"line_number":25,"context_line":"Partial-Bug: #1215320"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba3cc151_f99c770f","line":22,"updated":"2015-07-09 15:02:37.000000000","message":"Since you remove the verification for \u0027show\u0027 API, this bug shouldn\u0027t be here.","commit_id":"4ebca05d377dd0aae526dffc7a26587c970ccf4c"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"09829ea6d485023f16898b81276eb061c19587f5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"This will provide help as the user will get to know if an invalid"},{"line_number":14,"context_line":"tenant-id is being passed as an argument to the cinder command."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Add keystoneclient to requerments, it\u0027s needed to make call to"},{"line_number":17,"context_line":"keystone to validate the tenant id."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Implements: blueprint add-support-to-get-tenant-id-from-keystone"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"ba3cc151_7fa36443","line":16,"updated":"2015-07-09 17:01:23.000000000","message":"typo: requirements","commit_id":"cc93d1331c8042e85eaaf4a67810fd69c940f925"}],"cinder/api/contrib/quotas.py":[{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e2673b18ccd4c243f9fff290de235bd64489640b","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        auth \u003d identity.v3.Token("},{"line_number":96,"context_line":"            auth_url\u003dCONF.keymgr.encryption_auth_url,"},{"line_number":97,"context_line":"            token\u003dcontext.auth_token)"},{"line_number":98,"context_line":"        sess \u003d session.Session(auth\u003dauth)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        keystone \u003d client.Client(session\u003dsess,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_8431efa3","line":97,"updated":"2014-12-24 03:54:31.000000000","message":"I\u0027m not sure using context.auth_token works for all cases.  For example, a normal user (not with admin role) tries to show quota for a tenant doesn\u0027t belongs to him/her, a 403 error will return in below _verify_project(), which is not properly handled.","commit_id":"e8b030cd3c195a068c7857bff6a761f06c769961"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e2673b18ccd4c243f9fff290de235bd64489640b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def show(self, req, id):"},{"line_number":121,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":122,"context_line":"        authorize_show(context)"},{"line_number":123,"context_line":"        self._verify_project(id, req, context)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        params \u003d req.params"},{"line_number":126,"context_line":"        if not hasattr(params, \u0027__call__\u0027) and \u0027usage\u0027 in params:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_a4242b60","line":123,"updated":"2014-12-24 03:54:31.000000000","message":"Before this change, making changes to quota doesn\u0027t validate tenant with Keystone, which means it\u0027s possible that someone wrongly made changes to some tenants that doesn\u0027t exist.  After this change, if we enforce verify_project for show(), delete(), it means using Cinder API won\u0027t be able to handle those non-existent tenant quotas.  That could be a problem.  So I think we\u0027d only verify tenant id against Keystone for update() operation.","commit_id":"e8b030cd3c195a068c7857bff6a761f06c769961"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"bbdbbae71608427a92683ff0313580f87c240495","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo.config import cfg"},{"line_number":17,"context_line":"from oslo.utils import strutils"},{"line_number":18,"context_line":"import webob"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_384917b8","line":16,"updated":"2014-12-26 15:53:23.000000000","message":"Project imports should be put behind stdlib import. See http://docs.openstack.org/developer/hacking/#real-world-import-order-examples","commit_id":"a6021fa2955674987b71f0a324282b179a04b48a"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"bbdbbae71608427a92683ff0313580f87c240495","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":89,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":90,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":91,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_b8eb4777","line":88,"updated":"2014-12-26 15:53:23.000000000","message":"Should this be put into some common lib directory?","commit_id":"a6021fa2955674987b71f0a324282b179a04b48a"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"acdeca08c2ecd55eab64039d7df010b055adac1f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":89,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":90,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":91,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_f6af309b","line":88,"in_reply_to":"3a961159_b8eb4777","updated":"2015-01-14 16:08:44.000000000","message":"I think it\u0027s better localize code,it isn\u0027t used anywhere else.","commit_id":"a6021fa2955674987b71f0a324282b179a04b48a"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"47d80647de77d9821eaf8445d2e110cc79538027","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # NOTE(aarefiev): no needs to verify project for"},{"line_number":125,"context_line":"        # non admin users, they can view only theirs quotas."},{"line_number":126,"context_line":"        if context.is_admin:"},{"line_number":127,"context_line":"            self._verify_project(id, req, context)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        params \u003d req.params"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_f9192324","line":126,"updated":"2014-12-30 21:15:00.000000000","message":"Why do we do it only for admins?","commit_id":"a6021fa2955674987b71f0a324282b179a04b48a"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"8e89149a9a847ae8fc0f724045acc18149aaf3ea","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # NOTE(aarefiev): no needs to verify project for"},{"line_number":125,"context_line":"        # non admin users, they can view only theirs quotas."},{"line_number":126,"context_line":"        if context.is_admin:"},{"line_number":127,"context_line":"            self._verify_project(id, req, context)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        params \u003d req.params"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_2b5899f9","line":126,"in_reply_to":"3a961159_f9192324","updated":"2015-01-02 18:56:38.000000000","message":"brute force verifying of projects.","commit_id":"a6021fa2955674987b71f0a324282b179a04b48a"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"5eebd31539a50680ad2a1f046152b9271f843c7f","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # NOTE(aarefiev): no needs to verify project for"},{"line_number":125,"context_line":"        # non admin users, they can view only theirs quotas."},{"line_number":126,"context_line":"        if context.is_admin:"},{"line_number":127,"context_line":"            self._verify_project(id, req, context)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        params \u003d req.params"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_f8b0a58c","line":126,"in_reply_to":"3a961159_f9192324","updated":"2015-01-08 12:49:27.000000000","message":"non admin user doesn\u0027t pass authorize if try to see not his quotas, so verify project needed only for admins","commit_id":"a6021fa2955674987b71f0a324282b179a04b48a"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"64b4d3e2d1b8c023bcaa22f5934f47661ac9c282","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":122,"context_line":"        authorize_show(context)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # NOTE(aarefiev): no needs to verify project for"},{"line_number":125,"context_line":"        # non admin users, they can view only theirs quotas."},{"line_number":126,"context_line":"        if context.is_admin:"},{"line_number":127,"context_line":"            self._verify_project(id, req, context)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_b081c2fb","line":124,"updated":"2015-01-17 19:09:38.000000000","message":"Typo: no need to \nTypo: view only their quotas","commit_id":"6f73078d3036995c5a60d2d87f35fcebc0e49c23"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"6262f996536bb9a4011cc359144812e31333582c","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":122,"context_line":"        authorize_show(context)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # NOTE(aarefiev): no needs to verify project for"},{"line_number":125,"context_line":"        # non admin users, they can view only theirs quotas."},{"line_number":126,"context_line":"        if context.is_admin:"},{"line_number":127,"context_line":"            self._verify_project(id, req, context)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a961159_8cd667c3","line":124,"in_reply_to":"3a961159_b081c2fb","updated":"2015-01-19 11:37:59.000000000","message":"Thanks Jay","commit_id":"6f73078d3036995c5a60d2d87f35fcebc0e49c23"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"6b390a2e0ad5ef596cdd6f0b57ab4a72243b4adf","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        auth \u003d identity.v3.Token("},{"line_number":96,"context_line":"            auth_url\u003dCONF.keymgr.encryption_auth_url,"},{"line_number":97,"context_line":"            token\u003dcontext.auth_token)"},{"line_number":98,"context_line":"        sess \u003d session.Session(auth\u003dauth)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_f8ee21ec","line":96,"updated":"2015-02-04 17:32:17.000000000","message":"Is the encryption_auth_url supposed to be set correctly always in any deployment?","commit_id":"d27aadb1435789d4bdd0847d4d5ce89ecae4d7e4"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"12f17e975936131a676a26ccaf61ef0014e25bdc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        auth \u003d identity.v3.Token("},{"line_number":96,"context_line":"            auth_url\u003dCONF.keymgr.encryption_auth_url,"},{"line_number":97,"context_line":"            token\u003dcontext.auth_token)"},{"line_number":98,"context_line":"        sess \u003d session.Session(auth\u003dauth)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_0a4c73c7","line":96,"in_reply_to":"da86d52c_f8ee21ec","updated":"2015-02-04 18:00:07.000000000","message":"why not,  authorization in key mgr works in same way.","commit_id":"d27aadb1435789d4bdd0847d4d5ce89ecae4d7e4"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"e440f0c274b81acf7c3a265f1fa78b499da83342","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":89,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":90,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":91,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_82724c7a","line":88,"updated":"2015-02-10 10:52:15.000000000","message":"I still think it\u0027s better to move the logic of how to create keystone client to an common file.","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"f32330e8b88019b3ab7f4bdc79488819ec2ffb7a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":89,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":90,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":91,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_93761f3d","line":88,"in_reply_to":"da86d52c_104cb79d","updated":"2015-03-02 12:02:28.000000000","message":"Got your point.","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"bc6139dd9ba7587a972c7530ca220ab0b771fab6","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            return dict((k, v[\u0027limit\u0027]) for k, v in values.items())"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":89,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":90,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":91,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_104cb79d","line":88,"in_reply_to":"da86d52c_82724c7a","updated":"2015-02-11 10:59:30.000000000","message":"I suppose that keystone client will not used elsewhere through code. So my point don\u0027t move code to common utils. I hope it is one isolated case.","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"e440f0c274b81acf7c3a265f1fa78b499da83342","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                auth_url \u003d service[\u0027endpoints\u0027][0][\u0027url\u0027]"},{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        auth \u003d identity.v3.Token("},{"line_number":96,"context_line":"            auth_url\u003dCONF.keymgr.encryption_auth_url,"},{"line_number":97,"context_line":"            token\u003dcontext.auth_token)"},{"line_number":98,"context_line":"        sess \u003d session.Session(auth\u003dauth)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_22d44046","line":95,"updated":"2015-02-10 10:52:15.000000000","message":"What if the keystone is only using v2 api? Do we need to allow user to select a version from the config file?","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"bc6139dd9ba7587a972c7530ca220ab0b771fab6","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                auth_url \u003d service[\u0027endpoints\u0027][0][\u0027url\u0027]"},{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        auth \u003d identity.v3.Token("},{"line_number":96,"context_line":"            auth_url\u003dCONF.keymgr.encryption_auth_url,"},{"line_number":97,"context_line":"            token\u003dcontext.auth_token)"},{"line_number":98,"context_line":"        sess \u003d session.Session(auth\u003dauth)"}],"source_content_type":"text/x-python","patch_set":12,"id":"da86d52c_7caeaf2f","line":95,"in_reply_to":"da86d52c_22d44046","updated":"2015-02-11 10:59:30.000000000","message":"created client at line 100 - client.Client(...) is factory to create a new identity service client, it is support v2 and v3 api version. And I think it should select api version. As I know we don\u0027t specify keystone api version in cinder config, and I don\u0027t see reasons to do it.","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"f32330e8b88019b3ab7f4bdc79488819ec2ffb7a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                auth_url \u003d service[\u0027endpoints\u0027][0][\u0027url\u0027]"},{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        auth \u003d identity.v3.Token("},{"line_number":96,"context_line":"            auth_url\u003dCONF.keymgr.encryption_auth_url,"},{"line_number":97,"context_line":"            token\u003dcontext.auth_token)"},{"line_number":98,"context_line":"        sess \u003d session.Session(auth\u003dauth)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_f3075b7f","line":95,"in_reply_to":"da86d52c_7caeaf2f","updated":"2015-03-02 12:02:28.000000000","message":"Got your point.","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"06b278a9aa08d8cc9296f35a07c2ae77b40f1f4e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        authorize_show(context)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # NOTE(aarefiev): no need to verify project for"},{"line_number":125,"context_line":"        # non admin users, they can view only their quotas"},{"line_number":126,"context_line":"        if context.is_admin:"},{"line_number":127,"context_line":"            self._verify_project(id, req, context)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_e4271710","line":125,"updated":"2015-03-16 09:30:41.000000000","message":"Can you please add something along the lines of \"No call to keystone should be made for none-admin tenants since it opens up a DoS opportunity otherwise\". This is mostly as a note to future programmers who might want to add further external validation calls to other code paths - we\u0027ve had a few suggested that made it trivial to clog up the API service indefinitely.","commit_id":"fd537d044d8729dc315fc6a9119d022d95d8df5d"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cf597d4e27d09659b2226423057e873676ce4192","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        # NOTE: No call to keystone should be made for none-admin tenants"},{"line_number":109,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":110,"context_line":"        keystone \u003d self._get_keystone_client(req, context)"},{"line_number":111,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_5f7c04eb","line":108,"updated":"2015-07-07 02:01:10.000000000","message":"Typo here none-admin should be non-admin","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"dd3840eefbff7da1f53df40b879a41c51be4b27f","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        # NOTE: No call to keystone should be made for none-admin tenants"},{"line_number":109,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":110,"context_line":"        keystone \u003d self._get_keystone_client(req, context)"},{"line_number":111,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_fe8aaf19","line":108,"in_reply_to":"ba3cc151_5f7c04eb","updated":"2015-07-07 08:53:22.000000000","message":"Done","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cf597d4e27d09659b2226423057e873676ce4192","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        authorize_show(context)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # NOTE(aarefiev): no need to verify project for non admin"},{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_bfdbd0ec","line":127,"updated":"2015-07-07 02:01:10.000000000","message":"Remove \u0027is\u0027","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"dd3840eefbff7da1f53df40b879a41c51be4b27f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        authorize_show(context)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # NOTE(aarefiev): no need to verify project for non admin"},{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_5ed15bfa","line":127,"in_reply_to":"ba3cc151_bfdbd0ec","updated":"2015-07-07 08:53:22.000000000","message":"Done","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cf597d4e27d09659b2226423057e873676ce4192","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # NOTE(aarefiev): no need to verify project for non admin"},{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_9f492cba","line":128,"updated":"2015-07-07 02:01:10.000000000","message":"Non-admin","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"dd3840eefbff7da1f53df40b879a41c51be4b27f","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # NOTE(aarefiev): no need to verify project for non admin"},{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_7ecc5f61","line":128,"in_reply_to":"ba3cc151_9f492cba","updated":"2015-07-07 08:53:22.000000000","message":"Done","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e5eb2edd845039a401af936100de500cd3bdb5e0","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        params \u003d req.params"},{"line_number":133,"context_line":"        if not hasattr(params, \u0027__call__\u0027) and \u0027usage\u0027 in params:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_95502bd6","line":130,"updated":"2015-07-07 02:58:39.000000000","message":"Is it really necessary to verify project for a readonly operation like this?  A wrong project id can\u0027t do any harm.","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"3b0f356f628ab23912af3162ded5e3d46fab0b2a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        params \u003d req.params"},{"line_number":133,"context_line":"        if not hasattr(params, \u0027__call__\u0027) and \u0027usage\u0027 in params:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_3fa57146","line":130,"updated":"2015-07-07 09:50:11.000000000","message":"Well, at least for read only operations, it just a trade off between better UX and risk of overloading keystone.  Is it too hard to figure out you mistype a uuid?  Maybe yes.  Personally, I don\u0027t mind seeing default value for a wrong tenant.","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"de7b7e214c9d3fce2d0d7298149d6df83a095429","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        params \u003d req.params"},{"line_number":133,"context_line":"        if not hasattr(params, \u0027__call__\u0027) and \u0027usage\u0027 in params:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_2a63ee42","line":130,"in_reply_to":"ba3cc151_3fa57146","updated":"2015-07-07 11:11:47.000000000","message":"Not sure how often quota show used to DoS keystone, ok, I\u0027ll remove it","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"dd3840eefbff7da1f53df40b879a41c51be4b27f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # users, they can view only their quotas. Also it is opens up"},{"line_number":128,"context_line":"        # a DoS opportunity for none-admin tenants"},{"line_number":129,"context_line":"        if context.is_admin:"},{"line_number":130,"context_line":"            self._verify_project(id, req, context)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        params \u003d req.params"},{"line_number":133,"context_line":"        if not hasattr(params, \u0027__call__\u0027) and \u0027usage\u0027 in params:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_f9016905","line":130,"in_reply_to":"ba3cc151_95502bd6","updated":"2015-07-07 08:53:22.000000000","message":"Yes, but as for me, it is confusing to get default values here, we already have  quota-defaults for this;\nalso if I make mistake in tenant-id,  it happens sometimes, it will return wrong quota, and I prefer to see wrong tenant.","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cf597d4e27d09659b2226423057e873676ce4192","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":148,"context_line":"        authorize_update(context)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        # NOTE: No call to keystone should be made for none-admin tenants"},{"line_number":151,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":152,"context_line":"        self._verify_project(id, req, context)"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_7fe548a6","line":150,"updated":"2015-07-07 02:01:10.000000000","message":"Same here","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"dd3840eefbff7da1f53df40b879a41c51be4b27f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":148,"context_line":"        authorize_update(context)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        # NOTE: No call to keystone should be made for none-admin tenants"},{"line_number":151,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":152,"context_line":"        self._verify_project(id, req, context)"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba3cc151_d94ca578","line":150,"in_reply_to":"ba3cc151_7fe548a6","updated":"2015-07-07 08:53:22.000000000","message":"Done","commit_id":"fecb62b9a432af19f8369b9450994b8fc63f6a2b"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"79b93186390f57907fbb198173d7fa317ae01e49","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            return {k: v[\u0027limit\u0027] for k, v in values.items()}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":96,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":97,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":98,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_6ba3ae43","line":95,"updated":"2015-07-09 15:19:19.000000000","message":"I think we should use same argument order as in the rest of the methods, which is: self, context, req","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0acee6bf53eb4914a6edb616f7869377bb883dba","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        else:"},{"line_number":93,"context_line":"            return {k: v[\u0027limit\u0027] for k, v in values.items()}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _get_keystone_client(self, req, context):"},{"line_number":96,"context_line":"        token_info \u003d req.environ[\u0027keystone.token_info\u0027]"},{"line_number":97,"context_line":"        for service in token_info[\u0027token\u0027][\u0027catalog\u0027]:"},{"line_number":98,"context_line":"            if service[\u0027type\u0027] \u003d\u003d \u0027identity\u0027:"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_c1ce592c","line":95,"in_reply_to":"ba3cc151_6ba3ae43","updated":"2015-07-09 16:03:04.000000000","message":"Done","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"79b93186390f57907fbb198173d7fa317ae01e49","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                                 project_id\u003dcontext.project_id)"},{"line_number":111,"context_line":"        return keystone"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_2b6846f4","line":113,"updated":"2015-07-09 15:19:19.000000000","message":"Same here: self, context, req, project_id","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0acee6bf53eb4914a6edb616f7869377bb883dba","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                                 project_id\u003dcontext.project_id)"},{"line_number":111,"context_line":"        return keystone"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_a1d8f5ef","line":113,"in_reply_to":"ba3cc151_2b6846f4","updated":"2015-07-09 16:03:04.000000000","message":"Done","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"79b93186390f57907fbb198173d7fa317ae01e49","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":117,"context_line":"        keystone \u003d self._get_keystone_client(req, context)"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            # NOTE(aarefiev): support keystone v2 and v3"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_8b7952ca","line":116,"updated":"2015-07-09 15:19:19.000000000","message":"Are you trying to say that this method should never be called by non-admin tenants? Because if that\u0027s what you are trying to say it should be stated more clearly.","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"674f2f0d1606219b8efa8871fcaf4284cf6831a3","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":117,"context_line":"        keystone \u003d self._get_keystone_client(req, context)"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            # NOTE(aarefiev): support keystone v2 and v3"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_b53eebb5","line":116,"in_reply_to":"ba3cc151_644e7b39","updated":"2015-07-09 16:34:04.000000000","message":"What do you think of?:\n\n # NOTE: This method must only be called with admin tenants to prevent\n # possible DoS attacks.","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0acee6bf53eb4914a6edb616f7869377bb883dba","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def _verify_project(self, project_id, req, context):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":117,"context_line":"        keystone \u003d self._get_keystone_client(req, context)"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            # NOTE(aarefiev): support keystone v2 and v3"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_644e7b39","line":116,"in_reply_to":"ba3cc151_8b7952ca","updated":"2015-07-09 16:03:04.000000000","message":"yep, you are right, you are welcome to propose more clearly note","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"09829ea6d485023f16898b81276eb061c19587f5","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def _verify_project(self, context, project_id, req):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":117,"context_line":"        keystone \u003d self._get_keystone_client(context, req)"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            # NOTE(aarefiev): support keystone v2 and v3"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba3cc151_3052e913","line":116,"updated":"2015-07-09 17:01:23.000000000","message":"Maybe I am missing something, but I can\u0027t see here where you are checking if the the user is admin or not.","commit_id":"cc93d1331c8042e85eaaf4a67810fd69c940f925"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"d1122ebac73dbaeb7509517a85da2905461c97b9","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def _verify_project(self, context, project_id, req):"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":116,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":117,"context_line":"        keystone \u003d self._get_keystone_client(context, req)"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            # NOTE(aarefiev): support keystone v2 and v3"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba3cc151_c6c5e43d","line":116,"in_reply_to":"ba3cc151_3052e913","updated":"2015-07-10 10:51:12.000000000","message":"It is just note for those who will use this method","commit_id":"cc93d1331c8042e85eaaf4a67810fd69c940f925"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"019df9616129d101217b387ae1de9fca939d4d09","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        authorize_update(context)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":152,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":153,"context_line":"        self._verify_project(context, id, req)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        project_id \u003d id"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba3cc151_4a4259ac","line":152,"updated":"2015-07-09 18:51:59.000000000","message":"I think you have to check \"if context.is_admin:\" here, right?","commit_id":"cc93d1331c8042e85eaaf4a67810fd69c940f925"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"d1122ebac73dbaeb7509517a85da2905461c97b9","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        authorize_update(context)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        # NOTE: No call to keystone should be made for non-admin tenants"},{"line_number":152,"context_line":"        # since it opens up a DoS opportunity otherwise"},{"line_number":153,"context_line":"        self._verify_project(context, id, req)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        project_id \u003d id"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba3cc151_66d97822","line":152,"in_reply_to":"ba3cc151_4a4259ac","updated":"2015-07-10 10:51:12.000000000","message":"It is admin only  operation","commit_id":"cc93d1331c8042e85eaaf4a67810fd69c940f925"}],"cinder/tests/api/contrib/test_quotas.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"477e827456ff86dac169900833310923de86ec2c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        result \u003d self.controller.defaults(self.req, \u0027foo\u0027)"},{"line_number":78,"context_line":"        self.assertDictMatch(result, make_body())"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_defaults_wrong_tenant_id(self):"},{"line_number":81,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.defaults,"},{"line_number":82,"context_line":"                          self.req, \u0027boo\u0027)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_58495c31","line":80,"updated":"2015-01-15 06:40:09.000000000","message":"The test case looks reasonable. Could you explain why it is not needed?","commit_id":"d079a414fa0d020a6e38223ed73fe247ab40a669"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f41f77fb267fc89816a89b0ead7ab7da5eb817c7","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        result \u003d self.controller.defaults(self.req, \u0027foo\u0027)"},{"line_number":78,"context_line":"        self.assertDictMatch(result, make_body())"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_defaults_wrong_tenant_id(self):"},{"line_number":81,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.defaults,"},{"line_number":82,"context_line":"                          self.req, \u0027boo\u0027)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_95aae6d1","line":80,"in_reply_to":"3a961159_58495c31","updated":"2015-01-19 11:40:28.000000000","message":"I think it is no longer actual, please see https://review.openstack.org/#/c/139610/","commit_id":"d079a414fa0d020a6e38223ed73fe247ab40a669"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"477e827456ff86dac169900833310923de86ec2c","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden, self.controller.delete,"},{"line_number":159,"context_line":"                          self.req, \u0027foo\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_delete_wrong_tenant_id(self):"},{"line_number":162,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,"},{"line_number":163,"context_line":"                          self.req, \u0027boo\u0027)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_78461823","line":161,"updated":"2015-01-15 06:40:09.000000000","message":"The test case looks reasonable. Could you explain why it is not needed?","commit_id":"d079a414fa0d020a6e38223ed73fe247ab40a669"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"f41f77fb267fc89816a89b0ead7ab7da5eb817c7","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        self.assertRaises(webob.exc.HTTPForbidden, self.controller.delete,"},{"line_number":159,"context_line":"                          self.req, \u0027foo\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_delete_wrong_tenant_id(self):"},{"line_number":162,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,"},{"line_number":163,"context_line":"                          self.req, \u0027boo\u0027)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_155a76f5","line":161,"in_reply_to":"3a961159_78461823","updated":"2015-01-19 11:40:28.000000000","message":"There are no need to check wrong tenant id on delete, if non admin try do it  - if fails due context check, if admin -  it can\u0027t delete non existing quota.","commit_id":"d079a414fa0d020a6e38223ed73fe247ab40a669"},{"author":{"_account_id":6825,"name":"Gary W. Smith","email":"garysmith123@gmail.com","username":"gary-w-smith"},"change_message_id":"a6c62d83a4f423c24f2fd51dba65aa99c32e6256","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_show_wrong_tenant_id(self):"},{"line_number":85,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.show,"},{"line_number":86,"context_line":"                          self.req, \u0027boo\u0027)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def test_show_not_authorized(self):"},{"line_number":89,"context_line":"        self.req.environ[\u0027cinder.context\u0027].is_admin \u003d False"},{"line_number":90,"context_line":"        self.req.environ[\u0027cinder.context\u0027].user_id \u003d \u0027bad_user\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_4b8c4c36","line":87,"updated":"2015-02-06 22:26:29.000000000","message":"The logic in show() is different for admin vs. non-admin users.  Per line 72, this test only covers the admin user. I would like to see a test that covers the non admin case.","commit_id":"7d86ee4af3b79527bd545ef18eab4e454fe4178f"}],"cinder/tests/unit/api/contrib/test_quotas.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"79b93186390f57907fbb198173d7fa317ae01e49","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from cinder import db"},{"line_number":28,"context_line":"from cinder import test"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from keystoneclient import exceptions"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def make_body(root\u003dTrue, gigabytes\u003d1000, snapshots\u003d10,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_eb3b3ee8","line":30,"updated":"2015-07-09 15:19:19.000000000","message":"This goes above cinder imports","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0acee6bf53eb4914a6edb616f7869377bb883dba","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from cinder import db"},{"line_number":28,"context_line":"from cinder import test"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from keystoneclient import exceptions"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def make_body(root\u003dTrue, gigabytes\u003d1000, snapshots\u003d10,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_a46fa390","line":30,"in_reply_to":"ba3cc151_eb3b3ee8","updated":"2015-07-09 16:03:04.000000000","message":"Done","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"79b93186390f57907fbb198173d7fa317ae01e49","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.req \u003d mock.MagicMock()"},{"line_number":73,"context_line":"        self.req.environ[\u0027cinder.context\u0027].is_admin \u003d True"},{"line_number":74,"context_line":"        self.controller._get_keystone_client \u003d mock.Mock("},{"line_number":75,"context_line":"            return_value\u003dself.FakeClient())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_defaults(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_8e43a041","line":74,"updated":"2015-07-09 15:19:19.000000000","message":"You cannot mock _get_keystone_client method, otherwise you are not testing that new method anywhere.\n\nYou must mock the call client.Client","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"674f2f0d1606219b8efa8871fcaf4284cf6831a3","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.req \u003d mock.MagicMock()"},{"line_number":73,"context_line":"        self.req.environ[\u0027cinder.context\u0027].is_admin \u003d True"},{"line_number":74,"context_line":"        self.controller._get_keystone_client \u003d mock.Mock("},{"line_number":75,"context_line":"            return_value\u003dself.FakeClient())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_defaults(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_352bbb83","line":74,"in_reply_to":"ba3cc151_84e93fe8","updated":"2015-07-09 16:34:04.000000000","message":"Well what I propose is basically that you test the code path for the 20 lines of code that go in _get_keystone_client, otherwise you are just testing half the code you are adding.\n\nAnd yes, you are correct, you\u0027ll need to add token_info and catalog to the req, mock Token from keystone and Client if it\u0027s not mocked already.","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0acee6bf53eb4914a6edb616f7869377bb883dba","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.req \u003d mock.MagicMock()"},{"line_number":73,"context_line":"        self.req.environ[\u0027cinder.context\u0027].is_admin \u003d True"},{"line_number":74,"context_line":"        self.controller._get_keystone_client \u003d mock.Mock("},{"line_number":75,"context_line":"            return_value\u003dself.FakeClient())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_defaults(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_84e93fe8","line":74,"in_reply_to":"ba3cc151_8e43a041","updated":"2015-07-09 16:03:04.000000000","message":"Hm not sure, what are you propose to test, in your case I need to mock token, session, what is left? it wouldn\u0027t be useful test imo.","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"79b93186390f57907fbb198173d7fa317ae01e49","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_update_wrong_tenant_id(self):"},{"line_number":108,"context_line":"        body \u003d make_body(gigabytes\u003d20, snapshots\u003d1,"},{"line_number":109,"context_line":"                         volumes\u003d5, backups\u003d5, tenant_id\u003dNone)"},{"line_number":110,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.update,"},{"line_number":111,"context_line":"                          self.req, \u0027boo\u0027, body)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_6e897c6e","line":109,"updated":"2015-07-09 15:19:19.000000000","message":"tenant_id should be a valid nonexistent tenant_id","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":13636,"name":"aarefiev","display_name":"Anton","email":"arefyevanton@gmail.com","username":"aarefiev"},"change_message_id":"0acee6bf53eb4914a6edb616f7869377bb883dba","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_update_wrong_tenant_id(self):"},{"line_number":108,"context_line":"        body \u003d make_body(gigabytes\u003d20, snapshots\u003d1,"},{"line_number":109,"context_line":"                         volumes\u003d5, backups\u003d5, tenant_id\u003dNone)"},{"line_number":110,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.update,"},{"line_number":111,"context_line":"                          self.req, \u0027boo\u0027, body)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_a4cb2371","line":109,"in_reply_to":"ba3cc151_6e897c6e","updated":"2015-07-09 16:03:04.000000000","message":"tenant_id \u0027boo\u0027 is explicitly passed to update","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"674f2f0d1606219b8efa8871fcaf4284cf6831a3","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def test_update_wrong_tenant_id(self):"},{"line_number":108,"context_line":"        body \u003d make_body(gigabytes\u003d20, snapshots\u003d1,"},{"line_number":109,"context_line":"                         volumes\u003d5, backups\u003d5, tenant_id\u003dNone)"},{"line_number":110,"context_line":"        self.assertRaises(webob.exc.HTTPNotFound, self.controller.update,"},{"line_number":111,"context_line":"                          self.req, \u0027boo\u0027, body)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"ba3cc151_ba6a5a18","line":109,"in_reply_to":"ba3cc151_a4cb2371","updated":"2015-07-09 16:34:04.000000000","message":"Oh, I didn\u0027t see that when tenant_id is None it is not added to the body.  You are correct, this is fine.","commit_id":"9fe79aa2b403e0f21895e446a932b9c53b5414e5"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"09829ea6d485023f16898b81276eb061c19587f5","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class QuotaSetsControllerTest(test.TestCase):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    class FakeClient(object):"},{"line_number":61,"context_line":"        class FakeProject(object):"},{"line_number":62,"context_line":"            def get(self, project_id):"},{"line_number":63,"context_line":"                if project_id !\u003d \u0027foo\u0027:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba3cc151_30d8a952","line":60,"updated":"2015-07-09 17:01:23.000000000","message":"Nice what you did in order to mock keystoneclient.","commit_id":"cc93d1331c8042e85eaaf4a67810fd69c940f925"},{"author":{"_account_id":12924,"name":"Patrick East","email":"east.patrick@gmail.com","username":"patrick.east"},"change_message_id":"13128a22fb2d76b170fe954f8ac319d82dc743a4","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.req \u003d mock.MagicMock()"},{"line_number":73,"context_line":"        self.req.environ[\u0027cinder.context\u0027].is_admin \u003d True"},{"line_number":74,"context_line":"        self.controller._get_keystone_client \u003d mock.Mock("},{"line_number":75,"context_line":"            return_value\u003dself.FakeClient())"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_defaults(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a41bdd9_9f530f6b","line":74,"updated":"2015-07-15 03:04:50.000000000","message":"If this is going to be mocked out for the update tests it should have its own tests too.","commit_id":"a448cabf9c94f5b5d10835ed8e4496014503ca40"}]}
