)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17130,"name":"melissaml","email":"ma.lei@99cloud.net","username":"malei"},"change_message_id":"bc64179a07e91d55427de7d3c0ad5a9ea6597669","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add Hierarchy info"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Make calls to keystone to get project"},{"line_number":10,"context_line":"hierachy and check whether project is root."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If91efaa38ceecfb0396eaf58dda163b1769baf69"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa6399be_ce00d5ad","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":8},"updated":"2016-10-11 07:05:02.000000000","message":"s/hierachy/hierarchy/","commit_id":"539348c2cadd51857468f8b8ed47eb64248a7d2c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"fb920af4e685cb09a6749021168a083f593be722","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Make calls to keystone to get project"},{"line_number":10,"context_line":"hierachy and check whether project is root."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If91efaa38ceecfb0396eaf58dda163b1769baf69"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da6895a0_2577873b","line":11,"updated":"2016-10-22 22:48:47.000000000","message":"blueprint: nested-quota-driver-api ?","commit_id":"798930483d12d931e76fe82ffaff9953175695b7"}],"nova/context.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fe14ef63762bc27f3b656dff487e122d3194a8e2","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from contextlib import contextmanager"},{"line_number":21,"context_line":"import copy"},{"line_number":22,"context_line":"import webob"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystoneauth1.access import service_catalog as ksa_service_catalog"},{"line_number":25,"context_line":"from keystoneauth1 import plugin"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_881df511","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":12},"updated":"2016-10-11 05:43:06.000000000","message":"It should be after line 35.","commit_id":"539348c2cadd51857468f8b8ed47eb64248a7d2c"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fe14ef63762bc27f3b656dff487e122d3194a8e2","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        except exceptions.Forbidden:"},{"line_number":348,"context_line":"            LOG.error(_LE(\"Failed to get_project, user with tenant id: %s \""},{"line_number":349,"context_line":"                          \"may not have necessary permissions or \""},{"line_number":350,"context_line":"                          \"correct token scope.\") % project_id)"},{"line_number":351,"context_line":"            project \u003d None"},{"line_number":352,"context_line":"        return project"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa6399be_e8b911ee","line":350,"range":{"start_line":350,"start_character":49,"end_line":350,"end_character":51},"updated":"2016-10-11 05:43:06.000000000","message":"Use \u0027,\u0027 instead of \u0027%\u0027.","commit_id":"539348c2cadd51857468f8b8ed47eb64248a7d2c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"fb920af4e685cb09a6749021168a083f593be722","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                project \u003d keystone.projects.get(project_id,"},{"line_number":343,"context_line":"                                                subtree_as_ids\u003dsubtree)"},{"line_number":344,"context_line":"        except exceptions.NotFound:"},{"line_number":345,"context_line":"            msg \u003d (_(\"Tenant ID: %s does not exist.\") % project_id)"},{"line_number":346,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003dmsg)"},{"line_number":347,"context_line":"        except exceptions.Forbidden:"},{"line_number":348,"context_line":"            LOG.error(_LE(\"Failed to get_project, user with tenant id: %s \""}],"source_content_type":"text/x-python","patch_set":7,"id":"da6895a0_8594d337","line":345,"range":{"start_line":345,"start_character":22,"end_line":345,"end_character":28},"updated":"2016-10-22 22:48:47.000000000","message":"nit: I believe, \"project\" is currently the preferred term","commit_id":"798930483d12d931e76fe82ffaff9953175695b7"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"fb920af4e685cb09a6749021168a083f593be722","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        elif context.quota_class !\u003d class_name:"},{"line_number":418,"context_line":"            raise exception.Forbidden()"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"KEYSTONE \u003d HierarchyInfo()"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"@contextmanager"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6895a0_a599d770","line":420,"updated":"2016-10-22 22:48:47.000000000","message":"I wonder, what\u0027s the point of having this class in the first place? Was it meant to cache keystoneclient instances? As we create those on *every* call now, looks like we could simply have functions instead.","commit_id":"798930483d12d931e76fe82ffaff9953175695b7"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"c0b91f4fac5701b8189c931e54f2c1d48153e58f","unresolved":false,"context_lines":[{"line_number":309,"context_line":"class HierarchyInfo(context.RequestContext):"},{"line_number":310,"context_line":"    \"\"\"Abstraction layer for Keystone V2 and V3 project objects\"\"\""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    class GenericProjectInfo(object):"},{"line_number":313,"context_line":"        def __init__(self, project_id, project_keystone_api_version,"},{"line_number":314,"context_line":"                        project_parent_id\u003dNone, project_subtree\u003dNone):"},{"line_number":315,"context_line":"            self.project_id \u003d project_id"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5da102_5b72bae6","line":312,"updated":"2016-10-27 09:30:08.000000000","message":"Could you, please, clarify why this class definition is inside the HierarchyInfo?","commit_id":"fc99ae5d5ddc669f5b4497feae1a32eeb53e1f0f"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"c0b91f4fac5701b8189c931e54f2c1d48153e58f","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        auth_plugin \u003d token.Token("},{"line_number":322,"context_line":"            auth_url\u003dCONF.keystone_authtoken.auth_uri,"},{"line_number":323,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":324,"context_line":"            project_id\u003dcontext.project_id)"},{"line_number":325,"context_line":"        client_session \u003d session.Session(auth\u003dauth_plugin)"},{"line_number":326,"context_line":"        return client.Client(auth_url\u003dCONF.keystone_authtoken.auth_uri,"},{"line_number":327,"context_line":"                             session\u003dclient_session)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5da102_9bfff233","line":324,"updated":"2016-10-27 09:30:08.000000000","message":"I think we have already had keystone connection while the first auth check in middleware was doing.\nPossibly, we can just use the previously created auth plugin.","commit_id":"fc99ae5d5ddc669f5b4497feae1a32eeb53e1f0f"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"c0b91f4fac5701b8189c931e54f2c1d48153e58f","unresolved":false,"context_lines":[{"line_number":323,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":324,"context_line":"            project_id\u003dcontext.project_id)"},{"line_number":325,"context_line":"        client_session \u003d session.Session(auth\u003dauth_plugin)"},{"line_number":326,"context_line":"        return client.Client(auth_url\u003dCONF.keystone_authtoken.auth_uri,"},{"line_number":327,"context_line":"                             session\u003dclient_session)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def get_project(self, context, project_id, subtree\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5da102_db908aef","line":326,"updated":"2016-10-27 09:30:08.000000000","message":"Is auth_url here necessary?","commit_id":"fc99ae5d5ddc669f5b4497feae1a32eeb53e1f0f"}]}
