)]}'
{"keystone/assignment/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"416f9178b985f08d7e8991ac498e600d066d7bbe","unresolved":false,"context_lines":[{"line_number":667,"context_line":"        self.driver.create_grant(role_id, user_id, group_id, domain_id,"},{"line_number":668,"context_line":"                                 project_id, inherited_to_projects)"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":671,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":672,"context_line":"                           inherited_to_projects, context):"},{"line_number":673,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_ef6f125e","line":670,"updated":"2014-12-22 22:07:20.000000000","message":"So there are 2 types of notifications we use.\n\n1) For callbacks, which is what I think you want here, these are internal notifications to let other managers know whats going on.\n\n2) CADF notifications, which are meant to provide more data, and auditable data.\n\nRather than changing the CADF notification, you can create an additional notification (the simple callback type), by adding:\n\n  @notifications.created(_ROLE_ASSIGNMENT)\n\nand create a new class in notifications.py, rather than changing the existing one.","commit_id":"ff132455b94ae501407c25b83b4513ec4cd8e8b3"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"d7b6e1ada4d023574e7aff026c2bd0358205d351","unresolved":false,"context_lines":[{"line_number":667,"context_line":"        self.driver.create_grant(role_id, user_id, group_id, domain_id,"},{"line_number":668,"context_line":"                                 project_id, inherited_to_projects)"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":671,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":672,"context_line":"                           inherited_to_projects, context):"},{"line_number":673,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_c55a074f","line":670,"in_reply_to":"3a961159_ef6f125e","updated":"2014-12-24 15:59:43.000000000","message":"Done","commit_id":"ff132455b94ae501407c25b83b4513ec4cd8e8b3"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5f4f95f9a7272bd30980a2af97ae79cd850a340b","unresolved":false,"context_lines":[{"line_number":682,"context_line":"            user_id, group_id, domain_id, project_id, inherited_to_projects)"},{"line_number":683,"context_line":"        return self.role_api.list_roles_from_ids(grant_ids)"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":686,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":687,"context_line":"                           inherited_to_projects, context):"},{"line_number":688,"context_line":"        self._emit_inner_revoke_user_grant_notification(dict("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_f4d7aeeb","line":685,"updated":"2015-01-20 21:32:45.000000000","message":"Why not use this already sent notification?\nCreating another type of notification that would emit the same semantic make things inconsistent.","commit_id":"6367257c880403a9b8017f49fb827654ee8e0317"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"5633c5d5324dd2e298b190152c7700a788b05050","unresolved":false,"context_lines":[{"line_number":682,"context_line":"            user_id, group_id, domain_id, project_id, inherited_to_projects)"},{"line_number":683,"context_line":"        return self.role_api.list_roles_from_ids(grant_ids)"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":686,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":687,"context_line":"                           inherited_to_projects, context):"},{"line_number":688,"context_line":"        self._emit_inner_revoke_user_grant_notification(dict("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_84b9b830","line":685,"in_reply_to":"1a930d6b_d8d80556","updated":"2015-01-21 18:17:29.000000000","message":"Great! Please add a comment here explaining the difference between notifications. It will  be easier to people understand in the future.","commit_id":"6367257c880403a9b8017f49fb827654ee8e0317"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"2677b2d1b64049b421ce1fb5f39d1d2a104a1967","unresolved":false,"context_lines":[{"line_number":682,"context_line":"            user_id, group_id, domain_id, project_id, inherited_to_projects)"},{"line_number":683,"context_line":"        return self.role_api.list_roles_from_ids(grant_ids)"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":686,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":687,"context_line":"                           inherited_to_projects, context):"},{"line_number":688,"context_line":"        self._emit_inner_revoke_user_grant_notification(dict("}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_d8d80556","line":685,"in_reply_to":"1a930d6b_f4d7aeeb","updated":"2015-01-21 16:47:14.000000000","message":"notifications.role_assignment completely different with notifications.deleted.\n\nPlease see Steve Martinelli\u0027s comment in https://review.openstack.org/#/c/141854/3/keystone/assignment/core.py,cm","commit_id":"6367257c880403a9b8017f49fb827654ee8e0317"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ee3c505765ac2fc961c6a0d2c24fb3117753bb64","unresolved":false,"context_lines":[{"line_number":685,"context_line":"    # NOTE(amakarov): It may be confusing that different decorators are used"},{"line_number":686,"context_line":"    # for similar events but there is a difference: while notifications.deleted"},{"line_number":687,"context_line":"    # is an internal notification mechanism, notifications.role_assignment is"},{"line_number":688,"context_line":"    # a CADF notifier using RabbitMQ as a transport."},{"line_number":689,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":690,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":691,"context_line":"                           inherited_to_projects, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_dbab9a87","line":688,"updated":"2015-01-21 19:36:21.000000000","message":"would make sense to use \"as the transport layer.\"?","commit_id":"80063a07eb101724afdd5d38d90a8bef0941b51b"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"5679b8e653112b0554767c67a8ee6f8cf9b8a796","unresolved":false,"context_lines":[{"line_number":685,"context_line":"    # NOTE(amakarov): It may be confusing that different decorators are used"},{"line_number":686,"context_line":"    # for similar events but there is a difference: while notifications.deleted"},{"line_number":687,"context_line":"    # is an internal notification mechanism, notifications.role_assignment is"},{"line_number":688,"context_line":"    # a CADF notifier using RabbitMQ as a transport."},{"line_number":689,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":690,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":691,"context_line":"                           inherited_to_projects, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_6e5f460f","line":688,"in_reply_to":"1a930d6b_dbab9a87","updated":"2015-01-21 20:00:33.000000000","message":"not sure, looks like we need somebody with native English :)","commit_id":"80063a07eb101724afdd5d38d90a8bef0941b51b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"562af63b25cd8433729cdaf64be86146dfb61f81","unresolved":false,"context_lines":[{"line_number":433,"context_line":"            project_id\u003dproject_id, inherited_to_projects\u003dinherited_to_projects,"},{"line_number":434,"context_line":"            context\u003dcontext"},{"line_number":435,"context_line":"        )"},{"line_number":436,"context_line":"        notifications._send_notification(notifications.ACTIONS.deleted,"},{"line_number":437,"context_line":"                                         self._ROLE_ASSIGNMENT,"},{"line_number":438,"context_line":"                                         resource)"},{"line_number":439,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_7017cb45","line":436,"updated":"2015-03-18 20:38:27.000000000","message":"The leading underscore implies that this shouldn\u0027t be accessed outside of the notifications namespace. Should this really be public now or maybe use the internal decorator?","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"fbaa4e0db879fc49c76eb04e3105f8debd300dd6","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        )"},{"line_number":436,"context_line":"        notifications._send_notification(notifications.ACTIONS.deleted,"},{"line_number":437,"context_line":"                                         self._ROLE_ASSIGNMENT,"},{"line_number":438,"context_line":"                                         resource)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":441,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_8a074781","line":438,"updated":"2015-03-10 02:17:37.000000000","message":"One notification per user in the group is sent here, saying that a role assignment for that user has been deleted.\n\nThis is not true, since the deleted role assignment was a group one.\n\nSuppose the following scenario:\n\ni) User U in Group G, Role R and Project P;\nii) There are two assignments:\n    - U, R, P\n    - G, R, P\n\nIf you delete the second one (G, R, P), a notification telling (U, R, P) was deleted will be sent, which would tell a lie to any listener, since the role assignment (U, R, P) still exists.\n\nAnother issue here is that you send two notifications per user: one from the annotation in this method and another at this statement.","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b447e8a71c3f9c6c46f6d603d853c4d2017dea7a","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        )"},{"line_number":436,"context_line":"        notifications._send_notification(notifications.ACTIONS.deleted,"},{"line_number":437,"context_line":"                                         self._ROLE_ASSIGNMENT,"},{"line_number":438,"context_line":"                                         resource)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":441,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_02188e1c","line":438,"in_reply_to":"9a80dd14_8a074781","updated":"2015-03-16 15:19:33.000000000","message":"Isn\u0027t the _send_notification() handled here?\n\nhttps://github.com/openstack/keystone/blob/master/keystone/notifications.py#L549","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"512dc75071951a1060c9db9dc58e7c747f3fa8d7","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        )"},{"line_number":436,"context_line":"        notifications._send_notification(notifications.ACTIONS.deleted,"},{"line_number":437,"context_line":"                                         self._ROLE_ASSIGNMENT,"},{"line_number":438,"context_line":"                                         resource)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":441,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_efbb5e0c","line":438,"in_reply_to":"9a80dd14_8a074781","updated":"2015-03-18 11:03:31.000000000","message":"These notifications are different:\n_send_notification invokes internal mechanism while decorator creates a CADF notification.","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"560fc5a634e9578fa0c1dbad2afc9e58226114e6","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        self.driver.delete_grant(role_id, user_id, group_id, domain_id,"},{"line_number":466,"context_line":"                                 project_id, inherited_to_projects)"},{"line_number":467,"context_line":"        if user_id is not None:"},{"line_number":468,"context_line":"            self._emit_invalidate_user_token_persistence(user_id)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def delete_tokens_for_role_assignments(self, role_id):"},{"line_number":471,"context_line":"        assignments \u003d self.list_role_assignments_for_role(role_id\u003drole_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_57816d49","side":"PARENT","line":468,"updated":"2015-04-23 21:38:26.000000000","message":"This mechanism adds the token to the TRL. This patch is still API incompatible based on tokens not ending up in the TRL.","commit_id":"888488cc2e205971636a83ad39059ed2cf8a9c65"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"61f5a9a2c02a880d8950c7c57767a15fa7f3f827","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        self.driver.delete_grant(role_id, user_id, group_id, domain_id,"},{"line_number":466,"context_line":"                                 project_id, inherited_to_projects)"},{"line_number":467,"context_line":"        if user_id is not None:"},{"line_number":468,"context_line":"            self._emit_invalidate_user_token_persistence(user_id)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    def delete_tokens_for_role_assignments(self, role_id):"},{"line_number":471,"context_line":"        assignments \u003d self.list_role_assignments_for_role(role_id\u003drole_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_c2eea8b3","side":"PARENT","line":468,"in_reply_to":"bab921fb_57816d49","updated":"2015-04-24 16:05:33.000000000","message":"I shall take this into consideration: I\u0027ve found the code about TRL logic.","commit_id":"888488cc2e205971636a83ad39059ed2cf8a9c65"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5c907df0055199900079c85c1e9126ec8ca166f5","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":434,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":435,"context_line":"                           inherited_to_projects, context):"},{"line_number":436,"context_line":"        self.revoke_api.revoke_by_grant(role_id, user_id,"},{"line_number":437,"context_line":"                                        domain_id, project_id)"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_61871310","line":435,"updated":"2015-04-23 20:41:12.000000000","message":"why is inherited_to_projects and context part of this method signature??","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"61f5a9a2c02a880d8950c7c57767a15fa7f3f827","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    @notifications.role_assignment(\u0027deleted\u0027)"},{"line_number":434,"context_line":"    def _revoke_user_grant(self, role_id, user_id, domain_id, project_id,"},{"line_number":435,"context_line":"                           inherited_to_projects, context):"},{"line_number":436,"context_line":"        self.revoke_api.revoke_by_grant(role_id, user_id,"},{"line_number":437,"context_line":"                                        domain_id, project_id)"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_94beaed2","line":435,"in_reply_to":"bab921fb_61871310","updated":"2015-04-24 16:05:33.000000000","message":"They are needed in the signature in order to get as arguments to the otifications.role_assignment decorator","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"3d4e39a1a74688efe9193ced91393bbe541f067d","unresolved":false,"context_lines":[{"line_number":476,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"},{"line_number":477,"context_line":"                     inherited_to_projects\u003dFalse, context\u003dNone):"},{"line_number":478,"context_line":"        if group_id is None:"},{"line_number":479,"context_line":"            self.revoke_api.revoke_by_grant(role_id, user_id,"},{"line_number":480,"context_line":"                                            domain_id, project_id)"},{"line_number":481,"context_line":"            self._emit_revoke_user_grant("},{"line_number":482,"context_line":"                role_id, user_id, domain_id, project_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_e86e0aff","line":479,"updated":"2015-06-24 15:07:43.000000000","message":"Keep the signature the same, please.","commit_id":"7d02ac827f480eab42e8680b5b3f28344bab6e9a"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"680d745b96b84aa2082f36f0375cea3820f4edb3","unresolved":false,"context_lines":[{"line_number":476,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"},{"line_number":477,"context_line":"                     inherited_to_projects\u003dFalse, context\u003dNone):"},{"line_number":478,"context_line":"        if group_id is None:"},{"line_number":479,"context_line":"            self.revoke_api.revoke_by_grant(role_id, user_id,"},{"line_number":480,"context_line":"                                            domain_id, project_id)"},{"line_number":481,"context_line":"            self._emit_revoke_user_grant("},{"line_number":482,"context_line":"                role_id, user_id, domain_id, project_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_7b981c1c","line":479,"in_reply_to":"fa32b979_e86e0aff","updated":"2015-06-26 15:03:12.000000000","message":"Done","commit_id":"7d02ac827f480eab42e8680b5b3f28344bab6e9a"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"3d4e39a1a74688efe9193ced91393bbe541f067d","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                    self.revoke_api.revoke_by_domain_role_assignment("},{"line_number":494,"context_line":"                        domain_id, role_id"},{"line_number":495,"context_line":"                    )"},{"line_number":496,"context_line":"                # NOTE(morganfainberg): The user ids are the important part"},{"line_number":497,"context_line":"                # for invalidating tokens below, so extract them here."},{"line_number":498,"context_line":"                for user in self.identity_api.list_users_in_group(group_id):"},{"line_number":499,"context_line":"                    self._emit_revoke_user_grant("}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_4a55abf7","line":496,"updated":"2015-06-24 15:07:43.000000000","message":"this shhould be wrpeedby by an if block based on the conf file for revoke by id.","commit_id":"7d02ac827f480eab42e8680b5b3f28344bab6e9a"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"680d745b96b84aa2082f36f0375cea3820f4edb3","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                    self.revoke_api.revoke_by_domain_role_assignment("},{"line_number":494,"context_line":"                        domain_id, role_id"},{"line_number":495,"context_line":"                    )"},{"line_number":496,"context_line":"                # NOTE(morganfainberg): The user ids are the important part"},{"line_number":497,"context_line":"                # for invalidating tokens below, so extract them here."},{"line_number":498,"context_line":"                for user in self.identity_api.list_users_in_group(group_id):"},{"line_number":499,"context_line":"                    self._emit_revoke_user_grant("}],"source_content_type":"text/x-python","patch_set":24,"id":"fa32b979_1b9d500a","line":496,"in_reply_to":"fa32b979_4a55abf7","updated":"2015-06-26 15:03:12.000000000","message":"Done","commit_id":"7d02ac827f480eab42e8680b5b3f28344bab6e9a"}],"keystone/contrib/revoke/core.py":[{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8106e21c08ee4d194a39aca8de119cd74d47f99a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            model.RevokeEvent(access_token_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _group_callback(self, service, resource_type, operation, payload):"},{"line_number":115,"context_line":"        user_ids \u003d (u[\u0027id\u0027] for u in self.identity_api.list_users_in_group("},{"line_number":116,"context_line":"            payload[\u0027resource_info\u0027]))"},{"line_number":117,"context_line":"        for uid in user_ids:"},{"line_number":118,"context_line":"            self.revoke(model.RevokeEvent(user_id\u003duid))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_9ab90eef","side":"PARENT","line":115,"range":{"start_line":115,"start_character":42,"end_line":115,"end_character":54},"updated":"2014-12-16 17:55:57.000000000","message":"revoke_api has no identitty_api. This fails nothing because it\u0027s not used. I removed it.","commit_id":"9ee165f19d53febe27d2bbc7df21bc9f074b3535"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"92190831693105223583abb6d0866242545520fb","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def _role_assignment_callback(self, service, resource_type, operation,"},{"line_number":113,"context_line":"                                  payload):"},{"line_number":114,"context_line":"        info \u003d payload[\u0027resource_info\u0027]"},{"line_number":115,"context_line":"        self.revoke_by_grant(role_id\u003dinfo[\u0027role_id\u0027], user_id\u003dinfo[\u0027user_id\u0027],"},{"line_number":116,"context_line":"                             domain_id\u003dinfo.get(\u0027domain_id\u0027),"},{"line_number":117,"context_line":"                             project_id\u003dinfo.get(\u0027project_id\u0027))"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3ab451fb_e9c44941","line":115,"updated":"2015-04-17 15:49:58.000000000","message":"why not use .get on \u0027role_id\u0027 and \u0027user_id\u0027 like \u0027domain_id\u0027 and \u0027project_id\u0027?","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"61c6d9ce17129bd7cbf5d2cb8073dda1bbffb22e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    def _role_assignment_callback(self, service, resource_type, operation,"},{"line_number":113,"context_line":"                                  payload):"},{"line_number":114,"context_line":"        info \u003d payload[\u0027resource_info\u0027]"},{"line_number":115,"context_line":"        self.revoke_by_grant(role_id\u003dinfo[\u0027role_id\u0027], user_id\u003dinfo[\u0027user_id\u0027],"},{"line_number":116,"context_line":"                             domain_id\u003dinfo.get(\u0027domain_id\u0027),"},{"line_number":117,"context_line":"                             project_id\u003dinfo.get(\u0027project_id\u0027))"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3ab451fb_4fb57dcb","line":115,"in_reply_to":"3ab451fb_e9c44941","updated":"2015-04-17 16:23:49.000000000","message":"While domain_id and project_id are mutially exclusive, role_id will be in info as well as user_id as there is no group support in revocation engine.","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"}],"keystone/notifications.py":[{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8106e21c08ee4d194a39aca8de119cd74d47f99a","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                action, resource_type \u003d self.operation.split(\u0027.\u0027, 1)"},{"line_number":396,"context_line":"                service \u003d \u0027identity\u0027"},{"line_number":397,"context_line":"                payload \u003d {\u0027resource_info\u0027: audit_kwargs}"},{"line_number":398,"context_line":"                notify_event_callbacks(service, resource_type, action, payload)"},{"line_number":399,"context_line":"                _send_audit_notification(self.operation, initiator,"},{"line_number":400,"context_line":"                                         taxonomy.OUTCOME_SUCCESS,"},{"line_number":401,"context_line":"                                         **audit_kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_3acada6e","line":398,"updated":"2014-12-16 17:55:57.000000000","message":"For some reason role_assignment did not cause inner notifications. To be discussed, I think.","commit_id":"3f57ca3f370e1f0890cbabda74c8802f657e066e"}],"keystone/tests/test_v3_auth.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"33af76855ed4ca87e80d8d829de491f08cf2d2c1","unresolved":false,"context_lines":[{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    def test_removing_role_assignment_keeps_other_project_token_groups(self):"},{"line_number":1173,"context_line":"        \"\"\"Revoking a group role from one project should not invalidate"},{"line_number":1174,"context_line":"        all user\u0027s tokens."},{"line_number":1175,"context_line":"        \"\"\""},{"line_number":1176,"context_line":"        self.assignment_api.create_grant(self.role1[\u0027id\u0027],"},{"line_number":1177,"context_line":"                                         group_id\u003dself.group1[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_e8708542","line":1174,"updated":"2015-01-12 16:39:04.000000000","message":"We should separate this docstring according to the convention:\n\nhttps://www.python.org/dev/peps/pep-0008/#documentation-strings","commit_id":"3721645b82e6867f46e1309dd9766a494280f7c8"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"6088c36da98f3a0fa35d16f30fba0551b2822507","unresolved":false,"context_lines":[{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"    def test_removing_role_assignment_keeps_other_project_token_groups(self):"},{"line_number":1173,"context_line":"        \"\"\"Revoking a group role from one project should not invalidate"},{"line_number":1174,"context_line":"        all user\u0027s tokens."},{"line_number":1175,"context_line":"        \"\"\""},{"line_number":1176,"context_line":"        self.assignment_api.create_grant(self.role1[\u0027id\u0027],"},{"line_number":1177,"context_line":"                                         group_id\u003dself.group1[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_8b237b05","line":1174,"in_reply_to":"3a961159_e8708542","updated":"2015-01-12 16:55:15.000000000","message":"Done","commit_id":"3721645b82e6867f46e1309dd9766a494280f7c8"}],"keystone/tests/unit/common/test_notifications.py":[{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8106e21c08ee4d194a39aca8de119cd74d47f99a","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        action \u003d \"%s.%s\" % (CREATED_OPERATION, self.ROLE_ASSIGNMENT)"},{"line_number":671,"context_line":"        self._assert_last_note(action, self.user_id)"},{"line_number":672,"context_line":"        self._assert_event(role, project, domain,"},{"line_number":673,"context_line":"                           user if not group else None, group)"},{"line_number":674,"context_line":"        self.delete(url)"},{"line_number":675,"context_line":"        action \u003d \"%s.%s\" % (DELETED_OPERATION, self.ROLE_ASSIGNMENT)"},{"line_number":676,"context_line":"        self._assert_last_note(action, self.user_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_fa869212","line":673,"updated":"2014-12-16 17:55:57.000000000","message":"Deleting group role assignment causes a batch of notifications for users in the group.","commit_id":"3f57ca3f370e1f0890cbabda74c8802f657e066e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"33af76855ed4ca87e80d8d829de491f08cf2d2c1","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        action \u003d \"%s.%s\" % (CREATED_OPERATION, self.ROLE_ASSIGNMENT)"},{"line_number":671,"context_line":"        self._assert_last_note(action, self.user_id)"},{"line_number":672,"context_line":"        self._assert_event(role, project, domain,"},{"line_number":673,"context_line":"                           user if not group else None, group)"},{"line_number":674,"context_line":"        self.delete(url)"},{"line_number":675,"context_line":"        action \u003d \"%s.%s\" % (DELETED_OPERATION, self.ROLE_ASSIGNMENT)"},{"line_number":676,"context_line":"        self._assert_last_note(action, self.user_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_488199c2","line":673,"updated":"2015-01-12 16:39:04.000000000","message":"so this could potentially pass the group id as the fourth and fifth argument? Is there any reason to figure that out here versus letting the _assert_event() method handle it?","commit_id":"3721645b82e6867f46e1309dd9766a494280f7c8"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"6088c36da98f3a0fa35d16f30fba0551b2822507","unresolved":false,"context_lines":[{"line_number":670,"context_line":"        action \u003d \"%s.%s\" % (CREATED_OPERATION, self.ROLE_ASSIGNMENT)"},{"line_number":671,"context_line":"        self._assert_last_note(action, self.user_id)"},{"line_number":672,"context_line":"        self._assert_event(role, project, domain,"},{"line_number":673,"context_line":"                           user if not group else None, group)"},{"line_number":674,"context_line":"        self.delete(url)"},{"line_number":675,"context_line":"        action \u003d \"%s.%s\" % (DELETED_OPERATION, self.ROLE_ASSIGNMENT)"},{"line_number":676,"context_line":"        self._assert_last_note(action, self.user_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_2b15279b","line":673,"in_reply_to":"3a961159_488199c2","updated":"2015-01-12 16:55:15.000000000","message":"Agreed. This is internal method used in special cases - my check isn\u0027t needed.","commit_id":"3721645b82e6867f46e1309dd9766a494280f7c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c4b205573b030d6f10ad3b5a5e247c3bec9531e9","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        if group:"},{"line_number":823,"context_line":"            self.assertEqual(group, event.group)"},{"line_number":824,"context_line":"        elif user:"},{"line_number":825,"context_line":"            self.assertEqual(user, event.user)"},{"line_number":826,"context_line":"        self.assertEqual(role_id, event.role)"},{"line_number":827,"context_line":"        self.assertEqual(inherit, event.inherited_to_projects)"},{"line_number":828,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3ab451fb_6a94a436","line":825,"updated":"2015-04-17 18:02:22.000000000","message":"why this refactoring? the same is valid for project and domain","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"6c5a37b82e6a594f371866311e717b8096f941d9","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        if group:"},{"line_number":823,"context_line":"            self.assertEqual(group, event.group)"},{"line_number":824,"context_line":"        elif user:"},{"line_number":825,"context_line":"            self.assertEqual(user, event.user)"},{"line_number":826,"context_line":"        self.assertEqual(role_id, event.role)"},{"line_number":827,"context_line":"        self.assertEqual(inherit, event.inherited_to_projects)"},{"line_number":828,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3ab451fb_bd3434de","line":825,"in_reply_to":"3ab451fb_6a94a436","updated":"2015-04-17 18:12:20.000000000","message":"If group is given ignore user.","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c4b205573b030d6f10ad3b5a5e247c3bec9531e9","unresolved":false,"context_lines":[{"line_number":869,"context_line":"        event_type \u003d \u0027%s.%s.%s\u0027 % (notifications.SERVICE,"},{"line_number":870,"context_line":"                                   self.ROLE_ASSIGNMENT, DELETED_OPERATION)"},{"line_number":871,"context_line":"        self._assert_last_note(action, self.user_id, event_type)"},{"line_number":872,"context_line":"        self._assert_event(role, project, domain, user, None)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    def test_user_project_grant(self):"},{"line_number":875,"context_line":"        url \u003d (\u0027/projects/%s/users/%s/roles/%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":17,"id":"3ab451fb_4afe886c","line":872,"updated":"2015-04-17 18:02:22.000000000","message":"this change is because the elif above, right? so I guess both aren\u0027t necessary","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"6c5a37b82e6a594f371866311e717b8096f941d9","unresolved":false,"context_lines":[{"line_number":869,"context_line":"        event_type \u003d \u0027%s.%s.%s\u0027 % (notifications.SERVICE,"},{"line_number":870,"context_line":"                                   self.ROLE_ASSIGNMENT, DELETED_OPERATION)"},{"line_number":871,"context_line":"        self._assert_last_note(action, self.user_id, event_type)"},{"line_number":872,"context_line":"        self._assert_event(role, project, domain, user, None)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    def test_user_project_grant(self):"},{"line_number":875,"context_line":"        url \u003d (\u0027/projects/%s/users/%s/roles/%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":17,"id":"3ab451fb_7d26acbb","line":872,"in_reply_to":"3ab451fb_4afe886c","updated":"2015-04-17 18:12:20.000000000","message":"Actially elif above is besause of this change :)","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"}],"keystone/tests/unit/test_v3_auth.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b447e8a71c3f9c6c46f6d603d853c4d2017dea7a","unresolved":false,"context_lines":[{"line_number":1262,"context_line":"                                         group_id\u003dself.group1[\u0027id\u0027],"},{"line_number":1263,"context_line":"                                         project_id\u003dself.projectB[\u0027id\u0027])"},{"line_number":1264,"context_line":""},{"line_number":1265,"context_line":"        project_token \u003d self.get_requested_token("},{"line_number":1266,"context_line":"            self.build_authentication_request("},{"line_number":1267,"context_line":"                user_id\u003dself.user1[\u0027id\u0027],"},{"line_number":1268,"context_line":"                password\u003dself.user1[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_62306a56","line":1265,"updated":"2015-03-16 15:19:33.000000000","message":"nit: could change this to be: \n\n    projectB_token \u003d self.get_requested_token( ...","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b447e8a71c3f9c6c46f6d603d853c4d2017dea7a","unresolved":false,"context_lines":[{"line_number":1268,"context_line":"                password\u003dself.user1[\u0027password\u0027],"},{"line_number":1269,"context_line":"                project_id\u003dself.projectB[\u0027id\u0027]))"},{"line_number":1270,"context_line":""},{"line_number":1271,"context_line":"        other_project_token \u003d self.get_requested_token("},{"line_number":1272,"context_line":"            self.build_authentication_request("},{"line_number":1273,"context_line":"                user_id\u003dself.user1[\u0027id\u0027],"},{"line_number":1274,"context_line":"                password\u003dself.user1[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_a236e24e","line":1271,"updated":"2015-03-16 15:19:33.000000000","message":"Same here. I also assume the assignment from user1 to projectA already exists?","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"512dc75071951a1060c9db9dc58e7c747f3fa8d7","unresolved":false,"context_lines":[{"line_number":1268,"context_line":"                password\u003dself.user1[\u0027password\u0027],"},{"line_number":1269,"context_line":"                project_id\u003dself.projectB[\u0027id\u0027]))"},{"line_number":1270,"context_line":""},{"line_number":1271,"context_line":"        other_project_token \u003d self.get_requested_token("},{"line_number":1272,"context_line":"            self.build_authentication_request("},{"line_number":1273,"context_line":"                user_id\u003dself.user1[\u0027id\u0027],"},{"line_number":1274,"context_line":"                password\u003dself.user1[\u0027password\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_8559e3fe","line":1271,"in_reply_to":"9a80dd14_a236e24e","updated":"2015-03-18 11:03:31.000000000","message":"Correct. It is in the data common for all tests in this case.","commit_id":"0ede2babaa87c0bc0af2da44d41e154fff5b8332"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"560fc5a634e9578fa0c1dbad2afc9e58226114e6","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"        # while token for the projectB should not"},{"line_number":1281,"context_line":"        self.head(\u0027/auth/tokens\u0027,"},{"line_number":1282,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: project_token},"},{"line_number":1283,"context_line":"                  expected_status\u003d404)"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def test_deleting_project_deletes_grants(self):"},{"line_number":1286,"context_line":"        # This is to make it a little bit more pretty with PEP8"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_f7b9a12f","line":1283,"updated":"2015-04-23 21:38:26.000000000","message":"Please add a test to validate that the token is actually in the TRL [if the token provider needs persistence]. This change set still looks to not address the concern about tokens properly ending up in the TRL.","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"61f5a9a2c02a880d8950c7c57767a15fa7f3f827","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"        # while token for the projectB should not"},{"line_number":1281,"context_line":"        self.head(\u0027/auth/tokens\u0027,"},{"line_number":1282,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: project_token},"},{"line_number":1283,"context_line":"                  expected_status\u003d404)"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def test_deleting_project_deletes_grants(self):"},{"line_number":1286,"context_line":"        # This is to make it a little bit more pretty with PEP8"}],"source_content_type":"text/x-python","patch_set":17,"id":"bab921fb_023ca02d","line":1283,"in_reply_to":"bab921fb_f7b9a12f","updated":"2015-04-24 16:05:33.000000000","message":"Shall do.","commit_id":"d8a9ab545b04a941c2ac3bf027483d15f33877c9"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5a6c0315c0e115f42de257f60bf338dfbf679f3b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from keystone.tests.unit import ksfixtures"},{"line_number":34,"context_line":"from keystone.tests.unit import test_v3"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"CONF \u003d cfg.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_0b1a567d","side":"PARENT","line":36,"updated":"2015-05-20 19:25:39.000000000","message":"why remove this?","commit_id":"888488cc2e205971636a83ad39059ed2cf8a9c65"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"1cfb1415e586f183413717bc5a47b7c4b3da9db0","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from keystone.tests.unit import ksfixtures"},{"line_number":34,"context_line":"from keystone.tests.unit import test_v3"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"CONF \u003d cfg.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_86987bc1","side":"PARENT","line":36,"in_reply_to":"7a016987_0b1a567d","updated":"2015-05-20 19:31:41.000000000","message":"don\u0027t exactly remember: something like pep8 issue","commit_id":"888488cc2e205971636a83ad39059ed2cf8a9c65"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"171ec4d301e4ecdeca6b27e18bc6a3c5d79a84db","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from keystone.tests.unit import ksfixtures"},{"line_number":34,"context_line":"from keystone.tests.unit import test_v3"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"CONF \u003d cfg.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_c8c2cf84","side":"PARENT","line":36,"in_reply_to":"7a016987_86987bc1","updated":"2015-05-22 19:59:26.000000000","message":"pep8 doesn\u0027t care. Reverted","commit_id":"888488cc2e205971636a83ad39059ed2cf8a9c65"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0dba86a2b350e062eac2a448513ee629d8488f2c","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"        - Get a token for user3, scoped to ProjectA"},{"line_number":1052,"context_line":"        - Delete the grant group1 has on ProjectA"},{"line_number":1053,"context_line":"        - Check tokens for user1 \u0026 user2 are no longer valid,"},{"line_number":1054,"context_line":"          since user1 and user2 are members of group1"},{"line_number":1055,"context_line":"        - Check token for user3 is still valid"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_3e6562e0","line":1054,"updated":"2015-06-30 22:38:07.000000000","message":"See test plan here.","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"436311cbd7b3e93ea79fa7faa3975df318763a30","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"        - Get a token for user3, scoped to ProjectA"},{"line_number":1052,"context_line":"        - Delete the grant group1 has on ProjectA"},{"line_number":1053,"context_line":"        - Check tokens for user1 \u0026 user2 are no longer valid,"},{"line_number":1054,"context_line":"          since user1 and user2 are members of group1"},{"line_number":1055,"context_line":"        - Check token for user3 is still valid"},{"line_number":1056,"context_line":""},{"line_number":1057,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_8f4188ab","line":1054,"in_reply_to":"ba3cc151_3e6562e0","updated":"2015-07-02 12:14:05.000000000","message":"Done","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0dba86a2b350e062eac2a448513ee629d8488f2c","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: token2},"},{"line_number":1097,"context_line":"                  expected_status\u003d404)"},{"line_number":1098,"context_line":"        # But user3\u0027s token should be invalid too as revocation is done for"},{"line_number":1099,"context_line":"        # scope role \u0026 project"},{"line_number":1100,"context_line":"        self.head(\u0027/auth/tokens\u0027,"},{"line_number":1101,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: token3},"},{"line_number":1102,"context_line":"                  expected_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_fe5e1a11","line":1099,"updated":"2015-06-30 22:38:07.000000000","message":"This is a change in behavior. Previously you\u0027re only revoking on the users in the group, now you splash over and revoke on users who should remain valid.","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"436311cbd7b3e93ea79fa7faa3975df318763a30","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: token2},"},{"line_number":1097,"context_line":"                  expected_status\u003d404)"},{"line_number":1098,"context_line":"        # But user3\u0027s token should be invalid too as revocation is done for"},{"line_number":1099,"context_line":"        # scope role \u0026 project"},{"line_number":1100,"context_line":"        self.head(\u0027/auth/tokens\u0027,"},{"line_number":1101,"context_line":"                  headers\u003d{\u0027X-Subject-Token\u0027: token3},"},{"line_number":1102,"context_line":"                  expected_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_4f1e20bc","line":1099,"in_reply_to":"ba3cc151_fe5e1a11","updated":"2015-07-02 12:14:05.000000000","message":"It\u0027s a trade-off: we cannot identify federated users for such revocation events. So revoke by scope instead.","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bf7f9927e2cd52f408983d326574851be8fde97d","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"        super(TestTokenRevokeById, self).config_overrides()"},{"line_number":1377,"context_line":"        self.config_fixture.config("},{"line_number":1378,"context_line":"            group\u003d\u0027revoke\u0027,"},{"line_number":1379,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":1380,"context_line":"        self.config_fixture.config("},{"line_number":1381,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":1382,"context_line":"            provider\u003d\u0027keystone.token.providers.uuid.Provider\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_37547851","line":1379,"updated":"2015-07-01 17:25:48.000000000","message":"use the entrypoint -- this should be kvs","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"436311cbd7b3e93ea79fa7faa3975df318763a30","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"        super(TestTokenRevokeById, self).config_overrides()"},{"line_number":1377,"context_line":"        self.config_fixture.config("},{"line_number":1378,"context_line":"            group\u003d\u0027revoke\u0027,"},{"line_number":1379,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":1380,"context_line":"        self.config_fixture.config("},{"line_number":1381,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":1382,"context_line":"            provider\u003d\u0027keystone.token.providers.uuid.Provider\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_2f807cbf","line":1379,"in_reply_to":"ba3cc151_37547851","updated":"2015-07-02 12:14:05.000000000","message":"Done","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"bf7f9927e2cd52f408983d326574851be8fde97d","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":1380,"context_line":"        self.config_fixture.config("},{"line_number":1381,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":1382,"context_line":"            provider\u003d\u0027keystone.token.providers.uuid.Provider\u0027,"},{"line_number":1383,"context_line":"            revoke_by_id\u003dTrue)"},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"    def test_removing_role_assignment_keeps_other_project_token_groups(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_57cfbc28","line":1382,"updated":"2015-07-01 17:25:48.000000000","message":"use the entrypoint -- this should be uuid","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"436311cbd7b3e93ea79fa7faa3975df318763a30","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":1380,"context_line":"        self.config_fixture.config("},{"line_number":1381,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":1382,"context_line":"            provider\u003d\u0027keystone.token.providers.uuid.Provider\u0027,"},{"line_number":1383,"context_line":"            revoke_by_id\u003dTrue)"},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"    def test_removing_role_assignment_keeps_other_project_token_groups(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba3cc151_cf80f0c1","line":1382,"in_reply_to":"ba3cc151_57cfbc28","updated":"2015-07-02 12:14:05.000000000","message":"Done","commit_id":"33670de91ff00a83ee0814c7f48c4db58f4cc09e"}]}
