)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3adca18d6766b7c06e280464d69124c8fd19d61","unresolved":false,"context_lines":[{"line_number":13,"context_line":"keystone will explicitly do an enabled check to determine if a token is"},{"line_number":14,"context_line":"valid. Futhermore, this is just one step in a series of patches to"},{"line_number":15,"context_line":"eliminate most revocation events, ultimately improving the performance"},{"line_number":16,"context_line":"of Fernet token validation."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I4f0d8513689fb4e2684b6ad3c77ddee3f8c6d19e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a8ec9b2_f13795fc","line":16,"updated":"2016-09-16 17:02:24.000000000","message":"++ nice commit message","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e9a277d3e2bff4c49d975f6b6cd93b45496f1c39","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Reduce revoke events for disabled domains/projects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Keystone\u0027s preformance degradates as the \u0027revocation_event\u0027 table grows"},{"line_number":10,"context_line":"in size. This patch is the initial step towards reducing the number of"},{"line_number":11,"context_line":"revocation events written the \u0027revocation_event\u0027 table. Instead of"},{"line_number":12,"context_line":"creating revocation events when a project or domain is disabled,"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7a8ec9b2_f68c8f81","line":9,"updated":"2016-09-19 18:31:38.000000000","message":"degrades?","commit_id":"bf5f04000349f39f695131c51066f816a12c07e0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e9a277d3e2bff4c49d975f6b6cd93b45496f1c39","unresolved":false,"context_lines":[{"line_number":10,"context_line":"in size. This patch is the initial step towards reducing the number of"},{"line_number":11,"context_line":"revocation events written the \u0027revocation_event\u0027 table. Instead of"},{"line_number":12,"context_line":"creating revocation events when a project or domain is disabled,"},{"line_number":13,"context_line":"keystone will explicitly do an enabled check to determine if a token is"},{"line_number":14,"context_line":"valid. Futhermore, this is just one step in a series of patches to"},{"line_number":15,"context_line":"eliminate most revocation events, ultimately improving the performance"},{"line_number":16,"context_line":"of Fernet token validation."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7a8ec9b2_16e81b16","line":13,"updated":"2016-09-19 18:31:38.000000000","message":"Is there any reason to revoke at all then? I presume if a domain/project is deleted that this check would fail.","commit_id":"bf5f04000349f39f695131c51066f816a12c07e0"}],"keystone/revoke/core.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _project_callback(self, service, resource_type, operation,"},{"line_number":94,"context_line":"                          payload):"},{"line_number":95,"context_line":"        # Do not revoke if the operation is just to disable project"},{"line_number":96,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":97,"context_line":"            self.revoke("},{"line_number":98,"context_line":"                revoke_model.RevokeEvent(project_id\u003dpayload[\u0027resource_info\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_1a67c34d","line":95,"range":{"start_line":95,"start_character":10,"end_line":95,"end_character":23},"updated":"2016-09-16 14:23:52.000000000","message":"why? Guess you need to explain the revoke event is not needed since a different verification is performed.","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _project_callback(self, service, resource_type, operation,"},{"line_number":94,"context_line":"                          payload):"},{"line_number":95,"context_line":"        # Do not revoke if the operation is just to disable project"},{"line_number":96,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":97,"context_line":"            self.revoke("},{"line_number":98,"context_line":"                revoke_model.RevokeEvent(project_id\u003dpayload[\u0027resource_info\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_110de1e7","line":95,"range":{"start_line":95,"start_character":10,"end_line":95,"end_character":23},"in_reply_to":"7a8ec9b2_1a67c34d","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _domain_callback(self, service, resource_type, operation,"},{"line_number":101,"context_line":"                         payload):"},{"line_number":102,"context_line":"        # Do not revoke if the operation is just to disable domain"},{"line_number":103,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":104,"context_line":"            self.revoke("},{"line_number":105,"context_line":"                revoke_model.RevokeEvent(domain_id\u003dpayload[\u0027resource_info\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_3a81dfc3","line":102,"range":{"start_line":102,"start_character":10,"end_line":102,"end_character":23},"updated":"2016-09-16 14:23:52.000000000","message":"why?","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _domain_callback(self, service, resource_type, operation,"},{"line_number":101,"context_line":"                         payload):"},{"line_number":102,"context_line":"        # Do not revoke if the operation is just to disable domain"},{"line_number":103,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":104,"context_line":"            self.revoke("},{"line_number":105,"context_line":"                revoke_model.RevokeEvent(domain_id\u003dpayload[\u0027resource_info\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_3112dd09","line":102,"range":{"start_line":102,"start_character":10,"end_line":102,"end_character":23},"in_reply_to":"7a8ec9b2_3a81dfc3","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3adca18d6766b7c06e280464d69124c8fd19d61","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _project_callback(self, service, resource_type, operation,"},{"line_number":94,"context_line":"                          payload):"},{"line_number":95,"context_line":"        # Do not revoke if the operation is just to disable project"},{"line_number":96,"context_line":"        # In order to further reduce the size of revocation_event lists"},{"line_number":97,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":98,"context_line":"        # an enabled check is performed instead to see if the token is still"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_0c078618","line":95,"updated":"2016-09-16 17:02:24.000000000","message":"nit: missing period after `project`?","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"c28a9cbead12d580a5215507cd37668b3c6e5e8f","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _project_callback(self, service, resource_type, operation,"},{"line_number":94,"context_line":"                          payload):"},{"line_number":95,"context_line":"        # Do not revoke if the operation is just to disable project"},{"line_number":96,"context_line":"        # In order to further reduce the size of revocation_event lists"},{"line_number":97,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":98,"context_line":"        # an enabled check is performed instead to see if the token is still"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_6950f932","line":95,"in_reply_to":"7a8ec9b2_0c078618","updated":"2016-09-16 19:58:42.000000000","message":"Done","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3adca18d6766b7c06e280464d69124c8fd19d61","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":98,"context_line":"        # an enabled check is performed instead to see if the token is still"},{"line_number":99,"context_line":"        # valid, so we don\u0027t revoke everytime the disable operation runs"},{"line_number":100,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":101,"context_line":"            self.revoke("},{"line_number":102,"context_line":"                revoke_model.RevokeEvent(project_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_ccd11e59","line":100,"updated":"2016-09-16 17:02:24.000000000","message":"Would it be easier to read if we only revoked based on the operations we *want* to revoke on? For example, what if we did something like:\n\n  if operation \u003d\u003d \u0027deleted\u0027:\n      self.revoke(...)\n\nThat way folks reading the code know exactly what causes the revocation event to be stored.\n\nAnother way to get around this is to make sure that when a token is validated, the role assignments are rebuilt from scratch. This means that we would no longer need to persist revocation events for domains or projects, since the data would be considered correct at validation time because we just calculated it.\n\nThoughts?","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"c28a9cbead12d580a5215507cd37668b3c6e5e8f","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":98,"context_line":"        # an enabled check is performed instead to see if the token is still"},{"line_number":99,"context_line":"        # valid, so we don\u0027t revoke everytime the disable operation runs"},{"line_number":100,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":101,"context_line":"            self.revoke("},{"line_number":102,"context_line":"                revoke_model.RevokeEvent(project_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_8943856b","line":100,"in_reply_to":"7a8ec9b2_ccd11e59","updated":"2016-09-16 19:58:42.000000000","message":"Done","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3adca18d6766b7c06e280464d69124c8fd19d61","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _domain_callback(self, service, resource_type, operation,"},{"line_number":105,"context_line":"                         payload):"},{"line_number":106,"context_line":"        # Do not revoke if the operation is just to disable domain"},{"line_number":107,"context_line":"        # In order to further reduce the size of revocation_event lists"},{"line_number":108,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":109,"context_line":"        # an enabled check is performed instead to see if the token is still"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_ac185276","line":106,"updated":"2016-09-16 17:02:24.000000000","message":"Same punctuation comment here.","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"c28a9cbead12d580a5215507cd37668b3c6e5e8f","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _domain_callback(self, service, resource_type, operation,"},{"line_number":105,"context_line":"                         payload):"},{"line_number":106,"context_line":"        # Do not revoke if the operation is just to disable domain"},{"line_number":107,"context_line":"        # In order to further reduce the size of revocation_event lists"},{"line_number":108,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":109,"context_line":"        # an enabled check is performed instead to see if the token is still"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_a9468178","line":106,"in_reply_to":"7a8ec9b2_ac185276","updated":"2016-09-16 19:58:42.000000000","message":"Done","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3adca18d6766b7c06e280464d69124c8fd19d61","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":109,"context_line":"        # an enabled check is performed instead to see if the token is still"},{"line_number":110,"context_line":"        # valid, so we don\u0027t revoke everytime the disable operation runs"},{"line_number":111,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":112,"context_line":"            self.revoke("},{"line_number":113,"context_line":"                revoke_model.RevokeEvent(domain_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_4c4d0e3d","line":111,"updated":"2016-09-16 17:02:24.000000000","message":"Same comment here.","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"c28a9cbead12d580a5215507cd37668b3c6e5e8f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        # we only revoke if the operation is to delete the project. Otherwise"},{"line_number":109,"context_line":"        # an enabled check is performed instead to see if the token is still"},{"line_number":110,"context_line":"        # valid, so we don\u0027t revoke everytime the disable operation runs"},{"line_number":111,"context_line":"        if operation !\u003d \u0027disabled\u0027:"},{"line_number":112,"context_line":"            self.revoke("},{"line_number":113,"context_line":"                revoke_model.RevokeEvent(domain_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_c9610d07","line":111,"in_reply_to":"7a8ec9b2_4c4d0e3d","updated":"2016-09-16 19:58:42.000000000","message":"Done","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"}],"keystone/tests/unit/test_token_provider.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":872,"context_line":"        # Check for disabled tenant"},{"line_number":873,"context_line":"        self.assertRaises("},{"line_number":874,"context_line":"            exception.TokenNotFound,"},{"line_number":875,"context_line":"            self.token_provider_api._check_domain_and_project_enabled,"},{"line_number":876,"context_line":"            SAMPLE_V2_TOKEN)"},{"line_number":877,"context_line":""},{"line_number":878,"context_line":"    def test_provider_v3_token_disabled_project(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_fa64d722","line":875,"range":{"start_line":875,"start_character":36,"end_line":875,"end_character":69},"updated":"2016-09-16 14:23:52.000000000","message":"you need to check the \"validate_token\" call as it is one in the test on line 857. In this way, you check the exception of the _check_domain_and_project_enabled method is properly propagated.","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":872,"context_line":"        # Check for disabled tenant"},{"line_number":873,"context_line":"        self.assertRaises("},{"line_number":874,"context_line":"            exception.TokenNotFound,"},{"line_number":875,"context_line":"            self.token_provider_api._check_domain_and_project_enabled,"},{"line_number":876,"context_line":"            SAMPLE_V2_TOKEN)"},{"line_number":877,"context_line":""},{"line_number":878,"context_line":"    def test_provider_v3_token_disabled_project(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_f13235a6","line":875,"range":{"start_line":875,"start_character":36,"end_line":875,"end_character":69},"in_reply_to":"7a8ec9b2_fa64d722","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":855,"context_line":"            self.token_provider_api._is_valid_token(create_v3_token()))"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"    def test_no_token_raises_token_not_found(self):"},{"line_number":858,"context_line":"        self.assertRaises("},{"line_number":859,"context_line":"            exception.TokenNotFound,"},{"line_number":860,"context_line":"            self.token_provider_api.validate_token,"},{"line_number":861,"context_line":"            None)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def test_provider_v2_token_enabled_validation(self):"},{"line_number":864,"context_line":"        # Check with enabled project"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_06fcc23c","line":861,"range":{"start_line":858,"start_character":0,"end_line":861,"end_character":17},"updated":"2016-09-16 17:02:09.000000000","message":"extract this to a private method, something like:\n\n  def _assert_token_not_found(self, token):\n        self.assertRaises(\n            exception.TokenNotFound,\n            self.token_provider_api.validate_token,\n            token)","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":867,"context_line":"                SAMPLE_V2_TOKEN))"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        # Disable project"},{"line_number":870,"context_line":"        self.resource_api.update_project(\u002701257\u0027, {\"enabled\": False})"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        # Validate the token before checking disabled"},{"line_number":873,"context_line":"        self.test_no_token_raises_token_not_found()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_4666ca2a","line":870,"range":{"start_line":870,"start_character":42,"end_line":870,"end_character":47},"updated":"2016-09-16 17:02:09.000000000","message":"use the variable, not the literal directly (like you do on line 790)","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        self.resource_api.update_project(\u002701257\u0027, {\"enabled\": False})"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        # Validate the token before checking disabled"},{"line_number":873,"context_line":"        self.test_no_token_raises_token_not_found()"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"        # Check for disabled project"},{"line_number":876,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_26f7fe59","line":873,"range":{"start_line":873,"start_character":13,"end_line":873,"end_character":49},"updated":"2016-09-16 17:02:09.000000000","message":"this isn\u0027t testing anything, since it is passing None as the token. With the suggestion above:\n\n    self._assert_token_not_found(SAMPLE_V2_TOKEN)\n\nAlso, do this after the assertRaises below","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"cf5e33651fe29b3f68582614dd5bcfcd2e4de838","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        self.resource_api.update_project(\u002701257\u0027, {\"enabled\": False})"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        # Validate the token before checking disabled"},{"line_number":873,"context_line":"        self.test_no_token_raises_token_not_found()"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"        # Check for disabled project"},{"line_number":876,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_e36b3db5","line":873,"range":{"start_line":873,"start_character":13,"end_line":873,"end_character":49},"in_reply_to":"7a8ec9b2_26f7fe59","updated":"2016-09-16 21:11:14.000000000","message":"SAMPLE tokens cannot be passed into token_provider_api.validate_token method since it does not expect a dictionary and only uses token_id. This would result in a TypeError unhashable value","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def test_provider_v3_token_disabled_project(self):"},{"line_number":882,"context_line":"        # Disable project"},{"line_number":883,"context_line":"        self.resource_api.update_project(\u002701257\u0027, {\"enabled\": False})"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"        self.assertRaises("},{"line_number":886,"context_line":"            exception.TokenNotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_a66f8efa","line":883,"range":{"start_line":883,"start_character":42,"end_line":883,"end_character":47},"updated":"2016-09-16 17:02:09.000000000","message":"use the variable, not the literal directly (like you do on line 790)","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":886,"context_line":"            exception.TokenNotFound,"},{"line_number":887,"context_line":"            self.token_provider_api._check_domain_and_project_enabled,"},{"line_number":888,"context_line":"            SAMPLE_V3_TOKEN)"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_provider_v3_token_disabled_domain(self):"},{"line_number":891,"context_line":"        # Disable domain"},{"line_number":892,"context_line":"        self.resource_api.update_domain(\u0027default\u0027, {\"enabled\": False})"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_46bfaa60","line":889,"updated":"2016-09-16 17:02:09.000000000","message":"the same validation should be done here:\n\n  self._assert_token_not_found(SAMPLE_V3_TOKEN)","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_provider_v3_token_disabled_domain(self):"},{"line_number":891,"context_line":"        # Disable domain"},{"line_number":892,"context_line":"        self.resource_api.update_domain(\u0027default\u0027, {\"enabled\": False})"},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"        self.assertRaises("},{"line_number":895,"context_line":"            exception.TokenNotFound,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_e67516cb","line":892,"range":{"start_line":892,"start_character":41,"end_line":892,"end_character":48},"updated":"2016-09-16 17:02:09.000000000","message":"use the variable, not the literal directly (like you do on line 790)","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"315ff08b306236435447f91761af860f1a00afdd","unresolved":false,"context_lines":[{"line_number":895,"context_line":"            exception.TokenNotFound,"},{"line_number":896,"context_line":"            self.token_provider_api._check_domain_and_project_enabled,"},{"line_number":897,"context_line":"            SAMPLE_V3_TOKEN)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"# NOTE(ayoung): renamed to avoid automatic test detection"},{"line_number":901,"context_line":"class PKIProviderTests(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_06aa0219","line":898,"updated":"2016-09-16 17:02:09.000000000","message":"same as above","commit_id":"972086fd477d43e42bbe82fb5e057ce93a6dff27"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7e239b436d246d734dccfb63ed8fd335ab00a8b5","unresolved":false,"context_lines":[{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def test_provider_v2_token_enabled_validation(self):"},{"line_number":864,"context_line":"        # Check with enabled project"},{"line_number":865,"context_line":"        self.assertIsNone("},{"line_number":866,"context_line":"            self.token_provider_api._check_domain_and_project_enabled("},{"line_number":867,"context_line":"                SAMPLE_V2_TOKEN))"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        # Disable project"},{"line_number":870,"context_line":"        self.resource_api.update_project("}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_e6426bad","line":867,"range":{"start_line":865,"start_character":0,"end_line":867,"end_character":33},"updated":"2016-09-16 21:59:00.000000000","message":"this is doing nothing, check the return of a method that is supposed to raise an exception is not valuable.","commit_id":"616cb28d4ff201b45d1d79f5759d9403466b85df"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7e239b436d246d734dccfb63ed8fd335ab00a8b5","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        self.resource_api.update_project("},{"line_number":871,"context_line":"            SAMPLE_V2_TOKEN[\u0027access\u0027][\u0027token\u0027][\u0027tenant\u0027][\u0027id\u0027],"},{"line_number":872,"context_line":"            {\"enabled\": False})"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"        # Check for disabled project"},{"line_number":875,"context_line":"        self.assertRaises("},{"line_number":876,"context_line":"            exception.TokenNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a8ec9b2_461b1fca","line":873,"updated":"2016-09-16 21:59:00.000000000","message":"in the previous patchset I meant for you to use the token_id, not the dictionary.","commit_id":"616cb28d4ff201b45d1d79f5759d9403466b85df"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e9a277d3e2bff4c49d975f6b6cd93b45496f1c39","unresolved":false,"context_lines":[{"line_number":767,"context_line":""},{"line_number":768,"context_line":"        self._load_test_data()"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"    def _load_test_data(self):"},{"line_number":771,"context_line":"        # Create domains of SAMPLE tokens"},{"line_number":772,"context_line":"        domain \u003d unit.new_domain_ref(id\u003d\u0027default\u0027)"},{"line_number":773,"context_line":"        domain[\u0027name\u0027] \u003d SAMPLE_V3_TOKEN[\u0027token\u0027][\u0027user\u0027][\u0027domain\u0027][\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a8ec9b2_36ed1726","line":770,"updated":"2016-09-19 18:31:38.000000000","message":"Do all existing tests actually need this? I think if would be better to create the entities in the test that actually uses them. Since you have more than one test case that needs them I suggest maybe having a separate test class for this setup and those tests.","commit_id":"bf5f04000349f39f695131c51066f816a12c07e0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e9a277d3e2bff4c49d975f6b6cd93b45496f1c39","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        self.assertRaises(exception.TokenNotFound,"},{"line_number":844,"context_line":"                          self.token_provider_api._is_valid_token,"},{"line_number":845,"context_line":"                          SAMPLE_V2_TOKEN_EXPIRED)"},{"line_number":846,"context_line":"        SAMPLE_V3_TOKEN_EXPIRED[\u0027token\u0027][\u0027user\u0027] \u003d {}"},{"line_number":847,"context_line":"        self.assertRaises(exception.TokenNotFound,"},{"line_number":848,"context_line":"                          self.token_provider_api._is_valid_token,"},{"line_number":849,"context_line":"                          SAMPLE_V3_TOKEN_EXPIRED)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a8ec9b2_56f2a307","line":846,"updated":"2016-09-19 18:31:38.000000000","message":"What\u0027s this for?","commit_id":"bf5f04000349f39f695131c51066f816a12c07e0"}],"keystone/tests/unit/test_v3_auth.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":3492,"context_line":"        self.patch("},{"line_number":3493,"context_line":"            \u0027/domains/%(project_id)s\u0027 % {\u0027project_id\u0027: self.domainA[\u0027id\u0027]},"},{"line_number":3494,"context_line":"            body\u003ddisable_body)"},{"line_number":3495,"context_line":""},{"line_number":3496,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027).json_body"},{"line_number":3497,"context_line":""},{"line_number":3498,"context_line":"        self.assertEqual([], events[\u0027events\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_fa193789","line":3495,"updated":"2016-09-16 14:23:52.000000000","message":"add a comment saying that no event will be generated by the domain being disabled","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":3492,"context_line":"        self.patch("},{"line_number":3493,"context_line":"            \u0027/domains/%(project_id)s\u0027 % {\u0027project_id\u0027: self.domainA[\u0027id\u0027]},"},{"line_number":3494,"context_line":"            body\u003ddisable_body)"},{"line_number":3495,"context_line":""},{"line_number":3496,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027).json_body"},{"line_number":3497,"context_line":""},{"line_number":3498,"context_line":"        self.assertEqual([], events[\u0027events\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_51220953","line":3495,"in_reply_to":"7a8ec9b2_fa193789","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":3497,"context_line":""},{"line_number":3498,"context_line":"        self.assertEqual([], events[\u0027events\u0027])"},{"line_number":3499,"context_line":""},{"line_number":3500,"context_line":"    def test_disable_project_does_not_show_in_event_list(self):"},{"line_number":3501,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027).json_body[\u0027events\u0027]"},{"line_number":3502,"context_line":"        self.assertEqual([], events)"},{"line_number":3503,"context_line":"        disable_body \u003d {\u0027project\u0027: {\u0027enabled\u0027: False}}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_da539b37","line":3500,"updated":"2016-09-16 14:23:52.000000000","message":"nice!","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":3497,"context_line":""},{"line_number":3498,"context_line":"        self.assertEqual([], events[\u0027events\u0027])"},{"line_number":3499,"context_line":""},{"line_number":3500,"context_line":"    def test_disable_project_does_not_show_in_event_list(self):"},{"line_number":3501,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027).json_body[\u0027events\u0027]"},{"line_number":3502,"context_line":"        self.assertEqual([], events)"},{"line_number":3503,"context_line":"        disable_body \u003d {\u0027project\u0027: {\u0027enabled\u0027: False}}"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_91181120","line":3500,"in_reply_to":"7a8ec9b2_da539b37","updated":"2016-09-16 16:18:54.000000000","message":"Thanks!","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":3505,"context_line":"        self.patch("},{"line_number":3506,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {\u0027project_id\u0027: self.projectA[\u0027id\u0027]},"},{"line_number":3507,"context_line":"            body\u003ddisable_body)"},{"line_number":3508,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027).json_body"},{"line_number":3509,"context_line":""},{"line_number":3510,"context_line":"        self.assertEqual([], events[\u0027events\u0027])"},{"line_number":3511,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_7a27e7c9","line":3508,"updated":"2016-09-16 14:23:52.000000000","message":"add a comment saying that no event will be generated by the project being disabled","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":3505,"context_line":"        self.patch("},{"line_number":3506,"context_line":"            \u0027/projects/%(project_id)s\u0027 % {\u0027project_id\u0027: self.projectA[\u0027id\u0027]},"},{"line_number":3507,"context_line":"            body\u003ddisable_body)"},{"line_number":3508,"context_line":"        events \u003d self.get(\u0027/OS-REVOKE/events\u0027).json_body"},{"line_number":3509,"context_line":""},{"line_number":3510,"context_line":"        self.assertEqual([], events[\u0027events\u0027])"},{"line_number":3511,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_711f0508","line":3508,"in_reply_to":"7a8ec9b2_7a27e7c9","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"}],"keystone/tests/unit/token/test_backends.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e9a277d3e2bff4c49d975f6b6cd93b45496f1c39","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":469,"context_line":"        self.domain \u003d unit.new_domain_ref(id\u003dCONF.identity.default_domain_id)"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # Mock domain and project for enabled check"},{"line_number":472,"context_line":"        self.token_api.token_provider_api.resource_api.get_project \u003d mock.Mock("},{"line_number":473,"context_line":"            return_value\u003dself.tenant)"},{"line_number":474,"context_line":"        self.token_api.token_provider_api.resource_api.get_domain \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":6,"id":"7a8ec9b2_76f79ff5","line":471,"updated":"2016-09-19 18:31:38.000000000","message":"Is this something that now has to be done for all existings tests?","commit_id":"bf5f04000349f39f695131c51066f816a12c07e0"}],"keystone/token/provider.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def _check_domain_and_project_enabled(self, token):"},{"line_number":358,"context_line":"        \"\"\"Check if token properties are enabled."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        Explicitly check that the projects and domains associated with a token"},{"line_number":361,"context_line":"        are enabled. If they are not enabled then the token is invalid."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_9512c455","line":358,"range":{"start_line":358,"start_character":26,"end_line":358,"end_character":36},"updated":"2016-09-16 14:23:52.000000000","message":"s/properties/scope\n\n\"properties\" don\u0027t mean much in this context, please use \"scope\" instead","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            raise exception.TokenNotFound(_(\u0027Failed to validate token\u0027))"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def _check_domain_and_project_enabled(self, token):"},{"line_number":358,"context_line":"        \"\"\"Check if token properties are enabled."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        Explicitly check that the projects and domains associated with a token"},{"line_number":361,"context_line":"        are enabled. If they are not enabled then the token is invalid."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_31e01dfa","line":358,"range":{"start_line":358,"start_character":26,"end_line":358,"end_character":36},"in_reply_to":"7a8ec9b2_9512c455","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ff65fbfa57a98a5fe1d3da01fdcb6f846c4e7b3c","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            token_data \u003d token.get(\u0027token\u0027, token.get(\u0027access\u0027))"},{"line_number":367,"context_line":"            user_domain \u003d token_data[\u0027user\u0027].get(\u0027domain\u0027, {})"},{"line_number":368,"context_line":"            federated_domain \u003d CONF.federation.federated_domain_name"},{"line_number":369,"context_line":"            if user_domain and user_domain[\u0027name\u0027] !\u003d federated_domain:"},{"line_number":370,"context_line":"                self.resource_api.assert_domain_enabled(user_domain[\u0027id\u0027])"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"            # Trust token, trustee domain enable check"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_754d383d","line":369,"range":{"start_line":369,"start_character":31,"end_line":369,"end_character":70},"updated":"2016-09-16 14:23:52.000000000","message":"add a comment why you are verifying the domain is different from the federated_domain","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6284da21b9e140831f0dc29bb65439c9f19727da","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            token_data \u003d token.get(\u0027token\u0027, token.get(\u0027access\u0027))"},{"line_number":367,"context_line":"            user_domain \u003d token_data[\u0027user\u0027].get(\u0027domain\u0027, {})"},{"line_number":368,"context_line":"            federated_domain \u003d CONF.federation.federated_domain_name"},{"line_number":369,"context_line":"            if user_domain and user_domain[\u0027name\u0027] !\u003d federated_domain:"},{"line_number":370,"context_line":"                self.resource_api.assert_domain_enabled(user_domain[\u0027id\u0027])"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"            # Trust token, trustee domain enable check"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a8ec9b2_91ef31e8","line":369,"range":{"start_line":369,"start_character":31,"end_line":369,"end_character":70},"in_reply_to":"7a8ec9b2_754d383d","updated":"2016-09-16 16:18:54.000000000","message":"Done","commit_id":"3ff3dee65326938918e54bd1312b0a8f18bb832b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e9a277d3e2bff4c49d975f6b6cd93b45496f1c39","unresolved":false,"context_lines":[{"line_number":392,"context_line":"            if token_data.get(\u0027project\u0027):"},{"line_number":393,"context_line":"                project \u003d token_data[\u0027project\u0027]"},{"line_number":394,"context_line":"            elif token_data.get(\u0027token\u0027):"},{"line_number":395,"context_line":"                    project \u003d token_data[\u0027token\u0027].get(\u0027tenant\u0027, {})"},{"line_number":396,"context_line":"            if project:"},{"line_number":397,"context_line":"                # Also verifies that a project\u0027s domain is enabled"},{"line_number":398,"context_line":"                self.resource_api.assert_project_enabled(project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a8ec9b2_96dc2b76","line":395,"updated":"2016-09-19 18:31:38.000000000","message":"I think the indentation is wrong here.","commit_id":"bf5f04000349f39f695131c51066f816a12c07e0"}]}
