)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"5d5eb4385424ea1a04bc5df61ddb74696f1744b3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This commit prepares the tests in keystone/tests/unit/test_v3_assignment.py for"},{"line_number":10,"context_line":"the switch to make Fernet the default token provider. Since Fernet doesn\u0027t"},{"line_number":11,"context_line":"support sub-second precision it is possible to get the wrong response when"},{"line_number":12,"context_line":"using the token API within the same second as a revocation event. We can either"},{"line_number":13,"context_line":"introduce a sleep (which slows down our tests) or mock the system clock."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We can use freezegun to mock the system clock. This commit uses freezegun to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dada55a8_4d6db797","line":12,"updated":"2016-07-18 21:12:48.000000000","message":"If this is the case in the tests doesn\u0027t that mean there could be race conditions in a production environment? Is that a concern?","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bc8a75c4c33464388595d4f890a2cb34e45594aa","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This commit prepares the tests in keystone/tests/unit/test_v3_assignment.py for"},{"line_number":10,"context_line":"the switch to make Fernet the default token provider. Since Fernet doesn\u0027t"},{"line_number":11,"context_line":"support sub-second precision it is possible to get the wrong response when"},{"line_number":12,"context_line":"using the token API within the same second as a revocation event. We can either"},{"line_number":13,"context_line":"introduce a sleep (which slows down our tests) or mock the system clock."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"We can use freezegun to mock the system clock. This commit uses freezegun to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dada55a8_15dec1dc","line":12,"in_reply_to":"dada55a8_4d6db797","updated":"2016-07-20 15:07:50.000000000","message":"Yeah - and this is something known that we\u0027ve talked about in larger groups. Our fix for this is to document the behavior of Fernet saying if any sort of revocation event happens and another token is immediately asked for within that same second - keystone is going to err on the side of security and not issue a token until a new second has rolled over.","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e9cd5456618a0fe68c87a00fe168a726999ecca5","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self.put(member_url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_crud_group_project_role_grants(self):"},{"line_number":190,"context_line":"        time \u003d datetime.datetime.utcnow()"},{"line_number":191,"context_line":"        with freezegun.freeze_time(time) as frozen_datetime:"},{"line_number":192,"context_line":"            collection_url \u003d ("},{"line_number":193,"context_line":"                \u0027/projects/%(project_id)s/groups/%(group_id)s/roles\u0027 % {"},{"line_number":194,"context_line":"                    \u0027project_id\u0027: self.project_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_7c2e0f44","line":191,"range":{"start_line":190,"start_character":0,"end_line":191,"end_character":40},"updated":"2016-07-20 13:00:14.000000000","message":"think it is safer to use like the following:\n\n   with freezegun.freeze_time(datetime.datetime.utcnow()) as fronzen_datetime:","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3ddb7a141fdd85917e93e41dbd4dde52e6d6ebcd","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_crud_group_project_role_grants(self):"},{"line_number":190,"context_line":"        time \u003d datetime.datetime.utcnow()"},{"line_number":191,"context_line":"        with freezegun.freeze_time(time) as frozen_datetime:"},{"line_number":192,"context_line":"            collection_url \u003d ("},{"line_number":193,"context_line":"                \u0027/projects/%(project_id)s/groups/%(group_id)s/roles\u0027 % {"},{"line_number":194,"context_line":"                    \u0027project_id\u0027: self.project_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_04eb2c79","line":191,"in_reply_to":"dada55a8_75f57d55","updated":"2016-07-20 16:27:44.000000000","message":"nevermind, freezegun does the right think underneath :)","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bc8a75c4c33464388595d4f890a2cb34e45594aa","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_crud_group_project_role_grants(self):"},{"line_number":190,"context_line":"        time \u003d datetime.datetime.utcnow()"},{"line_number":191,"context_line":"        with freezegun.freeze_time(time) as frozen_datetime:"},{"line_number":192,"context_line":"            collection_url \u003d ("},{"line_number":193,"context_line":"                \u0027/projects/%(project_id)s/groups/%(group_id)s/roles\u0027 % {"},{"line_number":194,"context_line":"                    \u0027project_id\u0027: self.project_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_75f57d55","line":191,"in_reply_to":"dada55a8_7c2e0f44","updated":"2016-07-20 15:07:50.000000000","message":"Safer?","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"5d5eb4385424ea1a04bc5df61ddb74696f1744b3","unresolved":false,"context_lines":[{"line_number":207,"context_line":"            self.delete(member_url)"},{"line_number":208,"context_line":"            # NOTE(lbragstad): Since Fernet tokens do not support sub-second"},{"line_number":209,"context_line":"            # precision we must freeze the clock and ensure we increment the"},{"line_number":210,"context_line":"            # time by a full second after a recovation event has occured."},{"line_number":211,"context_line":"            # Otherwise the token will be considered revoked even though it is"},{"line_number":212,"context_line":"            # actually a valid token."},{"line_number":213,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_edf62bd6","line":210,"updated":"2016-07-18 21:12:48.000000000","message":"s/recovation/revocation/\n\ns/occured/occurred/\n\nsame typos below","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bc8a75c4c33464388595d4f890a2cb34e45594aa","unresolved":false,"context_lines":[{"line_number":207,"context_line":"            self.delete(member_url)"},{"line_number":208,"context_line":"            # NOTE(lbragstad): Since Fernet tokens do not support sub-second"},{"line_number":209,"context_line":"            # precision we must freeze the clock and ensure we increment the"},{"line_number":210,"context_line":"            # time by a full second after a recovation event has occured."},{"line_number":211,"context_line":"            # Otherwise the token will be considered revoked even though it is"},{"line_number":212,"context_line":"            # actually a valid token."},{"line_number":213,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_759c5d0f","line":210,"in_reply_to":"dada55a8_5cf06bfe","updated":"2016-07-20 15:07:50.000000000","message":"hah - nice catch!","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"e9cd5456618a0fe68c87a00fe168a726999ecca5","unresolved":false,"context_lines":[{"line_number":207,"context_line":"            self.delete(member_url)"},{"line_number":208,"context_line":"            # NOTE(lbragstad): Since Fernet tokens do not support sub-second"},{"line_number":209,"context_line":"            # precision we must freeze the clock and ensure we increment the"},{"line_number":210,"context_line":"            # time by a full second after a recovation event has occured."},{"line_number":211,"context_line":"            # Otherwise the token will be considered revoked even though it is"},{"line_number":212,"context_line":"            # actually a valid token."},{"line_number":213,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_5cf06bfe","line":210,"in_reply_to":"dada55a8_edf62bd6","updated":"2016-07-20 13:00:14.000000000","message":"+1","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"5d5eb4385424ea1a04bc5df61ddb74696f1744b3","unresolved":false,"context_lines":[{"line_number":597,"context_line":"            self.delete(gp_entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":598,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":599,"context_line":"            self.delete(up_entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":600,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":601,"context_line":"            r \u003d self.get(collection_url)"},{"line_number":602,"context_line":"            self.assertValidRoleAssignmentListResponse("},{"line_number":603,"context_line":"                r,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_8d04cf7e","line":600,"updated":"2016-07-18 21:12:48.000000000","message":"Why do we need to tick four times? Wouldn\u0027t adding one second after all these deletes give the right result?","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc4cfbd2a023e5767ff34f4a0206982f71e5480f","unresolved":false,"context_lines":[{"line_number":597,"context_line":"            self.delete(gp_entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":598,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":599,"context_line":"            self.delete(up_entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":600,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":601,"context_line":"            r \u003d self.get(collection_url)"},{"line_number":602,"context_line":"            self.assertValidRoleAssignmentListResponse("},{"line_number":603,"context_line":"                r,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_d7189a20","line":600,"in_reply_to":"dada55a8_0f0ce539","updated":"2016-07-20 21:57:28.000000000","message":"Nope, I didn\u0027t need to forward the clock after every delete (it was just copied over from the original patch). I\u0027ve removed all but one of the tick() calls.\n\nGood catch!","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"912927e405e555d9ad1aac6b9cc2a9eb24b38a1f","unresolved":false,"context_lines":[{"line_number":597,"context_line":"            self.delete(gp_entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":598,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":599,"context_line":"            self.delete(up_entity[\u0027links\u0027][\u0027assignment\u0027])"},{"line_number":600,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":601,"context_line":"            r \u003d self.get(collection_url)"},{"line_number":602,"context_line":"            self.assertValidRoleAssignmentListResponse("},{"line_number":603,"context_line":"                r,"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_0f0ce539","line":600,"in_reply_to":"dada55a8_8d04cf7e","updated":"2016-07-20 16:30:27.000000000","message":"Probably - I\u0027ll try it out!","commit_id":"2e9e6861e4d922b2b4d4b1b1abc1e2d3cd6233c7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7c12445eadf85838d63465fb91a77f6638547c88","unresolved":false,"context_lines":[{"line_number":365,"context_line":"            # precision we must freeze the clock and ensure we increment the"},{"line_number":366,"context_line":"            # time by a full second after a revocation event has occurred."},{"line_number":367,"context_line":"            # Otherwise the token will be considered revoked even though it is"},{"line_number":368,"context_line":"            # actually a valid token."},{"line_number":369,"context_line":"            frozen_datetime.tick(delta\u003ddatetime.timedelta(seconds\u003d1))"},{"line_number":370,"context_line":"            # validates the same token again; it should not longer be valid."},{"line_number":371,"context_line":"            self.head(\u0027/auth/tokens\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dada55a8_91c3c556","line":368,"updated":"2016-07-21 05:43:23.000000000","message":"Ah - this comment doesn\u0027t make sense. I need to rewrite it.","commit_id":"306f9eeb309e550e40f5f1b80bae1f3c26e7772d"}]}
