)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e106194af6286ae212bdb644fa3addaec2c4dfc2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a POC to see if using sql queries will improve the performance"},{"line_number":10,"context_line":"of keystone validation when using fernet tokens which rely only on the"},{"line_number":11,"context_line":"revocation list. Currenlty all the code is done in python which causes"},{"line_number":12,"context_line":"big perfomance issues after around 1,500+ entries in the revocation"},{"line_number":13,"context_line":"list. This is still a work in progress as of now."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ac06dbe_5e5742ca","line":11,"updated":"2016-08-24 17:31:28.000000000","message":"Currently","commit_id":"93ed9651cedeee136938c5a3fa03338c96a957a5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"824770adc39158879cc0f0a082bbc4af32c9e3fd","unresolved":false,"context_lines":[{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"},{"line_number":22,"context_line":"revocation event list increases compared to the current python"},{"line_number":23,"context_line":"implementation."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I052eedcc3cc0c970046054ee8cda25ae688a38cc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7a8ec9b2_dcdf3438","line":24,"updated":"2016-09-21 15:46:11.000000000","message":"There should be a bug opened for this.","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bf88309aff4417b2eef8ecffb89ef871380a3b81","unresolved":false,"context_lines":[{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"},{"line_number":22,"context_line":"revocation event list increases compared to the current python"},{"line_number":23,"context_line":"implementation."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I052eedcc3cc0c970046054ee8cda25ae688a38cc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7a8ec9b2_180e018c","line":24,"in_reply_to":"7a8ec9b2_32a83f20","updated":"2016-09-21 17:31:44.000000000","message":"Done","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0dbb2954384bb0d6a698b59d71b811e80f3ffd86","unresolved":false,"context_lines":[{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"},{"line_number":22,"context_line":"revocation event list increases compared to the current python"},{"line_number":23,"context_line":"implementation."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I052eedcc3cc0c970046054ee8cda25ae688a38cc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7a8ec9b2_32a83f20","line":24,"in_reply_to":"7a8ec9b2_dcdf3438","updated":"2016-09-21 16:22:30.000000000","message":"++","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bf88309aff4417b2eef8ecffb89ef871380a3b81","unresolved":false,"context_lines":[{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"},{"line_number":22,"context_line":"revocation event list increases compared to the current python"},{"line_number":23,"context_line":"implementation."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Change-Id: I052eedcc3cc0c970046054ee8cda25ae688a38cc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7a8ec9b2_f8087582","line":24,"in_reply_to":"7a8ec9b2_dcdf3438","updated":"2016-09-21 17:31:44.000000000","message":"Done","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fc7a7dfd1d6f3e3e6758bd700c4baa346b1fc77a","unresolved":false,"context_lines":[{"line_number":15,"context_line":"is not revoked and it will iterate over the entire list of"},{"line_number":16,"context_line":"revocations. As the list gets longer, validation becomes slower. You"},{"line_number":17,"context_line":"start to see big performance issues around 1500+ revocation entries."},{"line_number":18,"context_line":"This change removes both python methods and replaces it with a method"},{"line_number":19,"context_line":"that uses sqlalchemy to query the database instead for the token and"},{"line_number":20,"context_line":"then returns True if found and False otherwise. Performing the query"},{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7a8ec9b2_f236c94f","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":39},"updated":"2016-09-21 20:57:54.000000000","message":"update the commit message or actually remove the python methods (probably want to do the former, and save the removal for another patch)","commit_id":"d80f29c93be45eb96585b8dddb1d56373ef82268"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"70c519cfc8c232ea0c5262d761736fecbe696b8d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"is not revoked and it will iterate over the entire list of"},{"line_number":16,"context_line":"revocations. As the list gets longer, validation becomes slower. You"},{"line_number":17,"context_line":"start to see big performance issues around 1500+ revocation entries."},{"line_number":18,"context_line":"This change removes both python methods and replaces it with a method"},{"line_number":19,"context_line":"that uses sqlalchemy to query the database instead for the token and"},{"line_number":20,"context_line":"then returns True if found and False otherwise. Performing the query"},{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7a8ec9b2_e37ef919","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":39},"in_reply_to":"7a8ec9b2_f236c94f","updated":"2016-09-21 23:29:27.000000000","message":"Done","commit_id":"d80f29c93be45eb96585b8dddb1d56373ef82268"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5b77eea746a4eac04f005838ae85fc9e8c5249e8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"is not revoked and it will iterate over the entire list of"},{"line_number":16,"context_line":"revocations. As the list gets longer, validation becomes slower. You"},{"line_number":17,"context_line":"start to see big performance issues around 1500+ revocation entries."},{"line_number":18,"context_line":"This change removes both python methods and replaces it with a method"},{"line_number":19,"context_line":"that uses sqlalchemy to query the database instead for the token and"},{"line_number":20,"context_line":"then returns True if found and False otherwise. Performing the query"},{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"7a8ec9b2_c3557a1e","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":39},"updated":"2016-09-21 23:30:18.000000000","message":"this isn\u0027t done","commit_id":"67508ba758e29b85d94c2af1a0afd2c2e289a82b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"d936bced6c7a093378740a8944c4d691860a0d3d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"is not revoked and it will iterate over the entire list of"},{"line_number":16,"context_line":"revocations. As the list gets longer, validation becomes slower. You"},{"line_number":17,"context_line":"start to see big performance issues around 1500+ revocation entries."},{"line_number":18,"context_line":"This change removes both python methods and replaces it with a method"},{"line_number":19,"context_line":"that uses sqlalchemy to query the database instead for the token and"},{"line_number":20,"context_line":"then returns True if found and False otherwise. Performing the query"},{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"7a8ec9b2_e629a49c","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":39},"in_reply_to":"7a8ec9b2_c3557a1e","updated":"2016-09-22 00:17:37.000000000","message":"Done","commit_id":"67508ba758e29b85d94c2af1a0afd2c2e289a82b"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"44cc1c91173e910f224c6e81150bd33b05d4e3b7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change python code revocation search to sql"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, there is are two methods called is_revoke and matches that"},{"line_number":10,"context_line":"iterate over all revoked events one by one and then further iterate"},{"line_number":11,"context_line":"over every field one by one until it can either short circuit by not"},{"line_number":12,"context_line":"matching one value in the event to the passed in token, or until it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"5a8bc5a2_e77d651d","line":9,"range":{"start_line":9,"start_character":17,"end_line":9,"end_character":23},"updated":"2016-09-23 19:10:47.000000000","message":"nit: are","commit_id":"d100aa4afeeab9354ffc339a66695bbfe27da442"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a13405545d05e86d534991ae3537718f7a0b6d3f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change python code revocation search to sql"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, there is are two methods called is_revoke and matches that"},{"line_number":10,"context_line":"iterate over all revoked events one by one and then further iterate"},{"line_number":11,"context_line":"over every field one by one until it can either short circuit by not"},{"line_number":12,"context_line":"matching one value in the event to the passed in token, or until it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"5a8bc5a2_275aed4f","line":9,"range":{"start_line":9,"start_character":17,"end_line":9,"end_character":23},"in_reply_to":"5a8bc5a2_e77d651d","updated":"2016-09-23 19:22:58.000000000","message":"Done","commit_id":"d100aa4afeeab9354ffc339a66695bbfe27da442"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"df82904c49d835e3ecf2d38b38d7bbe7028f0a85","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Move revocation logic to SQL"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, there are two methods called is_revoke and matches that"},{"line_number":10,"context_line":"iterate over all revoked events one by one and then further iterate"},{"line_number":11,"context_line":"over every field one by one until it can either short circuit by not"},{"line_number":12,"context_line":"matching one value in the event to the passed in token, or until it"},{"line_number":13,"context_line":"has matched all fields of non-empty values in the revocation event to"},{"line_number":14,"context_line":"the corresponding fields in the given token. In most cases, the token"},{"line_number":15,"context_line":"is not revoked and it will iterate over the entire list of"},{"line_number":16,"context_line":"revocations. As the list gets longer, validation becomes slower. You"},{"line_number":17,"context_line":"start to see big performance issues around 1500+ revocation entries."},{"line_number":18,"context_line":"This change removes both python methods and replaces it with a method"},{"line_number":19,"context_line":"that uses sqlalchemy to query the database instead for the token and"},{"line_number":20,"context_line":"then returns True if found and False otherwise. Performing the query"},{"line_number":21,"context_line":"in sql rather than python will improve the overall performance as the"},{"line_number":22,"context_line":"revocation event list increases compared to the current python"},{"line_number":23,"context_line":"implementation."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Closes-Bug: #1609566"},{"line_number":26,"context_line":"Closes-Bug: #1626205"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"3a98d1f4_916f11fb","line":23,"range":{"start_line":9,"start_character":0,"end_line":23,"end_character":15},"updated":"2016-10-03 16:26:34.000000000","message":"This seems wordy to me. Perhaps, put the performance issues in the bug description itself. I\u0027d suggest something like the following: \"This patch moves the revocation validation logic (is_revoked) to SQL. The previous logic matched all column combinations, however the SQL logic only matches the possible column combinations based on the table writes.\"","commit_id":"c2436a51f46a8fc7a4852e995e9395c37be316c2"}],"keystone/models/revoke_model.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2e2b0b9bb110ca1316a03bac8286b216e10236e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    event in the `events` list, the token is revoked. If the token is compared"},{"line_number":134,"context_line":"    against every item in the list without a match, it is not considered"},{"line_number":135,"context_line":"    revoked from the `revoke_api`."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    :param events: a list of RevokeEvent instances"},{"line_number":138,"context_line":"    :param token_data: map based on a flattened view of the token. The required"},{"line_number":139,"context_line":"                       fields are `expires_at`,`user_id`, `project_id`,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_c8d62327","side":"PARENT","line":136,"updated":"2016-09-08 21:32:40.000000000","message":"undo unrelated changes, obviously. i recommend using `git add -p` to interactively stage changes, so you know what you\u0027re committing :)","commit_id":"b47f10290ed83415149f3d2ab6b0dc64646e578a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"44cc1c91173e910f224c6e81150bd33b05d4e3b7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        return event"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"def is_revoked(events, token_data):"},{"line_number":130,"context_line":"    \"\"\"Check if a token matches a revocation event."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    Compare a token against every revocation event. If the token matches an"}],"source_content_type":"text/x-python","patch_set":24,"id":"5a8bc5a2_a7b51def","side":"PARENT","line":129,"range":{"start_line":129,"start_character":4,"end_line":129,"end_character":14},"updated":"2016-09-23 19:10:47.000000000","message":"++","commit_id":"dc9a1d5f7061f2de6b75a79ad3133d9e3c14046a"}],"keystone/revoke/backends/sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e106194af6286ae212bdb644fa3addaec2c4dfc2","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"            session.flush()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    # Essentially replaces the is_revokd and matches inside"},{"line_number":84,"context_line":"    # the models/revoked_models.py file but is by no means"},{"line_number":85,"context_line":"    # finished or fully working. Just a preliminary method"},{"line_number":86,"context_line":"    # to get the ball rolling"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_3e5c06ed","line":83,"updated":"2016-08-24 17:31:28.000000000","message":"is_revoked","commit_id":"93ed9651cedeee136938c5a3fa03338c96a957a5"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"371d91bc33c775cd5262afa5fec8a431a8fcd3c0","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        R \u003d RevocationEvent"},{"line_number":86,"context_line":"        with sql.session_for_read() as session:"},{"line_number":87,"context_line":"            q \u003d session.query(R).filter(R.user_id.in_([token_data[\u0027user_id\u0027],"},{"line_number":88,"context_line":"                                        token_data[\u0027trustor_id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_d5262867","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":27},"updated":"2016-08-25 15:40:47.000000000","message":"Only here for redundant shorthand of code","commit_id":"0d8de7ed9d9c6a6745725df840ea1811642f6b96"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"371d91bc33c775cd5262afa5fec8a431a8fcd3c0","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        R \u003d RevocationEvent"},{"line_number":86,"context_line":"        with sql.session_for_read() as session:"},{"line_number":87,"context_line":"            q \u003d session.query(R).filter(R.user_id.in_([token_data[\u0027user_id\u0027],"},{"line_number":88,"context_line":"                                        token_data[\u0027trustor_id\u0027],"},{"line_number":89,"context_line":"                                        token_data[\u0027trustee_id\u0027]]))"},{"line_number":90,"context_line":"            if not (session.query(q.exists()).scalar()):"},{"line_number":91,"context_line":"                return False"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_35c05c2a","line":89,"range":{"start_line":87,"start_character":12,"end_line":89,"end_character":67},"updated":"2016-08-25 15:40:47.000000000","message":"Since we know that either the user_id, trustor_id, or trustee_id fields inside token_data could match the revocation_event user_id column, we leverage the filter and in_ methods in sqlalchemy to see if it can find any of the three and match it to any of the revocation_event columns for user_id. Then throw the result in q for later use.\n\nWe will do the same for identity_domain_id and assignment_domain_id since it is essentially the same scenario","commit_id":"0d8de7ed9d9c6a6745725df840ea1811642f6b96"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"371d91bc33c775cd5262afa5fec8a431a8fcd3c0","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            q \u003d session.query(R).filter(R.user_id.in_([token_data[\u0027user_id\u0027],"},{"line_number":88,"context_line":"                                        token_data[\u0027trustor_id\u0027],"},{"line_number":89,"context_line":"                                        token_data[\u0027trustee_id\u0027]]))"},{"line_number":90,"context_line":"            if not (session.query(q.exists()).scalar()):"},{"line_number":91,"context_line":"                return False"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            q \u003d session.query(R).filter(R.domain_id.in_(["},{"line_number":94,"context_line":"                                        token_data[\u0027identity_domain_id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_d87c9d74","line":91,"range":{"start_line":90,"start_character":12,"end_line":91,"end_character":28},"updated":"2016-08-25 15:40:47.000000000","message":"now that we have the result stored in q we can use exists() function to check if any of the fields in the resulting query q \"existed\" as a value inside R(i.e. revocation_event).user_id and use the scalar() to return a simple true or false from this statement. If it does exist and returns True we don\u0027t want any of the if statements to run till we get a False so we can then return False that the token_data passed is not revoked so just set \"if not\" so it only executes if the if statement finds \"False, does not exist\"","commit_id":"0d8de7ed9d9c6a6745725df840ea1811642f6b96"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"371d91bc33c775cd5262afa5fec8a431a8fcd3c0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                                        token_data[\u0027assignment_domain_id\u0027]]))"},{"line_number":96,"context_line":"            if not (session.query(q.exists()).scalar()):"},{"line_number":97,"context_line":"                return False"},{"line_number":98,"context_line":"            # if not (session.query(exists().where(R.domain_scope_id \u003d\u003d"},{"line_number":99,"context_line":"            #         token_data[\u0027assignment_domain_id\u0027])).scalar()):"},{"line_number":100,"context_line":"            #     return False"},{"line_number":101,"context_line":"            if not (session.query(exists().where(R.project_id \u003d\u003d"},{"line_number":102,"context_line":"                    token_data[\u0027project_id\u0027])).scalar()):"},{"line_number":103,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_381691f1","line":100,"range":{"start_line":98,"start_character":12,"end_line":100,"end_character":30},"updated":"2016-08-25 15:40:47.000000000","message":"Still looking into what to do with this. An error will be given when trying to execute this line because there is no such thing as domain_scope_id column in the revocation_event table or in the RevokeTable class. That being said, it was still used as a column in the old/current method which was to take the revocation_events in the table and then pull them through a query, turn them into dictionaries, and add the domain_scope_id field. Since we are no longer using dictionaries to represent events I will need to look into how to remedy this.","commit_id":"0d8de7ed9d9c6a6745725df840ea1811642f6b96"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"371d91bc33c775cd5262afa5fec8a431a8fcd3c0","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            # if not (session.query(exists().where(R.domain_scope_id \u003d\u003d"},{"line_number":99,"context_line":"            #         token_data[\u0027assignment_domain_id\u0027])).scalar()):"},{"line_number":100,"context_line":"            #     return False"},{"line_number":101,"context_line":"            if not (session.query(exists().where(R.project_id \u003d\u003d"},{"line_number":102,"context_line":"                    token_data[\u0027project_id\u0027])).scalar()):"},{"line_number":103,"context_line":"                return False"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"            if not (session.query(exists().where(R.expires_at \u003d\u003d"},{"line_number":106,"context_line":"                    token_data[\u0027expires_at\u0027])).scalar()):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_18cbd554","line":103,"range":{"start_line":101,"start_character":12,"end_line":103,"end_character":28},"updated":"2016-08-25 15:40:47.000000000","message":"The rest of the if statements are essentially the same as this one. Basically the checks if token_data[field] exists as R.field and then returns True or False based on that. If statement, again, only runs if it doesn\u0027t find a match so it may return False","commit_id":"0d8de7ed9d9c6a6745725df840ea1811642f6b96"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"8565f6964fea12beb87f1cef510e7ecb1855333d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                            R.audit_chain_id \u003d\u003d"},{"line_number":129,"context_line":"                                                tk[\u0027audit_chain_id\u0027],"},{"line_number":130,"context_line":"                                            R.role_id \u003d\u003d tk[\u0027roles\u0027],"},{"line_number":131,"context_line":"                                            R.issued_before \u003e tk[\u0027issued_at\u0027]"},{"line_number":132,"context_line":"                                                                    )))"},{"line_number":133,"context_line":"            # now we test that query to make sure that it passes the"},{"line_number":134,"context_line":"            # exists test and return True with scalar() if such a token"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_e5f7de56","line":131,"updated":"2016-08-29 23:58:16.000000000","message":"This is a lot of filter fields. I\u0027d like to see actual EXPLAIN output from MySQL that shows the query plan for this. We want the highest cardinality index possible in use, so that we read the fewest rows. If we only have medium/low cardinality indexes to work with, it will just end up pushing filtering CPU usage from the app servers (which are easy to scale) to the database server (which is definitely _not_ easy to scale).","commit_id":"be901258819d61b8b2d8063cc5f6a2eec08a9d7f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc7f947c2cd6bb74448b3f1fb937d4d8639f06a0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.revoke.backends import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_db import api as oslo_db_api"},{"line_number":18,"context_line":"from sqlalchemy import and_, or_"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class RevocationEvent(sql.ModelBase, sql.ModelDictMixin):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_08100ba8","line":18,"updated":"2016-09-08 21:44:19.000000000","message":"We typically reference functions from the package namespace, meaning we could just do something like: \n\n  import sqlalchemy\n  ...\n  or1.append(sqlalchemy.or_(...))","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2e2b0b9bb110ca1316a03bac8286b216e10236e","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        R \u003d RevocationEvent"},{"line_number":86,"context_line":"        token \u003d {key: val for (key, val) in token_data.iteritems() if val}"},{"line_number":87,"context_line":"        or1 \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_6880b78c","line":84,"updated":"2016-09-08 21:32:40.000000000","message":"I think the API for this method is making it more difficult (this pattern is a problem elsewhere in keystone as well). You don\u0027t know what\u0027s being passed in exactly, so you have to figure out the possibilities, which makes this method way more complicated. It\u0027d be a bit simpler if you had well defined keyword arguments that you could expect, so you wouldn\u0027t have to iterate through token_data. Just think, there won\u0027t be a crazy for-loop on L90!","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2e2b0b9bb110ca1316a03bac8286b216e10236e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        R \u003d RevocationEvent"},{"line_number":86,"context_line":"        token \u003d {key: val for (key, val) in token_data.iteritems() if val}"},{"line_number":87,"context_line":"        or1 \u003d []"},{"line_number":88,"context_line":"        or2 \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_e83927f4","line":85,"updated":"2016-09-08 21:32:40.000000000","message":"Cheater! This sort of indirection makes the code more difficult to read, because now this class has two variable names. Instead, work on reducing cyclomatic complexity or simply line breaking and indenting more frequently.","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc7f947c2cd6bb74448b3f1fb937d4d8639f06a0","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        R \u003d RevocationEvent"},{"line_number":86,"context_line":"        token \u003d {key: val for (key, val) in token_data.iteritems() if val}"},{"line_number":87,"context_line":"        or1 \u003d []"},{"line_number":88,"context_line":"        or2 \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_a85e3f77","line":85,"updated":"2016-09-08 21:44:19.000000000","message":"s/R/event/ only for the sake of a more descriptive name","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2e2b0b9bb110ca1316a03bac8286b216e10236e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        R \u003d RevocationEvent"},{"line_number":86,"context_line":"        token \u003d {key: val for (key, val) in token_data.iteritems() if val}"},{"line_number":87,"context_line":"        or1 \u003d []"},{"line_number":88,"context_line":"        or2 \u003d []"},{"line_number":89,"context_line":"        and1 \u003d []"},{"line_number":90,"context_line":"        for key in token:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_2824efc4","line":87,"updated":"2016-09-08 21:32:40.000000000","message":"Vague variable names like these will need inline comments - but don\u0027t bother yet, because I\u0027m not sure you\u0027ll need this.","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc7f947c2cd6bb74448b3f1fb937d4d8639f06a0","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        token \u003d {key: val for (key, val) in token_data.iteritems() if val}"},{"line_number":87,"context_line":"        or1 \u003d []"},{"line_number":88,"context_line":"        or2 \u003d []"},{"line_number":89,"context_line":"        and1 \u003d []"},{"line_number":90,"context_line":"        for key in token:"},{"line_number":91,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":92,"context_line":"                or1.append(or_(R.user_id.is_(None), R.user_id \u003d\u003d token[key]))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_68e437ac","line":89,"updated":"2016-09-08 21:44:19.000000000","message":"I love their basketball shorts! ;)","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc7f947c2cd6bb74448b3f1fb937d4d8639f06a0","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        or1 \u003d []"},{"line_number":88,"context_line":"        or2 \u003d []"},{"line_number":89,"context_line":"        and1 \u003d []"},{"line_number":90,"context_line":"        for key in token:"},{"line_number":91,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":92,"context_line":"                or1.append(or_(R.user_id.is_(None), R.user_id \u003d\u003d token[key]))"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_13af5c95","line":90,"updated":"2016-09-08 21:44:19.000000000","message":"We could automatically pull out the token value here, too; \n\n  for key, token_value in token.iteritems():\n\nfor some reason I thought we used six for iterating over dictionaries but I can\u0027t seem to find the example.","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"44d3e4430f7e98c9ffbacdef99aa346771abadca","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        or1 \u003d []"},{"line_number":88,"context_line":"        or2 \u003d []"},{"line_number":89,"context_line":"        and1 \u003d []"},{"line_number":90,"context_line":"        for key in token:"},{"line_number":91,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":92,"context_line":"                or1.append(or_(R.user_id.is_(None), R.user_id \u003d\u003d token[key]))"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_0d954f3f","line":90,"in_reply_to":"9a89bdaa_13af5c95","updated":"2016-09-09 14:43:53.000000000","message":"Done","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc7f947c2cd6bb74448b3f1fb937d4d8639f06a0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        and1 \u003d []"},{"line_number":90,"context_line":"        for key in token:"},{"line_number":91,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":92,"context_line":"                or1.append(or_(R.user_id.is_(None), R.user_id \u003d\u003d token[key]))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            elif key in [\u0027identity_domain_id\u0027, \u0027assignment_domain_id\u0027]:"},{"line_number":95,"context_line":"                or2.append(or_(R.domain_id.is_(None),"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_13a91ce0","line":92,"updated":"2016-09-08 21:44:19.000000000","message":"Do we have an is_() method somewhere?","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"44d3e4430f7e98c9ffbacdef99aa346771abadca","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        and1 \u003d []"},{"line_number":90,"context_line":"        for key in token:"},{"line_number":91,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":92,"context_line":"                or1.append(or_(R.user_id.is_(None), R.user_id \u003d\u003d token[key]))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"            elif key in [\u0027identity_domain_id\u0027, \u0027assignment_domain_id\u0027]:"},{"line_number":95,"context_line":"                or2.append(or_(R.domain_id.is_(None),"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_0dce2f83","line":92,"in_reply_to":"9a89bdaa_13a91ce0","updated":"2016-09-09 14:43:53.000000000","message":"like exists() the method is part of SQL alchemy that checks if a row column has data in it or not.","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c2e2b0b9bb110ca1316a03bac8286b216e10236e","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        with sql.session_for_read() as session:"},{"line_number":109,"context_line":"            if or1 and or2:"},{"line_number":110,"context_line":"                q \u003d (session.query(R).filter(or_(*or1))"},{"line_number":111,"context_line":"                                     .filter(or_(*or2)).filter(and_(*and1)))"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            elif or1:"},{"line_number":114,"context_line":"                q \u003d session.query(R).filter(or_(*or1)).filter(and_(*and1))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_88733b15","line":111,"updated":"2016-09-08 21:32:40.000000000","message":"the query is only evaluated in L122 when you call .exists(), so you can build the query dynamically, you don\u0027t have to build it all at once. So, this could be simplified to:\n\n  q \u003d session.query(RevocationEvent)                                 \n\n  if or1:\n      q \u003d q.filter(or_(*or1))\n\n  if or2:\n      ...","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"44d3e4430f7e98c9ffbacdef99aa346771abadca","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        with sql.session_for_read() as session:"},{"line_number":109,"context_line":"            if or1 and or2:"},{"line_number":110,"context_line":"                q \u003d (session.query(R).filter(or_(*or1))"},{"line_number":111,"context_line":"                                     .filter(or_(*or2)).filter(and_(*and1)))"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"            elif or1:"},{"line_number":114,"context_line":"                q \u003d session.query(R).filter(or_(*or1)).filter(and_(*and1))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_4dc83775","line":111,"in_reply_to":"9a89bdaa_88733b15","updated":"2016-09-09 14:43:53.000000000","message":"Done","commit_id":"df3807a9d3cfdfa226e896c169a68b13197f99d6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"86282a2d71b14b2d039c832aa98f072ed43156d2","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        with sql.session_for_read() as session:"},{"line_number":117,"context_line":"            # Make sure there is at least one revocation_event row in the table"},{"line_number":118,"context_line":"            # otherwise this yields a DBError. So return False if is the case."},{"line_number":119,"context_line":"            rows \u003d session.query(R).all()"},{"line_number":120,"context_line":"            if len(rows) \u003d\u003d 0:"},{"line_number":121,"context_line":"                return False"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_803bd99b","line":119,"updated":"2016-09-09 18:59:55.000000000","message":"You definitely shouldn\u0027t have to do this .all(), because when you take the length of the result, it actually has to fetch ALL the revocation events from the database, just to see if there are any there. I can\u0027t quite figure out how you might have ended up with a DBError, other than maybe it\u0027s related to using an EXISTS subquery in L130? You could probably get away with first() instead, although I honestly don\u0027t know if that would be more or less performant.\n\n  http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.first\n\nLastly, if you can\u0027t write a test to illustrate how this DBError would be hit, then this code should definitely be removed.","commit_id":"6744aedc59ccb5e261153a4dac7771cda4aa7c2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"d795dabab86ac6f87f100cefa59084d96873bc22","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        with sql.session_for_read() as session:"},{"line_number":117,"context_line":"            # Make sure there is at least one revocation_event row in the table"},{"line_number":118,"context_line":"            # otherwise this yields a DBError. So return False if is the case."},{"line_number":119,"context_line":"            rows \u003d session.query(R).all()"},{"line_number":120,"context_line":"            if len(rows) \u003d\u003d 0:"},{"line_number":121,"context_line":"                return False"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_8b63f5dc","line":119,"in_reply_to":"9a89bdaa_803bd99b","updated":"2016-09-09 21:44:07.000000000","message":"Oops, I meant to remove these lines, which were only used to check the effect of some of the tests. The line that actually took care of the majority of the tox tests was L107 with roles. Will remove this section","commit_id":"6744aedc59ccb5e261153a4dac7771cda4aa7c2d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"23fcc82e22ddfb023c899d047aa28c02d0073abe","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        # or1 is for the OR query statment to map token fields to user_ids,"},{"line_number":86,"context_line":"        # or2 is for the OR query statment to map token fields to domain_ids,"},{"line_number":87,"context_line":"        # and1 is for the AND query statment for all other one to one matching"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a8ec9b2_a5749dfd","line":84,"updated":"2016-09-13 20:23:27.000000000","message":"Based on the bits of token_data you\u0027re using so far, this could become http://cdn.pasteraw.com/3nzs1bp55x0wx7incihd5pvz0gu2v5w\n\nAnd then you wouldn\u0027t have a for-loop later on, which would be faster, easier to read, and easier to debug.","commit_id":"5df7c2798bd5445db0719e3a6c32d4d45ac41244"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"4900d2590d43715ece34bf4d733b6481cc4a2fd9","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        # or1 is for the OR query statment to map token fields to user_ids,"},{"line_number":86,"context_line":"        # or2 is for the OR query statment to map token fields to domain_ids,"},{"line_number":87,"context_line":"        # and1 is for the AND query statment for all other one to one matching"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a8ec9b2_2dbf64fc","line":84,"in_reply_to":"7a8ec9b2_a5749dfd","updated":"2016-09-14 14:48:54.000000000","message":"On L108 and L109 I am still using the rest of the token_data key, values. The ones explicitly mentioned in the if statements are just there because these are values that either can have multiple token_data values matched to one revocation_event column, or if key names are different for example revocation_id has role_id and token_data has its key name as roles. Currently, as of now, all token_data key,value pairs have a possibility of being passed through. Some less likely as others but still likely.","commit_id":"5df7c2798bd5445db0719e3a6c32d4d45ac41244"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0dbb2954384bb0d6a698b59d71b811e80f3ffd86","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.revoke.backends import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_db import api as oslo_db_api"},{"line_number":18,"context_line":"from sqlalchemy import and_, or_"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class RevocationEvent(sql.ModelBase, sql.ModelDictMixin):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_2d49c060","line":18,"updated":"2016-09-21 16:22:30.000000000","message":"i\u0027m not sure now this passes pep8 since we should only be importing modules.","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bf88309aff4417b2eef8ecffb89ef871380a3b81","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.revoke.backends import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from oslo_db import api as oslo_db_api"},{"line_number":18,"context_line":"from sqlalchemy import and_, or_"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class RevocationEvent(sql.ModelBase, sql.ModelDictMixin):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_f87f95dc","line":18,"in_reply_to":"7a8ec9b2_2d49c060","updated":"2016-09-21 17:31:44.000000000","message":"Done","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"da003cf9bbb89cc66002c96527db8503dbe94d48","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        # or1 is for the OR query statment to map token fields to user_ids,"},{"line_number":86,"context_line":"        # or2 is for the OR query statment to map token fields to domain_ids,"},{"line_number":87,"context_line":"        # and1 is for the AND query statment for all other one to one matching"},{"line_number":88,"context_line":"        or1 \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_7c89c025","line":85,"range":{"start_line":85,"start_character":34,"end_line":85,"end_character":42},"updated":"2016-09-21 16:00:35.000000000","message":"statement\n\nHow about change the name to user_id_filters then no comment would be needed.","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bf88309aff4417b2eef8ecffb89ef871380a3b81","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            session.flush()"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def is_revoked(self, token_data):"},{"line_number":85,"context_line":"        # or1 is for the OR query statment to map token fields to user_ids,"},{"line_number":86,"context_line":"        # or2 is for the OR query statment to map token fields to domain_ids,"},{"line_number":87,"context_line":"        # and1 is for the AND query statment for all other one to one matching"},{"line_number":88,"context_line":"        or1 \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_586b291e","line":85,"range":{"start_line":85,"start_character":34,"end_line":85,"end_character":42},"in_reply_to":"7a8ec9b2_7c89c025","updated":"2016-09-21 17:31:44.000000000","message":"Done","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ba13a8b1fd5e5233756aee1ad466151c6c41f01","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        or1 \u003d []"},{"line_number":89,"context_line":"        or2 \u003d []"},{"line_number":90,"context_line":"        and1 \u003d []"},{"line_number":91,"context_line":"        for key, value in token_data.items():"},{"line_number":92,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":93,"context_line":"                or1.append(or_(RevocationEvent.user_id.is_(None),"},{"line_number":94,"context_line":"                               RevocationEvent.user_id \u003d\u003d value))"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_7b4b7fb1","line":91,"updated":"2016-09-21 17:54:32.000000000","message":"This code should be clarified to make it obvious that all the keys (such as user_id, trustor_id, trustee_id) are always present, not optional.\n\nSo for example:\n\n or1 \u003d [\n   or_(RevocationEvent.user_id.is_(None),\n       RevocationEvent.user_id \u003d\u003d token_data[\u0027user_id\u0027]),\n   or_(RevocationEvent.user_id.is_(None),\n       RevocationEvent.user_id \u003d\u003d token_data[\u0027trustor_id\u0027]),\n   ...\n ]\n\nand so forth.","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"76d320c674121b8e4422c38fdc9ddbc189e80ab2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        user_id_filters \u003d []"},{"line_number":87,"context_line":"        domain_id_filters \u003d []"},{"line_number":88,"context_line":"        ands \u003d []"},{"line_number":89,"context_line":"        for key, value in token_data.items():"},{"line_number":90,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":91,"context_line":"                user_id_filters.append(sqlalchemy.or_("},{"line_number":92,"context_line":"                    RevocationEvent.user_id.is_(None),"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_7bf9bf4d","line":89,"updated":"2016-09-21 17:56:02.000000000","message":"This code should be clarified to make it obvious that all the keys (such as user_id, trustor_id, trustee_id) are always present, not optional.\nSo for example:\n\n or1 \u003d [\n   or_(RevocationEvent.user_id.is_(None),\n       RevocationEvent.user_id \u003d\u003d token_data[\u0027user_id\u0027]),\n   or_(RevocationEvent.user_id.is_(None),\n       RevocationEvent.user_id \u003d\u003d token_data[\u0027trustor_id\u0027]),\n   or_(RevocationEvent.user_id.is_(None),\n       RevocationEvent.user_id \u003d\u003d token_data[\u0027trustee_id\u0027]),\n ]\n\nand so forth.","commit_id":"72a89e45cc9ba8e7c9cafaa20aedef96ee3ff4d3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"d7bdb6434126c3b7a596be430a5b61cfbc9b101b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        user_id_filters \u003d []"},{"line_number":87,"context_line":"        domain_id_filters \u003d []"},{"line_number":88,"context_line":"        ands \u003d []"},{"line_number":89,"context_line":"        for key, value in token_data.items():"},{"line_number":90,"context_line":"            if key in [\u0027user_id\u0027, \u0027trustor_id\u0027, \u0027trustee_id\u0027]:"},{"line_number":91,"context_line":"                user_id_filters.append(sqlalchemy.or_("},{"line_number":92,"context_line":"                    RevocationEvent.user_id.is_(None),"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a8ec9b2_1c0d0e3e","line":89,"in_reply_to":"7a8ec9b2_7bf9bf4d","updated":"2016-09-21 23:29:43.000000000","message":"Done","commit_id":"72a89e45cc9ba8e7c9cafaa20aedef96ee3ff4d3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fc7a7dfd1d6f3e3e6758bd700c4baa346b1fc77a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                           RevocationEvent.domain_id \u003d\u003d"},{"line_number":100,"context_line":"                           token[\u0027assignment_domain_id\u0027])"},{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":"        ands \u003d [RevocationEvent.issued_before \u003e\u003d token[\u0027issued_at\u0027]]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a8ec9b2_f25b2984","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":12},"updated":"2016-09-21 20:57:54.000000000","message":"call this issued_before_filter? or token_filters?","commit_id":"d80f29c93be45eb96585b8dddb1d56373ef82268"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"70c519cfc8c232ea0c5262d761736fecbe696b8d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                           RevocationEvent.domain_id \u003d\u003d"},{"line_number":100,"context_line":"                           token[\u0027assignment_domain_id\u0027])"},{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":"        ands \u003d [RevocationEvent.issued_before \u003e\u003d token[\u0027issued_at\u0027]]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a8ec9b2_0d2236a3","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":12},"in_reply_to":"7a8ec9b2_f25b2984","updated":"2016-09-21 23:29:27.000000000","message":"Done","commit_id":"d80f29c93be45eb96585b8dddb1d56373ef82268"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bbdd269177781aa4e41c386b2aa4559e65ab48f1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                  .filter(sqlalchemy.or_(*domain_id_filters))"},{"line_number":122,"context_line":"                  .filter(sqlalchemy.and_(*token_filters)))"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if (session.query(q.exists()).scalar()):"},{"line_number":125,"context_line":"                return True"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_a3d1d5fd","line":124,"updated":"2016-09-22 17:41:46.000000000","message":"nit: no need for the outer ()","commit_id":"72091d5a6db28da8a2e41e122517559561360744"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"dd4b06a1610691280b04c0e03a5959fa92ad8dfe","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                  .filter(sqlalchemy.or_(*domain_id_filters))"},{"line_number":122,"context_line":"                  .filter(sqlalchemy.and_(*token_filters)))"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if (session.query(q.exists()).scalar()):"},{"line_number":125,"context_line":"                return True"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_2248282d","line":124,"in_reply_to":"5a8bc5a2_a3d1d5fd","updated":"2016-09-23 15:24:46.000000000","message":"Done","commit_id":"72091d5a6db28da8a2e41e122517559561360744"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"480da03cc98de7957f4fc588c1a820c8d9573a60","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"},{"line_number":106,"context_line":"                if not token[\u0027roles\u0027]:"},{"line_number":107,"context_line":"                    token_filters.append(RevocationEvent.role_id.is_(None))"},{"line_number":108,"context_line":"                else:"},{"line_number":109,"context_line":"                    token_filters.append(sqlalchemy.or_("}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_a1e3ffa2","line":106,"updated":"2016-09-26 17:47:44.000000000","message":"Why not \"if not value\"?","commit_id":"0eeb6e6bd1707e1d6e24396fd2093026425dbee1"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"63c6c78f416632f1602096b31bf36c8b29872137","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"},{"line_number":106,"context_line":"                if not token[\u0027roles\u0027]:"},{"line_number":107,"context_line":"                    token_filters.append(RevocationEvent.role_id.is_(None))"},{"line_number":108,"context_line":"                else:"},{"line_number":109,"context_line":"                    token_filters.append(sqlalchemy.or_("}],"source_content_type":"text/x-python","patch_set":26,"id":"5a8bc5a2_3729f137","line":106,"in_reply_to":"5a8bc5a2_a1e3ffa2","updated":"2016-09-26 18:10:19.000000000","message":"good eye, done","commit_id":"0eeb6e6bd1707e1d6e24396fd2093026425dbee1"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"487cd1901e66fd199b3f3923612b64faed6778ad","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            session.flush()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def is_revoked(self, token):"},{"line_number":86,"context_line":"        user_id_filters \u003d ["},{"line_number":87,"context_line":"            sqlalchemy.or_(RevocationEvent.user_id.is_(None),"},{"line_number":88,"context_line":"                           RevocationEvent.user_id \u003d\u003d token[\u0027user_id\u0027]),"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a8bc5a2_9ffd7370","line":85,"range":{"start_line":85,"start_character":8,"end_line":85,"end_character":18},"updated":"2016-09-26 20:13:01.000000000","message":"So based on Brant\u0027s comment that shows the actual query, it looks like you\u0027re checking repeatedly if the same field is null, e.g.: \n  revocation_event.user_id IS NULL OR\n  revocation_event.user_id IS NULL OR\n  revocation_event.user_id IS NULL OR\n  revocation_event.user_id IS NULL","commit_id":"e0899638dc8b537bab43109f998070f752659aec"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5d75e6b09a829697ed13b9bc6cb8951ff6e224d3","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":"        token_filters \u003d [RevocationEvent.issued_before \u003e\u003d token[\u0027issued_at\u0027]]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"},{"line_number":106,"context_line":"                if not value:"},{"line_number":107,"context_line":"                    token_filters.append(RevocationEvent.role_id.is_(None))"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a8bc5a2_59022b0b","line":104,"updated":"2016-09-26 19:35:46.000000000","message":"this method still has a for loop in it that makes it look like sometimes there will be fields like roles, project_id, etc. and sometimes there will not and so is misleading. Fields like roles, project_id, etc. are always present in the token data. The code should be changed to instead of have a loop here to build the array as it\u0027s going to look.\n\nFor example:\n\n token_filters \u003d [\n   sqlalchemy.or_(\n     RevocationEvent.project_id.is_(None),\n     RevocationEvent.project_id \u003d\u003d token[\u0027project_id\u0027)),\n   (etc, for each field)\n ]\n if token[\u0027roles\u0027]:\n   token_filters.append(sqlalchemy.or_(\n       RevocationEvent.role_id.is_(None),\n       RevocationEvent.role_id.in_(value)))\n else:\n   token_filters.append(RevocationEvent.role_id.is_(None))","commit_id":"e0899638dc8b537bab43109f998070f752659aec"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"cf30846ac3ef81d3ee18109f1a1415a5ad625067","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":"        token_filters \u003d [RevocationEvent.issued_before \u003e\u003d token[\u0027issued_at\u0027]]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"},{"line_number":106,"context_line":"                if not value:"},{"line_number":107,"context_line":"                    token_filters.append(RevocationEvent.role_id.is_(None))"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a8bc5a2_67f1f96a","line":104,"in_reply_to":"5a8bc5a2_59022b0b","updated":"2016-09-26 22:20:38.000000000","message":"Unscoped tokens won\u0027t have a project_id, correct?  And why not generalize the rest of the keys if they all result in:\n\"token_filters.append(sqlalchemy.or_(\n    getattr(RevocationEvent, key).is_(None),\n    getattr(RevocationEvent, key) \u003d\u003d value))\"\n\nI don\u0027t think we want to create a block of code for each key, right?","commit_id":"e0899638dc8b537bab43109f998070f752659aec"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f5ef8447f245b718dca10a607cda3cf621aec4ac","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":"        token_filters \u003d [RevocationEvent.issued_before \u003e\u003d token[\u0027issued_at\u0027]]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        for key, value in token.items():"},{"line_number":105,"context_line":"            if key \u003d\u003d \u0027roles\u0027:"},{"line_number":106,"context_line":"                if not value:"},{"line_number":107,"context_line":"                    token_filters.append(RevocationEvent.role_id.is_(None))"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a8bc5a2_47531d39","line":104,"in_reply_to":"5a8bc5a2_67f1f96a","updated":"2016-09-26 22:33:11.000000000","message":"The token data always has project_id. It\u0027ll be None if the token is unscoped. No need to speculate on this, run the experiment. Here\u0027s the result I got: http://paste.openstack.org/show/583005/\n\nThis is an example where the existing code is confusing to readers and leads to incorrect assumptions.","commit_id":"e0899638dc8b537bab43109f998070f752659aec"}],"keystone/revoke/core.py":[{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"371d91bc33c775cd5262afa5fec8a431a8fcd3c0","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                             are a subset of the attributes of model.TokenEvent"},{"line_number":201,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":202,"context_line":"        \"\"\""},{"line_number":203,"context_line":"        if self.driver.is_revoked(token_values):"},{"line_number":204,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_d558e8fc","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":48},"updated":"2016-08-25 15:40:47.000000000","message":"driver, in this case, it the Revoke class in revoke/core.py\nAlso no need for \"self.list_events()\" since we will be making a query\nto the database directly instead of using a dictionary representation\nof the revocation_event table in the database","commit_id":"0d8de7ed9d9c6a6745725df840ea1811642f6b96"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7c63b8e732e484159a88e4f89666e6b83838dfab","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        \"\"\""},{"line_number":206,"context_line":"        if self.driver.is_revoked(token_values):"},{"line_number":207,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a8ec9b2_96c74e97","line":206,"updated":"2016-09-21 14:57:36.000000000","message":"should be able to\n\n self.is_revoked(token_values)\n\n(remove \".driver\")","commit_id":"38f26aa0608da1c8a2c464cfe4c975b7e28f4950"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"17568d388d1880ba4bcbde142256b7b1981de3f3","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        \"\"\""},{"line_number":206,"context_line":"        if self.driver.is_revoked(token_values):"},{"line_number":207,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_9c64ccb9","line":206,"updated":"2016-09-21 15:44:29.000000000","message":"should be able to\n\n self.is_revoked(token_values)\n\n(remove \".driver\")\n\nThis will make it easier for us to override is_revoked in the manager if we ever feel like doing that.","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bf88309aff4417b2eef8ecffb89ef871380a3b81","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        \"\"\""},{"line_number":206,"context_line":"        if self.driver.is_revoked(token_values):"},{"line_number":207,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a8ec9b2_d81739a1","line":206,"in_reply_to":"7a8ec9b2_9c64ccb9","updated":"2016-09-21 17:31:44.000000000","message":"Done","commit_id":"6f71f4cae40071e2b24efd943ec7eaecc4c9b756"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fc7a7dfd1d6f3e3e6758bd700c4baa346b1fc77a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        \"\"\""},{"line_number":206,"context_line":"        if revoke_model.is_revoked(self.list_events(), token_values):"},{"line_number":207,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a8ec9b2_d2e46da9","side":"PARENT","line":206,"range":{"start_line":206,"start_character":11,"end_line":206,"end_character":34},"updated":"2016-09-21 20:57:54.000000000","message":"remove this function from the model in a subsequent patch","commit_id":"9bf2a752065f74ab9fad31fe9c1b42d2c28d71df"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"70c519cfc8c232ea0c5262d761736fecbe696b8d","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        \"\"\""},{"line_number":206,"context_line":"        if revoke_model.is_revoked(self.list_events(), token_values):"},{"line_number":207,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a8ec9b2_e3951932","side":"PARENT","line":206,"range":{"start_line":206,"start_character":11,"end_line":206,"end_character":34},"in_reply_to":"7a8ec9b2_d2e46da9","updated":"2016-09-21 23:29:27.000000000","message":"++","commit_id":"9bf2a752065f74ab9fad31fe9c1b42d2c28d71df"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cd35282269d167248d908f1722b865ef20c6a947","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        self.revoke(revoke_model.RevokeEvent(domain_id\u003ddomain_id,"},{"line_number":194,"context_line":"                                             role_id\u003drole_id))"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @MEMOIZE"},{"line_number":197,"context_line":"    def check_token(self, token_values):"},{"line_number":198,"context_line":"        \"\"\"Check the values from a token against the revocation list."},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_95d32a38","line":196,"updated":"2016-09-22 19:41:26.000000000","message":"Why was this added? There\u0027s no mention of it in the commit message.\n\nThis should be done in a separate commit if at all so that we can check the performance change separately from the sql change.","commit_id":"72091d5a6db28da8a2e41e122517559561360744"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"dd4b06a1610691280b04c0e03a5959fa92ad8dfe","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        self.revoke(revoke_model.RevokeEvent(domain_id\u003ddomain_id,"},{"line_number":194,"context_line":"                                             role_id\u003drole_id))"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    @MEMOIZE"},{"line_number":197,"context_line":"    def check_token(self, token_values):"},{"line_number":198,"context_line":"        \"\"\"Check the values from a token against the revocation list."},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5a8bc5a2_024dec3d","line":196,"in_reply_to":"5a8bc5a2_95d32a38","updated":"2016-09-23 15:24:46.000000000","message":"Done","commit_id":"72091d5a6db28da8a2e41e122517559561360744"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"29656a0bb9acfdd1b569916715a7c22366725de6","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        :raises keystone.exception.TokenNotFound: If the token is invalid."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        \"\"\""},{"line_number":206,"context_line":"        if self.is_revoked(token_values):"},{"line_number":207,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def revoke(self, event):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_3baa0e71","line":206,"range":{"start_line":206,"start_character":11,"end_line":206,"end_character":16},"updated":"2016-09-23 17:45:43.000000000","message":"I think this should be self.driver.","commit_id":"a9b82d4bae3a96f36220f30f7488b27c93401275"}],"keystone/tests/unit/test_revoke.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e2246640e1f731ef1d7dbda70b5b46b2b55bd9fc","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        self.token_to_revoke \u003d token_to_revoke"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _assertTokenRevoked(self, token_data):"},{"line_number":231,"context_line":"        self.assertTrue(self.revoke_api.is_revoke(token_data))"},{"line_number":232,"context_line":"        return self.assertTrue(self.revoke_api.is_revoke(token_data),"},{"line_number":233,"context_line":"                               \u0027Token should be revoked\u0027)"},{"line_number":234,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_eeaf0792","line":231,"range":{"start_line":231,"start_character":40,"end_line":231,"end_character":49},"updated":"2016-09-23 16:22:34.000000000","message":"is_revoked","commit_id":"a9b82d4bae3a96f36220f30f7488b27c93401275"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"0550fe473c34760851f0c6f8c9f4aa208c16dc61","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        self.token_to_revoke \u003d token_to_revoke"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _assertTokenRevoked(self, token_data):"},{"line_number":231,"context_line":"        self.assertTrue(self.revoke_api.is_revoke(token_data))"},{"line_number":232,"context_line":"        return self.assertTrue(self.revoke_api.is_revoke(token_data),"},{"line_number":233,"context_line":"                               \u0027Token should be revoked\u0027)"},{"line_number":234,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_225743cf","line":231,"range":{"start_line":231,"start_character":40,"end_line":231,"end_character":49},"in_reply_to":"5a8bc5a2_eeaf0792","updated":"2016-09-23 16:36:59.000000000","message":"Done","commit_id":"a9b82d4bae3a96f36220f30f7488b27c93401275"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e2246640e1f731ef1d7dbda70b5b46b2b55bd9fc","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                               \u0027Token should be revoked\u0027)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def _assertTokenNotRevoked(self, token_data):"},{"line_number":236,"context_line":"        self.assertFalse(self.revoke_api.is_revoke(token_data))"},{"line_number":237,"context_line":"        return self.assertFalse(self.revoke_api.is_revoke(token_data),"},{"line_number":238,"context_line":"                                \u0027Token should not be revoked\u0027)"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_0e97d348","line":236,"range":{"start_line":236,"start_character":41,"end_line":236,"end_character":50},"updated":"2016-09-23 16:22:34.000000000","message":"is_revoked","commit_id":"a9b82d4bae3a96f36220f30f7488b27c93401275"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"0550fe473c34760851f0c6f8c9f4aa208c16dc61","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                               \u0027Token should be revoked\u0027)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def _assertTokenNotRevoked(self, token_data):"},{"line_number":236,"context_line":"        self.assertFalse(self.revoke_api.is_revoke(token_data))"},{"line_number":237,"context_line":"        return self.assertFalse(self.revoke_api.is_revoke(token_data),"},{"line_number":238,"context_line":"                                \u0027Token should not be revoked\u0027)"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a8bc5a2_8262d7ab","line":236,"range":{"start_line":236,"start_character":41,"end_line":236,"end_character":50},"in_reply_to":"5a8bc5a2_0e97d348","updated":"2016-09-23 16:36:59.000000000","message":"Done","commit_id":"a9b82d4bae3a96f36220f30f7488b27c93401275"}]}
