)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3bf326992f826857071066bfdf3d572f1e429b38","unresolved":false,"context_lines":[{"line_number":19,"context_line":"management of the data that will be used in"},{"line_number":20,"context_line":"Keystone middleware."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"blueprint token-verify-role-check"},{"line_number":23,"context_line":"SecurityImpact"},{"line_number":24,"context_line":"APIImpact"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a71b18c_1aa3fd9f","line":22,"range":{"start_line":22,"start_character":10,"end_line":22,"end_character":33},"updated":"2016-12-01 08:31:20.000000000","message":"this link doesn\u0027t seem to work","commit_id":"0ebadce21e9ca7f89dfc495202a4851736785b63"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9d022fbba172f2fc7fa283cd47355d14362c19f2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"management of the data that will be used in"},{"line_number":20,"context_line":"Keystone middleware."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"blueprint token-verify-role-check"},{"line_number":23,"context_line":"SecurityImpact"},{"line_number":24,"context_line":"APIImpact"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"dfeb2761_a7b4ce36","line":22,"updated":"2017-03-30 17:54:25.000000000","message":"This doesn\u0027t seem to exist. Also, if this is targeting or related to role check in middleware it needs to tie back to the spec somehow. The spec is currently still targeted to Ongoing. If we\u0027re planning on doing any work for this in Pike, we need to specify what it is we want to accomplish and target it appropriately in the specs repository. Otherwise it\u0027s way to easy for things to get lost/untracked.","commit_id":"c51f1cc90589d47511d4155f4a5b69377944160b"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b8a26bc92c6d6e025b2ba715aeb8c47a80bcc875","unresolved":false,"context_lines":[{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _delete_old_patterns_for_service(self, service_name):"},{"line_number":1005,"context_line":"        for pattern in self.role_api.list_url_patterns():"},{"line_number":1006,"context_line":"            if pattern[\u0027service\u0027] \u003d\u003d service_name:"},{"line_number":1007,"context_line":"                self.role_api.delete_url_pattern(pattern[\u0027id\u0027])"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":"    @controller.protected()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a74a57a_a2b5bc7e","line":1006,"updated":"2016-11-28 16:24:58.000000000","message":"Is there any way to do this filtering in the driver?","commit_id":"30dcd2ae6fc0b49f630f070d2042a14ac46f79cb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"27ec3beefaf14909eb44cfb404f26bc6cbcca6ba","unresolved":false,"context_lines":[{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def _delete_old_patterns_for_service(self, service_name):"},{"line_number":1005,"context_line":"        for pattern in self.role_api.list_url_patterns():"},{"line_number":1006,"context_line":"            if pattern[\u0027service\u0027] \u003d\u003d service_name:"},{"line_number":1007,"context_line":"                self.role_api.delete_url_pattern(pattern[\u0027id\u0027])"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":"    @controller.protected()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a74a57a_172f143f","line":1006,"in_reply_to":"5a74a57a_a2b5bc7e","updated":"2016-11-30 19:03:11.000000000","message":"Yep.  THis can be moved to the driver.","commit_id":"30dcd2ae6fc0b49f630f070d2042a14ac46f79cb"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b8a26bc92c6d6e025b2ba715aeb8c47a80bcc875","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"                    new_pattern[\u0027id\u0027], new_pattern)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"    @controller.protected()"},{"line_number":1028,"context_line":"    def modify_access_rules(self, request, service_name, patterns):"},{"line_number":1029,"context_line":"        ref \u003d [{\u0027url_pattern\u0027: \u0027b\u0027, \u0027roles\u0027: \u0027b\u0027,"},{"line_number":1030,"context_line":"                \u0027verbs\u0027: \u0027c\u0027, \u0027id\u0027: \u0027abcdef12\u0027}]"},{"line_number":1031,"context_line":"        return AccessV3.wrap_collection("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a74a57a_c23d58de","line":1028,"updated":"2016-11-28 16:24:58.000000000","message":"Is this complete?","commit_id":"30dcd2ae6fc0b49f630f070d2042a14ac46f79cb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"27ec3beefaf14909eb44cfb404f26bc6cbcca6ba","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"                    new_pattern[\u0027id\u0027], new_pattern)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"    @controller.protected()"},{"line_number":1028,"context_line":"    def modify_access_rules(self, request, service_name, patterns):"},{"line_number":1029,"context_line":"        ref \u003d [{\u0027url_pattern\u0027: \u0027b\u0027, \u0027roles\u0027: \u0027b\u0027,"},{"line_number":1030,"context_line":"                \u0027verbs\u0027: \u0027c\u0027, \u0027id\u0027: \u0027abcdef12\u0027}]"},{"line_number":1031,"context_line":"        return AccessV3.wrap_collection("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a74a57a_97f404d0","line":1028,"in_reply_to":"5a74a57a_c23d58de","updated":"2016-11-30 19:03:11.000000000","message":"Ah, no.  Was going to drop this.  The PUT above performs the same behavior.","commit_id":"30dcd2ae6fc0b49f630f070d2042a14ac46f79cb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"27ec3beefaf14909eb44cfb404f26bc6cbcca6ba","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"        )"},{"line_number":1035,"context_line":""},{"line_number":1036,"context_line":"    # @controller.protected()"},{"line_number":1037,"context_line":"    # TODO(ayoung) implement"},{"line_number":1038,"context_line":"    def list_all_access_rules(self, request):"},{"line_number":1039,"context_line":"        return {}"},{"line_number":1040,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a74a57a_57126c0a","line":1037,"updated":"2016-11-30 19:03:11.000000000","message":"THis one needs to be implemented as well.  It is a helper function, though, and does not need to be there to start off the middleware work","commit_id":"30dcd2ae6fc0b49f630f070d2042a14ac46f79cb"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"28e9c9e302267bcff3603617e8b3e17b8d9eab08","unresolved":false,"context_lines":[{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":1003,"context_line":"class AccessV3(controller.V3Controller):"},{"line_number":1004,"context_line":"    collection_name \u003d \u0027patterns\u0027"},{"line_number":1005,"context_line":"    member_name \u003d \u0027pattern\u0027"},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"    @controller.protected()"},{"line_number":1008,"context_line":"    def put_access_rules(self, request, service_name, patterns):"}],"source_content_type":"text/x-python","patch_set":14,"id":"dfeb2761_f43b3de8","line":1005,"range":{"start_line":1004,"start_character":0,"end_line":1005,"end_character":27},"updated":"2017-04-03 20:40:51.000000000","message":"Are these used anywhere? I looked through and I couldn\u0027t find anywhere they are currently, but I could have missed it.","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"af3d5d03159cbc5e75cdb88f80c2e6c09f5762f4","unresolved":false,"context_lines":[{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":1003,"context_line":"class AccessV3(controller.V3Controller):"},{"line_number":1004,"context_line":"    collection_name \u003d \u0027patterns\u0027"},{"line_number":1005,"context_line":"    member_name \u003d \u0027pattern\u0027"},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"    @controller.protected()"},{"line_number":1008,"context_line":"    def put_access_rules(self, request, service_name, patterns):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_3da8368b","line":1005,"range":{"start_line":1004,"start_character":0,"end_line":1005,"end_character":27},"in_reply_to":"dfeb2761_f43b3de8","updated":"2018-10-04 20:44:59.000000000","message":"Follow on commit.  This is just the Data and controllers.  Routers come next","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"}],"keystone/assignment/role_backends/sql.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"3cd42ba170c286755b079ab4ef6ded201c4df280","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        \"\"\""},{"line_number":153,"context_line":"        # TODO(ayoung): Either remove the id, or use it for the create"},{"line_number":154,"context_line":"        with sql.session_for_write() as session:"},{"line_number":155,"context_line":"            ref \u003d RouteTable.from_dict(route)"},{"line_number":156,"context_line":"            session.add(ref)"},{"line_number":157,"context_line":"            return ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff0f0b1f_2a561d08","line":154,"updated":"2017-05-26 23:18:24.000000000","message":"Validate on upload.","commit_id":"592323f85b32d02421a9107f93bda7a407d03b0b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"3cd42ba170c286755b079ab4ef6ded201c4df280","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            route exists."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        \"\"\""},{"line_number":199,"context_line":"        with sql.session_for_write() as session:"},{"line_number":200,"context_line":"            ref \u003d self._get_route(session, route_id)"},{"line_number":201,"context_line":"            old_dict \u003d ref.to_dict()"},{"line_number":202,"context_line":"            for k in route:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff0f0b1f_ea3f05b3","line":199,"updated":"2017-05-26 23:18:24.000000000","message":"validate on update.  Common code with create.","commit_id":"592323f85b32d02421a9107f93bda7a407d03b0b"}],"keystone/common/sql/contract_repo/versions/023_contract_url_patterns.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7a13bc19b6b2276cf4782b875695c079d3e9886b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# This is a placeholder for Newton backports. Do not use this number for new"},{"line_number":14,"context_line":"# Ocata work. New Ocata work starts after all the placeholders."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_8fd613c3","line":14,"updated":"2017-04-07 19:43:55.000000000","message":"^ Remove","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"ba3f5aabe2924007b306f1b2c15a0a7ee0e380fe","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# This is a placeholder for Newton backports. Do not use this number for new"},{"line_number":14,"context_line":"# Ocata work. New Ocata work starts after all the placeholders."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_4610c2a8","line":14,"in_reply_to":"bff0334d_8fd613c3","updated":"2017-04-10 20:22:26.000000000","message":"Done","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"}],"keystone/common/sql/data_migration_repo/versions/023_migrate_url_patterns.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7a13bc19b6b2276cf4782b875695c079d3e9886b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# This is a placeholder for Newton backports. Do not use this number for new"},{"line_number":14,"context_line":"# Ocata work. New Ocata work starts after all the placeholders."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_4fe00b97","line":14,"updated":"2017-04-07 19:43:55.000000000","message":"^ Remove","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"ba3f5aabe2924007b306f1b2c15a0a7ee0e380fe","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"# This is a placeholder for Newton backports. Do not use this number for new"},{"line_number":14,"context_line":"# Ocata work. New Ocata work starts after all the placeholders."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_e61eb6b9","line":14,"in_reply_to":"bff0334d_4fe00b97","updated":"2017-04-10 20:22:26.000000000","message":"Done","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"}],"keystone/tests/unit/assignment/role_backends/test_sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7a13bc19b6b2276cf4782b875695c079d3e9886b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.assertExpectedSchema(\u0027implied_role\u0027, cols)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_url_pattern_model(self):"},{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"},{"line_number":38,"context_line":"                (\u0027service\u0027, sql.String, 64),"},{"line_number":39,"context_line":"                (\u0027verb\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_0f88c36e","line":36,"updated":"2017-04-07 19:43:55.000000000","message":"^","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"ba3f5aabe2924007b306f1b2c15a0a7ee0e380fe","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.assertExpectedSchema(\u0027implied_role\u0027, cols)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def test_url_pattern_model(self):"},{"line_number":36,"context_line":"        pass"},{"line_number":37,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"},{"line_number":38,"context_line":"                (\u0027service\u0027, sql.String, 64),"},{"line_number":39,"context_line":"                (\u0027verb\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_86680a1d","line":36,"in_reply_to":"bff0334d_0f88c36e","updated":"2017-04-10 20:22:26.000000000","message":"Done","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"}],"keystone/tests/unit/assignment/test_core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7a13bc19b6b2276cf4782b875695c079d3e9886b","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.assertEqual(1, len(implied_list))"},{"line_number":172,"context_line":"        self.assertIn(implied_role1, implied_list)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    @wip(\u0027This test does not pass yet.\u0027)"},{"line_number":175,"context_line":"    def test_deleting_role_removes_inference_rule(self):"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        role1 \u003d unit.new_role_ref(name\u003duuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_2fc82720","line":174,"updated":"2017-04-07 19:43:55.000000000","message":"The comment is redundant with the @wip. Explain what\u0027s missing, and when this can be expected to be removed.\n\n  Feature X isn\u0027t implemented\n\n  API call X doesn\u0027t support parameter Y\n\netc","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"ba3f5aabe2924007b306f1b2c15a0a7ee0e380fe","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.assertEqual(1, len(implied_list))"},{"line_number":172,"context_line":"        self.assertIn(implied_role1, implied_list)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    @wip(\u0027This test does not pass yet.\u0027)"},{"line_number":175,"context_line":"    def test_deleting_role_removes_inference_rule(self):"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        role1 \u003d unit.new_role_ref(name\u003duuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_813d9490","line":174,"in_reply_to":"bff0334d_2fc82720","updated":"2017-04-10 20:22:26.000000000","message":"These 2 tests were mistakenly included here. Removed.","commit_id":"5565811c48aa8c86a71b095475ac67e5aab843e5"}]}
