)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"77dc30e5261eb11b372fb4c38713a0bbfba876fd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      * The JSON Home test now uses assertDictEquals to make it"},{"line_number":13,"context_line":"        easier to debug json_home document errors"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"      * It was by general good luck that the overloaded relation"},{"line_number":16,"context_line":"        \u0027identity_providers\u0027 worked as expected. The relation was"},{"line_number":17,"context_line":"        used for both \u0027/OS-FEDERATION/identity_providers\u0027 and"},{"line_number":18,"context_line":"        the Identity-Provider-Specific WebSSO path. The change"},{"line_number":19,"context_line":"        to the JSON Home document and the tests make the"},{"line_number":20,"context_line":"        Identity-Provider-Specific WebSSO path now a relation"},{"line_number":21,"context_line":"        of \u0027identity_providers_websso\u0027 to more closely align"},{"line_number":22,"context_line":"        with \u0027websso\u0027 relation for"},{"line_number":23,"context_line":"        \u0027/auth/OS-FEDERATION/websso/{protocol_id}\u0027. While"},{"line_number":24,"context_line":"        this constitutes a minor break in our contract (the"},{"line_number":25,"context_line":"        output of the json home document) it was required to"},{"line_number":26,"context_line":"        ensure consistency and functionality. The alternative"},{"line_number":27,"context_line":"        is to not represent \u0027/OS-FEDERATION/identity_providers\u0027"},{"line_number":28,"context_line":"        (list endpoint) in the JSON Home document at all, instead"},{"line_number":29,"context_line":"        represent only the WebSSO endpoint."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: If746c14491322d4a5f88fa0cbb31105f6d38c240"},{"line_number":32,"context_line":"Partial-Bug: #1776504"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_f1c9adab","line":29,"range":{"start_line":15,"start_character":8,"end_line":29,"end_character":43},"updated":"2018-08-11 02:05:20.000000000","message":"I deliberated extensively before choosing this path. It comes down to intention of the JSON Home document.\n\nIt is possible to flip to the \"alternative\" but it will require a one-off special case to not add the json_home\nfor the \"identity_providers\" plural (list) endpoint, and it felt more incorrect to represent websso as \"identity_providers\".","commit_id":"b2278b20a615d029d2fbe946ff98054dbaa14b70"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Convert OS-FEDERATION to flask native dispatching"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Convert OS-FEDERATION to flask native dispatching."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"NOTE: Two changes occured that impact testing in this patch."},{"line_number":12,"context_line":"      * The JSON Home test now uses assertDictEquals to make it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3f79a3b5_ce58d257","line":9,"updated":"2018-08-21 12:06:31.000000000","message":"Probably not necessary to duplicate the subject in the body","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ccbda286e6e34bb3a06002639c6b07a232e14674","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Convert OS-FEDERATION to flask native dispatching"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Convert OS-FEDERATION to flask native dispatching."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"NOTE: Two changes occured that impact testing in this patch."},{"line_number":12,"context_line":"      * The JSON Home test now uses assertDictEquals to make it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3f79a3b5_a5520534","line":9,"in_reply_to":"3f79a3b5_ce58d257","updated":"2018-08-23 16:53:32.000000000","message":"Fair.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        ensure consistency and functionality. The alternative"},{"line_number":27,"context_line":"        is to not represent \u0027/OS-FEDERATION/identity_providers\u0027"},{"line_number":28,"context_line":"        (list endpoint) in the JSON Home document at all, instead"},{"line_number":29,"context_line":"        represent only the WebSSO endpoint."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: If746c14491322d4a5f88fa0cbb31105f6d38c240"},{"line_number":32,"context_line":"Partial-Bug: #1776504"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3f79a3b5_ee7a6eb8","line":29,"updated":"2018-08-21 12:06:31.000000000","message":"I\u0027m okay with this","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cccfa13569a8905bbc209ec5c59eec38fe8a4777","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        ensure consistency and functionality. The alternative"},{"line_number":27,"context_line":"        is to not represent \u0027/OS-FEDERATION/identity_providers\u0027"},{"line_number":28,"context_line":"        (list endpoint) in the JSON Home document at all, instead"},{"line_number":29,"context_line":"        represent only the WebSSO endpoint."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: If746c14491322d4a5f88fa0cbb31105f6d38c240"},{"line_number":32,"context_line":"Partial-Bug: #1776504"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3f79a3b5_bbbc0807","line":29,"in_reply_to":"3f79a3b5_ee7a6eb8","updated":"2018-08-28 18:29:35.000000000","message":"Makes sense - but we should include this in a release note since it could theoretically impact end users consuming our json home document.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"}],"keystone/api/os_federation.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a15d78c39fd1b28a216275db56a6947cf5dccc65","unresolved":false,"context_lines":[{"line_number":515,"context_line":"            self._construct_webob_request(), auth)"},{"line_number":516,"context_line":"        flask_resp \u003d flask.make_response("},{"line_number":517,"context_line":"            webob_resp.body, webob_resp.status_code)"},{"line_number":518,"context_line":"        flask_resp.headers.extend(webob_resp.headers)"},{"line_number":519,"context_line":"        return flask_resp"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_9ceb5e11","line":518,"updated":"2018-08-15 22:14:15.000000000","message":"Bug is here.","commit_id":"f91879a7b9a9601e41d7342c81bf1f79fa039805"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        - protocols tied to the Identity Provider"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        \"\"\""},{"line_number":90,"context_line":"        base_path \u003d ref[\u0027links\u0027][\u0027self\u0027]"},{"line_number":91,"context_line":"        if base_path is None:"},{"line_number":92,"context_line":"            base_path \u003d \u0027/\u0027.join(ks_flask.base_url(path\u003d\u0027/%s\u0027 % ref[\u0027id\u0027]))"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_0b031c44","line":90,"range":{"start_line":90,"start_character":32,"end_line":90,"end_character":40},"updated":"2018-08-21 12:06:31.000000000","message":"In the old version this is .get(\u0027self\u0027) which is why the next line compares to None","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            base_path \u003d \u0027/\u0027.join(ks_flask.base_url(path\u003d\u0027/%s\u0027 % ref[\u0027id\u0027]))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for name in [\u0027protocols\u0027]:"},{"line_number":95,"context_line":"            ref[\u0027links\u0027][\u0027name\u0027] \u003d \u0027/\u0027.join([base_path, name])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get(self, idp_id\u003dNone):"},{"line_number":98,"context_line":"        if idp_id is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_6ba17046","line":95,"range":{"start_line":95,"start_character":25,"end_line":95,"end_character":31},"updated":"2018-08-21 12:06:31.000000000","message":"In the old version this is name not \u0027name\u0027","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ccbda286e6e34bb3a06002639c6b07a232e14674","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            base_path \u003d \u0027/\u0027.join(ks_flask.base_url(path\u003d\u0027/%s\u0027 % ref[\u0027id\u0027]))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for name in [\u0027protocols\u0027]:"},{"line_number":95,"context_line":"            ref[\u0027links\u0027][\u0027name\u0027] \u003d \u0027/\u0027.join([base_path, name])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get(self, idp_id\u003dNone):"},{"line_number":98,"context_line":"        if idp_id is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_85726911","line":95,"range":{"start_line":95,"start_character":25,"end_line":95,"end_character":31},"in_reply_to":"3f79a3b5_6ba17046","updated":"2018-08-23 16:53:32.000000000","message":"I\u0027ll check on the results.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"aee4cc3f030d375eba96ce8feed66662a990de7c","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            base_path \u003d \u0027/\u0027.join(ks_flask.base_url(path\u003d\u0027/%s\u0027 % ref[\u0027id\u0027]))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for name in [\u0027protocols\u0027]:"},{"line_number":95,"context_line":"            ref[\u0027links\u0027][\u0027name\u0027] \u003d \u0027/\u0027.join([base_path, name])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get(self, idp_id\u003dNone):"},{"line_number":98,"context_line":"        if idp_id is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_86133601","line":95,"range":{"start_line":95,"start_character":25,"end_line":95,"end_character":31},"in_reply_to":"3f79a3b5_85726911","updated":"2018-09-06 13:15:41.000000000","message":"Were you able to double check this?","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"184646a666b41625974c7a805e4d6f542d1c5d96","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            base_path \u003d \u0027/\u0027.join(ks_flask.base_url(path\u003d\u0027/%s\u0027 % ref[\u0027id\u0027]))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        for name in [\u0027protocols\u0027]:"},{"line_number":95,"context_line":"            ref[\u0027links\u0027][\u0027name\u0027] \u003d \u0027/\u0027.join([base_path, name])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get(self, idp_id\u003dNone):"},{"line_number":98,"context_line":"        if idp_id is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_3ec8e6a6","line":95,"range":{"start_line":95,"start_character":25,"end_line":95,"end_character":31},"in_reply_to":"3f79a3b5_86133601","updated":"2018-09-10 15:51:07.000000000","message":"Yep, it is [name] not [\u0027name\u0027]. I\u0027ll fix in the next revision of this patchset.\n\nhttps://review.openstack.org/#/c/591082/13/keystone/federation/controllers.py@a75","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        GET/HEAD /OS-FEDERATION/projects"},{"line_number":391,"context_line":"        \"\"\""},{"line_number":392,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":393,"context_line":"        # TODO(morgan): Make this method simply call the endpoint for"},{"line_number":394,"context_line":"        # /v3/auth/projects once auth is ported to flask."},{"line_number":395,"context_line":"        auth_context \u003d flask.request.environ.get("},{"line_number":396,"context_line":"            authorization.AUTH_CONTEXT_ENV)"},{"line_number":397,"context_line":"        user_id \u003d auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_2b50585e","line":394,"range":{"start_line":393,"start_character":8,"end_line":394,"end_character":57},"updated":"2018-08-21 12:06:31.000000000","message":"Maybe it would make sense to do /v3/auth first?","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cccfa13569a8905bbc209ec5c59eec38fe8a4777","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        GET/HEAD /OS-FEDERATION/projects"},{"line_number":391,"context_line":"        \"\"\""},{"line_number":392,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":393,"context_line":"        # TODO(morgan): Make this method simply call the endpoint for"},{"line_number":394,"context_line":"        # /v3/auth/projects once auth is ported to flask."},{"line_number":395,"context_line":"        auth_context \u003d flask.request.environ.get("},{"line_number":396,"context_line":"            authorization.AUTH_CONTEXT_ENV)"},{"line_number":397,"context_line":"        user_id \u003d auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_3bda384b","line":394,"range":{"start_line":393,"start_character":8,"end_line":394,"end_character":57},"in_reply_to":"3f79a3b5_2584b5d2","updated":"2018-08-28 18:29:35.000000000","message":"Is it possible to do something like [0] and reuse as much of the existing auth controller logic as possible?\n\nJust checking to make sure we avoid https://bugs.launchpad.net/keystone/+bug/1779205 as much as possible. I suppose passing a flask request object to the auth controllers is going to be a problem?\n\n[0] https://review.openstack.org/#/c/585782/1","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ccbda286e6e34bb3a06002639c6b07a232e14674","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        GET/HEAD /OS-FEDERATION/projects"},{"line_number":391,"context_line":"        \"\"\""},{"line_number":392,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":393,"context_line":"        # TODO(morgan): Make this method simply call the endpoint for"},{"line_number":394,"context_line":"        # /v3/auth/projects once auth is ported to flask."},{"line_number":395,"context_line":"        auth_context \u003d flask.request.environ.get("},{"line_number":396,"context_line":"            authorization.AUTH_CONTEXT_ENV)"},{"line_number":397,"context_line":"        user_id \u003d auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_2584b5d2","line":394,"range":{"start_line":393,"start_character":8,"end_line":394,"end_character":57},"in_reply_to":"3f79a3b5_2b50585e","updated":"2018-08-23 16:53:32.000000000","message":"Auth is a downright nightmare. I tried to do auth first. It wound up being 1000s of lines of change and very fiddly. I am now saving it for last. If we moved auth first, you\u0027d see the inverse comment and we\u0027d need to maintain the code in the AUTH controller. Dispatching from flask-\u003eWEBOB is fairly easy [but is still pretty ugly], the inverse is not as easy due to how the contexts are pushed/built.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e83277c4512d49aa14ea83e390f032414a63b23a","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        GET/HEAD /OS-FEDERATION/projects"},{"line_number":391,"context_line":"        \"\"\""},{"line_number":392,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_auth_projects\u0027)"},{"line_number":393,"context_line":"        # TODO(morgan): Make this method simply call the endpoint for"},{"line_number":394,"context_line":"        # /v3/auth/projects once auth is ported to flask."},{"line_number":395,"context_line":"        auth_context \u003d flask.request.environ.get("},{"line_number":396,"context_line":"            authorization.AUTH_CONTEXT_ENV)"},{"line_number":397,"context_line":"        user_id \u003d auth_context.get(\u0027user_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_51ba736e","line":394,"range":{"start_line":393,"start_character":8,"end_line":394,"end_character":57},"in_reply_to":"3f79a3b5_3bda384b","updated":"2018-08-28 20:17:04.000000000","message":"You can create a webob request, but ideally we should avoid passing stuff through to the auth controllers. The exception is for actual auth in this patch. It really is not great to craft a webob request too many places.\n\nI would rather pivot to duplicated code and then work to re-consolidate the code once auth is ported.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                user_refs \u003d PROVIDERS.assignment_api.list_projects_for_user("},{"line_number":404,"context_line":"                    user_id)"},{"line_number":405,"context_line":"            except exception.UserNotFound:  # nosec"},{"line_number":406,"context_line":"                # federated users have an ide bu they don\u0027t link to anything"},{"line_number":407,"context_line":"                pass"},{"line_number":408,"context_line":"        group_refs \u003d []"},{"line_number":409,"context_line":"        if group_ids:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_aed5561d","line":406,"range":{"start_line":406,"start_character":42,"end_line":406,"end_character":45},"updated":"2018-08-21 12:06:31.000000000","message":"typo that\u0027s not in the original","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cccfa13569a8905bbc209ec5c59eec38fe8a4777","unresolved":false,"context_lines":[{"line_number":469,"context_line":""},{"line_number":470,"context_line":"class OSFederationAuthResource(flask_restful.Resource):"},{"line_number":471,"context_line":"    def _construct_webob_request(self):"},{"line_number":472,"context_line":"        # Build a fake(ish) webob request object from the flask request state"},{"line_number":473,"context_line":"        # to pass to the Auth Controller\u0027s authenticate_for_token. This is"},{"line_number":474,"context_line":"        # purely transitional code."},{"line_number":475,"context_line":"        return request.Request(flask.request.environ)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @ks_flask.unenforced_api"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_5b861416","line":474,"range":{"start_line":472,"start_character":0,"end_line":474,"end_character":35},"updated":"2018-08-28 18:29:35.000000000","message":"Oh - interesting. I guess this is what I was asking about above.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e83277c4512d49aa14ea83e390f032414a63b23a","unresolved":false,"context_lines":[{"line_number":469,"context_line":""},{"line_number":470,"context_line":"class OSFederationAuthResource(flask_restful.Resource):"},{"line_number":471,"context_line":"    def _construct_webob_request(self):"},{"line_number":472,"context_line":"        # Build a fake(ish) webob request object from the flask request state"},{"line_number":473,"context_line":"        # to pass to the Auth Controller\u0027s authenticate_for_token. This is"},{"line_number":474,"context_line":"        # purely transitional code."},{"line_number":475,"context_line":"        return request.Request(flask.request.environ)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @ks_flask.unenforced_api"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_f1737fe7","line":474,"range":{"start_line":472,"start_character":0,"end_line":474,"end_character":35},"in_reply_to":"3f79a3b5_5b861416","updated":"2018-08-28 20:17:04.000000000","message":"See my comment above. Avoiding this wherever we can. re-consolidation shouldn\u0027t be too far out.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cccfa13569a8905bbc209ec5c59eec38fe8a4777","unresolved":false,"context_lines":[{"line_number":527,"context_line":"    resource_mapping \u003d ["},{"line_number":528,"context_line":"        ks_flask.construct_resource_map("},{"line_number":529,"context_line":"            # NOTE(morgan): No resource relation here, the resource relation is"},{"line_number":530,"context_line":"            # to /v3/auth/domains and /v3/auth/domains"},{"line_number":531,"context_line":"            resource\u003dOSFederationDomainResource,"},{"line_number":532,"context_line":"            url\u003d\u0027/domains\u0027,"},{"line_number":533,"context_line":"            resource_kwargs\u003d{}),"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_5b9b7465","line":530,"range":{"start_line":530,"start_character":47,"end_line":530,"end_character":54},"updated":"2018-08-28 18:29:35.000000000","message":"projects*","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"062589bfb0087f10b1d8aed98060c1785aaba4e6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def wrap_member(cls, ref, collection_name\u003dNone, member_name\u003dNone):"},{"line_number":63,"context_line":"        cls._add_self_referential_link(ref, collection_name)"},{"line_number":64,"context_line":"        cls._add_related_links(ref)"},{"line_number":65,"context_line":"        return {member_name or cls.member_key: ref}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_7c46317e","line":64,"updated":"2018-09-12 18:17:28.000000000","message":"This is missing a call to cls.filter_params the way we had here http://git.openstack.org/cgit/openstack/keystone/tree/keystone/federation/controllers.py#n89\n\nAnd it\u0027s not done explicitly in _get_idp, so there maybe params not filtered out","commit_id":"94f8f103abc6911144423c277fbd1a71d691aa99"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b6a4cc2438cef6bf795cfdda7da38eb177e5538","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def wrap_member(cls, ref, collection_name\u003dNone, member_name\u003dNone):"},{"line_number":63,"context_line":"        cls._add_self_referential_link(ref, collection_name)"},{"line_number":64,"context_line":"        cls._add_related_links(ref)"},{"line_number":65,"context_line":"        return {member_name or cls.member_key: ref}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_f0bca007","line":64,"in_reply_to":"3f79a3b5_7c46317e","updated":"2018-09-12 20:36:27.000000000","message":"https://review.openstack.org/#/c/602137/1\n\naddressed here.","commit_id":"94f8f103abc6911144423c277fbd1a71d691aa99"}],"keystone/auth/routers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cccfa13569a8905bbc209ec5c59eec38fe8a4777","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        # NOTE(morgan): explicitly add json_home data for auth_projects and"},{"line_number":62,"context_line":"        # auth_domains for OS-FEDERATION here, as auth will always own it"},{"line_number":63,"context_line":"        # based upon how the flask scaffolding works. This bit is transitional"},{"line_number":64,"context_line":"        # for the move to flask."},{"line_number":65,"context_line":"        for element in [\u0027projects\u0027, \u0027domains\u0027]:"},{"line_number":66,"context_line":"            resource_data \u003d {\u0027href\u0027: \u0027/auth/%s\u0027 % element}"},{"line_number":67,"context_line":"            json_home.Status.update_resource_data("}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_bbf08893","line":64,"updated":"2018-08-28 18:29:35.000000000","message":"Weird...","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e83277c4512d49aa14ea83e390f032414a63b23a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        # NOTE(morgan): explicitly add json_home data for auth_projects and"},{"line_number":62,"context_line":"        # auth_domains for OS-FEDERATION here, as auth will always own it"},{"line_number":63,"context_line":"        # based upon how the flask scaffolding works. This bit is transitional"},{"line_number":64,"context_line":"        # for the move to flask."},{"line_number":65,"context_line":"        for element in [\u0027projects\u0027, \u0027domains\u0027]:"},{"line_number":66,"context_line":"            resource_data \u003d {\u0027href\u0027: \u0027/auth/%s\u0027 % element}"},{"line_number":67,"context_line":"            json_home.Status.update_resource_data("}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_b156672a","line":64,"in_reply_to":"3f79a3b5_bbf08893","updated":"2018-08-28 20:17:04.000000000","message":"Welcome to the ick that is our json-home setup :(","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"}],"keystone/server/flask/common.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            collection_path \u003d \u0027/%s\u0027 % c_key"},{"line_number":340,"context_line":"            if getattr(r, \u0027_id_path_param_name_override\u0027, None):"},{"line_number":341,"context_line":"                # The member_key doesn\u0027t match the \"id\" key in the url, make"},{"line_number":342,"context_line":"                # sure to use the correct path-key for ID."},{"line_number":343,"context_line":"                member_id_key \u003d getattr(r, \u0027_id_path_param_name_override\u0027)"},{"line_number":344,"context_line":"            else:"},{"line_number":345,"context_line":"                member_id_key \u003d \u0027%(member_key)s_id\u0027 % {\u0027member_key\u0027: m_key}"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_8e789af8","line":342,"updated":"2018-08-21 12:06:31.000000000","message":"If we\u0027re already in a hole since we have to fix the identity_providers relation, maybe we can just fix this properly too instead of adding this param override complexity?","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ccbda286e6e34bb3a06002639c6b07a232e14674","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            collection_path \u003d \u0027/%s\u0027 % c_key"},{"line_number":340,"context_line":"            if getattr(r, \u0027_id_path_param_name_override\u0027, None):"},{"line_number":341,"context_line":"                # The member_key doesn\u0027t match the \"id\" key in the url, make"},{"line_number":342,"context_line":"                # sure to use the correct path-key for ID."},{"line_number":343,"context_line":"                member_id_key \u003d getattr(r, \u0027_id_path_param_name_override\u0027)"},{"line_number":344,"context_line":"            else:"},{"line_number":345,"context_line":"                member_id_key \u003d \u0027%(member_key)s_id\u0027 % {\u0027member_key\u0027: m_key}"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_659aad14","line":342,"in_reply_to":"3f79a3b5_8e789af8","updated":"2018-08-23 16:53:32.000000000","message":"I\u0027m happy to fix this, but I really have been trying to limit the changes to tests. Would it be ok if I removed this and fixed the JSON_HOME as a followup. The case I changed before was really was an accident it worked in the first place, due to the order of loading.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"2192e93017c4e8f8671d1c9b9a003ea319c2ce5a","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                \u0027collection\u0027: c_key, \u0027member\u0027: member_id_key}"},{"line_number":349,"context_line":"            # NOTE(morgan): The json-home form of the entity path is different"},{"line_number":350,"context_line":"            # from the flask-url routing form. Must also include the prefix"},{"line_number":351,"context_line":"            jh_e_path \u003d _URL_SUBST.sub(\u0027{\\\\1}\u0027, \u0027%(pfx)s/%(e_path)s\u0027 % {"},{"line_number":352,"context_line":"                \u0027pfx\u0027: self._api_url_prefix,"},{"line_number":353,"context_line":"                \u0027e_path\u0027: entity_path.lstrip(\u0027/\u0027)})"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"            LOG.debug("},{"line_number":356,"context_line":"                \u0027Adding standard routes to API %(name)s for `%(resource)s` \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_4e5b6286","line":353,"range":{"start_line":351,"start_character":12,"end_line":353,"end_character":51},"updated":"2018-08-21 12:06:31.000000000","message":"This change is really hard to parse, and you\u0027re contradicting the note given on line 43-49","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ccbda286e6e34bb3a06002639c6b07a232e14674","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                \u0027collection\u0027: c_key, \u0027member\u0027: member_id_key}"},{"line_number":349,"context_line":"            # NOTE(morgan): The json-home form of the entity path is different"},{"line_number":350,"context_line":"            # from the flask-url routing form. Must also include the prefix"},{"line_number":351,"context_line":"            jh_e_path \u003d _URL_SUBST.sub(\u0027{\\\\1}\u0027, \u0027%(pfx)s/%(e_path)s\u0027 % {"},{"line_number":352,"context_line":"                \u0027pfx\u0027: self._api_url_prefix,"},{"line_number":353,"context_line":"                \u0027e_path\u0027: entity_path.lstrip(\u0027/\u0027)})"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"            LOG.debug("},{"line_number":356,"context_line":"                \u0027Adding standard routes to API %(name)s for `%(resource)s` \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_858ee9ce","line":353,"range":{"start_line":351,"start_character":12,"end_line":353,"end_character":51},"in_reply_to":"3f79a3b5_4e5b6286","updated":"2018-08-23 16:53:32.000000000","message":"The comment at the top is not being contradicted -- This is swapping the flask form of \u003c[type]:[VarName]\u003e to {[VarName]} (example: \u003cstring:user_id\u003e -\u003e {user_id} ). We are just handling the prefix as well in this case not just the entity path.\n\nI can fix the comment here, but tl;dr:\n\nFix the entire url including the prefix, because the prefix may include route substitutions. Otherwise, we end up with something like: /v3/thing/\u003cstring:project_id\u003e/roles/{roles}\n\ninstead of: /v3/thing/{project_id}/roles/{roles}\n\nI could split the string sub part out if it would help.","commit_id":"52e5c9d2d95a61f4159cc12d6c86d544f34f98ba"}],"keystone/tests/unit/test_versions.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"77dc30e5261eb11b372fb4c38713a0bbfba876fd","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    {"},{"line_number":392,"context_line":"        \u0027href-template\u0027: \u0027/OS-FEDERATION/identity_providers/{idp_id}\u0027,"},{"line_number":393,"context_line":"        \u0027href-vars\u0027: {\u0027idp_id\u0027: IDP_ID_PARAMETER_RELATION, }},"},{"line_number":394,"context_line":"    _build_federation_rel(resource_name\u003d\u0027identity_providers_websso\u0027): {"},{"line_number":395,"context_line":"        \u0027href-template\u0027: FEDERATED_IDP_SPECIFIC_WEBSSO,"},{"line_number":396,"context_line":"        \u0027href-vars\u0027: {"},{"line_number":397,"context_line":"            \u0027idp_id\u0027: IDP_ID_PARAMETER_RELATION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_11cf89b0","line":394,"updated":"2018-08-11 02:05:20.000000000","message":"See note in commit message about this test change.","commit_id":"b2278b20a615d029d2fbe946ff98054dbaa14b70"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"77dc30e5261eb11b372fb4c38713a0bbfba876fd","unresolved":false,"context_lines":[{"line_number":799,"context_line":"        self.assertThat(resp.status, tt_matchers.Equals(\u0027200 OK\u0027))"},{"line_number":800,"context_line":"        self.assertThat(resp.headers[\u0027Content-Type\u0027],"},{"line_number":801,"context_line":"                        tt_matchers.Equals(\u0027application/json-home\u0027))"},{"line_number":802,"context_line":"        maxDiff \u003d self.maxDiff"},{"line_number":803,"context_line":"        self.maxDiff \u003d None"},{"line_number":804,"context_line":"        # NOTE(morgan): Changed from tt_matchers.Equals to make it easier to"},{"line_number":805,"context_line":"        # determine issues. Reset maxDiff to the original value at the end"},{"line_number":806,"context_line":"        # of the assert."},{"line_number":807,"context_line":"        self.assertDictEqual(exp_json_home_data,"},{"line_number":808,"context_line":"                             jsonutils.loads(resp.body))"},{"line_number":809,"context_line":"        self.maxDiff \u003d maxDiff"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"    def test_json_home_v3(self):"},{"line_number":812,"context_line":"        # If the request is /v3 and the Accept header is application/json-home"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_b1c7b596","line":809,"range":{"start_line":802,"start_character":0,"end_line":809,"end_character":30},"updated":"2018-08-11 02:05:20.000000000","message":"See note in commit message about this change.","commit_id":"b2278b20a615d029d2fbe946ff98054dbaa14b70"}]}
