)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5163fe705c53ca14ceb11763aa3943027b7eff89","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"KVS token backend is not deprecated anymore. However, it is still"},{"line_number":17,"context_line":"inadvisable to use the basic-inmemory KVS backend for anything"},{"line_number":18,"context_line":"outside of testing."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"bp: dogpile-kvs-backends"},{"line_number":21,"context_line":"Change-Id: Ib278636d4ffa3f7152287a48d02be598c50f698a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAUH%2F%2F0ck%3D","line":18,"updated":"2014-01-08 04:07:25.000000000","message":"Given that the in memory KVS backend isn\u0027t recommended for anything but testing, should Doc Impact be added to this to ensure it gets documented if it isn\u0027t already?","commit_id":"ba06f30ed926c548217d1a307643d96462a42d41"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8f09b07d37993f5afd4f4e82a8d28a7013b7a14d","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"KVS token backend is not deprecated anymore. However, it is still"},{"line_number":17,"context_line":"inadvisable to use the basic-inmemory KVS backend for anything"},{"line_number":18,"context_line":"outside of testing."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"bp: dogpile-kvs-backends"},{"line_number":21,"context_line":"Change-Id: Ib278636d4ffa3f7152287a48d02be598c50f698a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAUH%2F%2FwrE%3D","line":18,"in_reply_to":"AAAAUH%2F%2F0ck%3D","updated":"2014-01-08 19:18:54.000000000","message":"Fair point. Done in next patchset.","commit_id":"ba06f30ed926c548217d1a307643d96462a42d41"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":3161,"context_line":""},{"line_number":3162,"context_line":"        for d in [\u0027+0\u0027, \u0027-11\u0027, \u0027-8\u0027, \u0027-5\u0027, \u0027+5\u0027, \u0027+8\u0027, \u0027+14\u0027]:"},{"line_number":3163,"context_line":"            test_utils.TZ \u003d \u0027UTC\u0027 + d"},{"line_number":3164,"context_line":"            expire_time \u003d timeutils.utcnow() + \\"},{"line_number":3165,"context_line":"                datetime.timedelta(minutes\u003d1)"},{"line_number":3166,"context_line":"            data_in \u003d _create_token(expire_time)"},{"line_number":3167,"context_line":"            data_get \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FhU%3D","line":3164,"updated":"2014-01-04 14:12:07.000000000","message":"use () to continue a line rather than \\","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":3164,"context_line":"            expire_time \u003d timeutils.utcnow() + \\"},{"line_number":3165,"context_line":"                datetime.timedelta(minutes\u003d1)"},{"line_number":3166,"context_line":"            data_in \u003d _create_token(expire_time)"},{"line_number":3167,"context_line":"            data_get \u003d None"},{"line_number":3168,"context_line":"            data_get \u003d self.token_api.get_token(data_in[\u0027id\u0027])"},{"line_number":3169,"context_line":""},{"line_number":3170,"context_line":"            self.assertIsNotNone(data_get, \"TZ\u003d%s\" % test_utils.TZ)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FhQ%3D","line":3167,"updated":"2014-01-04 14:12:07.000000000","message":"remove this line since it doesn\u0027t do anything.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":3167,"context_line":"            data_get \u003d None"},{"line_number":3168,"context_line":"            data_get \u003d self.token_api.get_token(data_in[\u0027id\u0027])"},{"line_number":3169,"context_line":""},{"line_number":3170,"context_line":"            self.assertIsNotNone(data_get, \"TZ\u003d%s\" % test_utils.TZ)"},{"line_number":3171,"context_line":"            self.assertEqual(data_in[\u0027id\u0027], data_get[\u0027id\u0027],"},{"line_number":3172,"context_line":"                             \"TZ\u003d%s\" % test_utils.TZ)"},{"line_number":3173,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FhI%3D","line":3170,"updated":"2014-01-04 14:12:07.000000000","message":"the next line checks this so suggest remove this line.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ab711ae6b89f54784912577afb386adcacd2ec08","unresolved":false,"context_lines":[{"line_number":3167,"context_line":"            data_get \u003d None"},{"line_number":3168,"context_line":"            data_get \u003d self.token_api.get_token(data_in[\u0027id\u0027])"},{"line_number":3169,"context_line":""},{"line_number":3170,"context_line":"            self.assertIsNotNone(data_get, \"TZ\u003d%s\" % test_utils.TZ)"},{"line_number":3171,"context_line":"            self.assertEqual(data_in[\u0027id\u0027], data_get[\u0027id\u0027],"},{"line_number":3172,"context_line":"                             \"TZ\u003d%s\" % test_utils.TZ)"},{"line_number":3173,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F8Ok%3D","line":3170,"in_reply_to":"AAAAUH%2F%2F%2FhI%3D","updated":"2014-01-06 13:59:33.000000000","message":"unless data_in[\u0027id\u0027] is also None","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":3171,"context_line":"            self.assertEqual(data_in[\u0027id\u0027], data_get[\u0027id\u0027],"},{"line_number":3172,"context_line":"                             \"TZ\u003d%s\" % test_utils.TZ)"},{"line_number":3173,"context_line":""},{"line_number":3174,"context_line":"            expire_time_expired \u003d timeutils.utcnow() + \\"},{"line_number":3175,"context_line":"                datetime.timedelta(minutes\u003d-1)"},{"line_number":3176,"context_line":"            data_in \u003d _create_token(expire_time_expired)"},{"line_number":3177,"context_line":"            self.assertRaises(exception.TokenNotFound,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FhM%3D","line":3174,"updated":"2014-01-04 14:12:07.000000000","message":"use () to continue a line rather than \\","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":2862,"context_line":"        # FIXME(morganfainberg): These tokens look nothing like \"Real\" tokens."},{"line_number":2863,"context_line":"        # This should be updated when token_api is updated to merge in the"},{"line_number":2864,"context_line":"        # issue_token logic from the providers (token issuance should be a"},{"line_number":2865,"context_line":"        # pipeline)."},{"line_number":2866,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":2867,"context_line":"                \u0027user\u0027: {\u0027id\u0027: user_id}}"},{"line_number":2868,"context_line":"        if tenant_id is not None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlXw%3D","line":2865,"updated":"2014-01-10 20:05:35.000000000","message":"FIXME should either be fixed or reference a bug.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":2862,"context_line":"        # FIXME(morganfainberg): These tokens look nothing like \"Real\" tokens."},{"line_number":2863,"context_line":"        # This should be updated when token_api is updated to merge in the"},{"line_number":2864,"context_line":"        # issue_token logic from the providers (token issuance should be a"},{"line_number":2865,"context_line":"        # pipeline)."},{"line_number":2866,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":2867,"context_line":"                \u0027user\u0027: {\u0027id\u0027: user_id}}"},{"line_number":2868,"context_line":"        if tenant_id is not None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fixw%3D","line":2865,"in_reply_to":"AAAAUH%2F%2FlXw%3D","updated":"2014-01-12 01:49:56.000000000","message":"Missed adding the BP here.  Will reference that.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":2872,"context_line":"        if trust_id is not None:"},{"line_number":2873,"context_line":"            data[\u0027trust_id\u0027] \u003d trust_id"},{"line_number":2874,"context_line":"            data.setdefault(\u0027access\u0027, {}).setdefault(\u0027trust\u0027, {})"},{"line_number":2875,"context_line":"            data[\u0027access\u0027][\u0027trust\u0027][\u0027trustee_user_id\u0027] \u003d \u0027testuserid2\u0027"},{"line_number":2876,"context_line":"        data[\u0027token_version\u0027] \u003d provider.V2"},{"line_number":2877,"context_line":"        data[\u0027token_data\u0027] \u003d copy.deepcopy(data)"},{"line_number":2878,"context_line":"        new_token \u003d self.token_api.create_token(token_id, data)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlXM%3D","line":2875,"updated":"2014-01-10 20:05:35.000000000","message":"why testuserid2? add a comment.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":2872,"context_line":"        if trust_id is not None:"},{"line_number":2873,"context_line":"            data[\u0027trust_id\u0027] \u003d trust_id"},{"line_number":2874,"context_line":"            data.setdefault(\u0027access\u0027, {}).setdefault(\u0027trust\u0027, {})"},{"line_number":2875,"context_line":"            data[\u0027access\u0027][\u0027trust\u0027][\u0027trustee_user_id\u0027] \u003d \u0027testuserid2\u0027"},{"line_number":2876,"context_line":"        data[\u0027token_version\u0027] \u003d provider.V2"},{"line_number":2877,"context_line":"        data[\u0027token_data\u0027] \u003d copy.deepcopy(data)"},{"line_number":2878,"context_line":"        new_token \u003d self.token_api.create_token(token_id, data)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fixo%3D","line":2875,"in_reply_to":"AAAAUH%2F%2FlXM%3D","updated":"2014-01-12 01:49:56.000000000","message":"Done","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":2874,"context_line":"            data.setdefault(\u0027access\u0027, {}).setdefault(\u0027trust\u0027, {})"},{"line_number":2875,"context_line":"            data[\u0027access\u0027][\u0027trust\u0027][\u0027trustee_user_id\u0027] \u003d \u0027testuserid2\u0027"},{"line_number":2876,"context_line":"        data[\u0027token_version\u0027] \u003d provider.V2"},{"line_number":2877,"context_line":"        data[\u0027token_data\u0027] \u003d copy.deepcopy(data)"},{"line_number":2878,"context_line":"        new_token \u003d self.token_api.create_token(token_id, data)"},{"line_number":2879,"context_line":"        return new_token[\u0027id\u0027]"},{"line_number":2880,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlW0%3D","line":2877,"updated":"2014-01-10 20:05:35.000000000","message":"data contains data? is that intentional? add a comment.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":2874,"context_line":"            data.setdefault(\u0027access\u0027, {}).setdefault(\u0027trust\u0027, {})"},{"line_number":2875,"context_line":"            data[\u0027access\u0027][\u0027trust\u0027][\u0027trustee_user_id\u0027] \u003d \u0027testuserid2\u0027"},{"line_number":2876,"context_line":"        data[\u0027token_version\u0027] \u003d provider.V2"},{"line_number":2877,"context_line":"        data[\u0027token_data\u0027] \u003d copy.deepcopy(data)"},{"line_number":2878,"context_line":"        new_token \u003d self.token_api.create_token(token_id, data)"},{"line_number":2879,"context_line":"        return new_token[\u0027id\u0027]"},{"line_number":2880,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fixs%3D","line":2877,"in_reply_to":"AAAAUH%2F%2FlW0%3D","updated":"2014-01-12 01:49:56.000000000","message":"This is expected token format, look at issue_token code.  Will add comment","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":3138,"context_line":""},{"line_number":3139,"context_line":"    def test_create_unicode_token_id(self):"},{"line_number":3140,"context_line":"        token_id \u003d unicode(self._create_token_id())"},{"line_number":3141,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":3142,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":3143,"context_line":"        self.token_api.create_token(token_id, data)"},{"line_number":3144,"context_line":"        self.token_api.get_token(token_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlWc%3D","line":3141,"updated":"2014-01-10 20:05:35.000000000","message":"isn\u0027t this exactly what create_token_sample_data does?","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":3138,"context_line":""},{"line_number":3139,"context_line":"    def test_create_unicode_token_id(self):"},{"line_number":3140,"context_line":"        token_id \u003d unicode(self._create_token_id())"},{"line_number":3141,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":3142,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":3143,"context_line":"        self.token_api.create_token(token_id, data)"},{"line_number":3144,"context_line":"        self.token_api.get_token(token_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fixg%3D","line":3141,"in_reply_to":"AAAAUH%2F%2FlWc%3D","updated":"2014-01-12 01:49:56.000000000","message":"These were moved over from the memcache tests.  I\u0027ll verify and either remove and reference create_token_sample_data.  Though, I\u0027m thinking there was a valid reason for it to be this way before.  I\u0027ll comment here or fix in the next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":3146,"context_line":"    def test_create_unicode_user_id(self):"},{"line_number":3147,"context_line":"        token_id \u003d self._create_token_id()"},{"line_number":3148,"context_line":"        user_id \u003d unicode(uuid.uuid4().hex)"},{"line_number":3149,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":3150,"context_line":"                \u0027user\u0027: {\u0027id\u0027: user_id}}"},{"line_number":3151,"context_line":"        self.token_api.create_token(token_id, data)"},{"line_number":3152,"context_line":"        self.token_api.get_token(token_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlWM%3D","line":3149,"updated":"2014-01-10 20:05:35.000000000","message":"try to use create_token_sample_data","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":3146,"context_line":"    def test_create_unicode_user_id(self):"},{"line_number":3147,"context_line":"        token_id \u003d self._create_token_id()"},{"line_number":3148,"context_line":"        user_id \u003d unicode(uuid.uuid4().hex)"},{"line_number":3149,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":3150,"context_line":"                \u0027user\u0027: {\u0027id\u0027: user_id}}"},{"line_number":3151,"context_line":"        self.token_api.create_token(token_id, data)"},{"line_number":3152,"context_line":"        self.token_api.get_token(token_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fixc%3D","line":3149,"in_reply_to":"AAAAUH%2F%2FlWM%3D","updated":"2014-01-12 01:49:56.000000000","message":"See above comment","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":3161,"context_line":"        def _create_token(expire_time):"},{"line_number":3162,"context_line":"            token_id \u003d uuid.uuid4().hex"},{"line_number":3163,"context_line":"            user_id \u003d unicode(uuid.uuid4().hex)"},{"line_number":3164,"context_line":"            data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027, \u0027user\u0027: {\u0027id\u0027: user_id},"},{"line_number":3165,"context_line":"                    \u0027expires\u0027: expire_time"},{"line_number":3166,"context_line":"                    }"},{"line_number":3167,"context_line":"            self.token_api.create_token(token_id, data)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlV4%3D","line":3164,"updated":"2014-01-10 20:05:35.000000000","message":"try to use create_token_sample_data","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":3161,"context_line":"        def _create_token(expire_time):"},{"line_number":3162,"context_line":"            token_id \u003d uuid.uuid4().hex"},{"line_number":3163,"context_line":"            user_id \u003d unicode(uuid.uuid4().hex)"},{"line_number":3164,"context_line":"            data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027, \u0027user\u0027: {\u0027id\u0027: user_id},"},{"line_number":3165,"context_line":"                    \u0027expires\u0027: expire_time"},{"line_number":3166,"context_line":"                    }"},{"line_number":3167,"context_line":"            self.token_api.create_token(token_id, data)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FixY%3D","line":3164,"in_reply_to":"AAAAUH%2F%2FlV4%3D","updated":"2014-01-12 01:49:56.000000000","message":"see above comment","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":3173,"context_line":"            data_in \u003d _create_token(expire_time)"},{"line_number":3174,"context_line":"            data_get \u003d self.token_api.get_token(data_in[\u0027id\u0027])"},{"line_number":3175,"context_line":""},{"line_number":3176,"context_line":"            self.assertIsNotNone(data_get, \"TZ\u003d%s\" % test_utils.TZ)"},{"line_number":3177,"context_line":"            self.assertEqual(data_in[\u0027id\u0027], data_get[\u0027id\u0027],"},{"line_number":3178,"context_line":"                             \u0027TZ\u003d%s\u0027 % test_utils.TZ)"},{"line_number":3179,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fla8%3D","line":3176,"updated":"2014-01-10 20:05:35.000000000","message":"the next line checks this so suggest remove this line. if data_get is None then data_get[\u0027id\u0027] will raise.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":3181,"context_line":"                timeutils.utcnow() + datetime.timedelta(minutes\u003d-1))"},{"line_number":3182,"context_line":"            data_in \u003d _create_token(expire_time_expired)"},{"line_number":3183,"context_line":"            self.assertRaises(exception.TokenNotFound,"},{"line_number":3184,"context_line":"                              self.token_api.get_token, data_in[\u0027id\u0027])"},{"line_number":3185,"context_line":""},{"line_number":3186,"context_line":""},{"line_number":3187,"context_line":"class TokenCacheInvalidation(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlVI%3D","line":3184,"updated":"2014-01-10 20:05:35.000000000","message":"can you add \"\u0027TZ\u003d%s\u0027 % test_utils.TZ\" so get a nicer message? like at 3177.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c61a7fe11b430b387c8303ed1530352563da4293","unresolved":false,"context_lines":[{"line_number":3181,"context_line":"                timeutils.utcnow() + datetime.timedelta(minutes\u003d-1))"},{"line_number":3182,"context_line":"            data_in \u003d _create_token(expire_time_expired)"},{"line_number":3183,"context_line":"            self.assertRaises(exception.TokenNotFound,"},{"line_number":3184,"context_line":"                              self.token_api.get_token, data_in[\u0027id\u0027])"},{"line_number":3185,"context_line":""},{"line_number":3186,"context_line":""},{"line_number":3187,"context_line":"class TokenCacheInvalidation(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiqE%3D","line":3184,"in_reply_to":"AAAAUH%2F%2FlVI%3D","updated":"2014-01-12 04:21:50.000000000","message":"assertRaises does not appear to take the \"msg\" parameter like some other TestCase methods.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"}],"keystone/tests/test_backend_kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003d86400)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        valid_data \u003d {\u0027id\u0027: valid_token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":114,"context_line":"                      \u0027user\u0027: {\u0027id\u0027: user_id}}"},{"line_number":115,"context_line":"        second_valid_data \u003d {\u0027id\u0027: second_valid_token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":116,"context_line":"                             \u0027user\u0027: {\u0027id\u0027: user_id}}"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlUI%3D","line":113,"updated":"2014-01-10 20:05:35.000000000","message":"can create_token_sample_data be used for these tokens?","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        expire_delta \u003d datetime.timedelta(seconds\u003d86400)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        valid_data \u003d {\u0027id\u0027: valid_token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":114,"context_line":"                      \u0027user\u0027: {\u0027id\u0027: user_id}}"},{"line_number":115,"context_line":"        second_valid_data \u003d {\u0027id\u0027: second_valid_token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":116,"context_line":"                             \u0027user\u0027: {\u0027id\u0027: user_id}}"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FixM%3D","line":113,"in_reply_to":"AAAAUH%2F%2FlUI%3D","updated":"2014-01-12 01:49:56.000000000","message":"Same as previous comments on this topic.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        # will not return any expired tokens in the list."},{"line_number":124,"context_line":"        user_key \u003d self.token_api.driver._prefix_user_id(user_id)"},{"line_number":125,"context_line":"        user_token_list \u003d self.token_api.driver._store.get(user_key)"},{"line_number":126,"context_line":"        self.assertEqual(len(user_token_list), 2)"},{"line_number":127,"context_line":"        new_expired_data \u003d (expired_token_id,"},{"line_number":128,"context_line":"                            timeutils.isotime("},{"line_number":129,"context_line":"                                (timeutils.utcnow() - expire_delta),"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlTo%3D","line":126,"updated":"2014-01-10 20:05:35.000000000","message":"if you know what the list is supposed to look like then should be able to assertEqual(user_token_list, [token_1, token_2]) then you\u0027d get more info then just the length is incorrect.\n\nThis comment applies at line 135 \u0026 142.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        # will not return any expired tokens in the list."},{"line_number":124,"context_line":"        user_key \u003d self.token_api.driver._prefix_user_id(user_id)"},{"line_number":125,"context_line":"        user_token_list \u003d self.token_api.driver._store.get(user_key)"},{"line_number":126,"context_line":"        self.assertEqual(len(user_token_list), 2)"},{"line_number":127,"context_line":"        new_expired_data \u003d (expired_token_id,"},{"line_number":128,"context_line":"                            timeutils.isotime("},{"line_number":129,"context_line":"                                (timeutils.utcnow() - expire_delta),"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FixI%3D","line":126,"in_reply_to":"AAAAUH%2F%2FlTo%3D","updated":"2014-01-12 01:49:56.000000000","message":"Sure. Will address.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"}],"keystone/tests/test_backend_memcache.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"87049b84a25a12df7d6be668340d8d02a3e3551d","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        super(MemcacheToken, self).setUp()"},{"line_number":117,"context_line":"        self.load_backends()"},{"line_number":118,"context_line":"        self.opt_in_group(\u0027token\u0027,"},{"line_number":119,"context_line":"                          driver\u003d\u0027keystone.token.backends.memcache.Token\u0027)"},{"line_number":120,"context_line":"        fake_client \u003d MemcacheClient()"},{"line_number":121,"context_line":"        self.token_man \u003d token.Manager()"},{"line_number":122,"context_line":"        self.token_man.driver \u003d token_memcache.Token(client\u003dfake_client)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F9qWg%3D","line":119,"updated":"2013-12-09 05:47:29.000000000","message":"This change is to stop trying to instantiate the manager with the new KVS system over-and-over as it will raise an exception that the KVS region is already configured.","commit_id":"b3d730e34f22a979add08cd697203050fad73033"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d0e1fbb81c02fc287614b5266f6e1cd09303c912","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        super(MemcacheToken, self).setUp()"},{"line_number":117,"context_line":"        self.load_backends()"},{"line_number":118,"context_line":"        self.opt_in_group(\u0027token\u0027,"},{"line_number":119,"context_line":"                          driver\u003d\u0027keystone.token.backends.memcache.Token\u0027)"},{"line_number":120,"context_line":"        fake_client \u003d MemcacheClient()"},{"line_number":121,"context_line":"        self.token_man \u003d token.Manager()"},{"line_number":122,"context_line":"        self.token_man.driver \u003d token_memcache.Token(client\u003dfake_client)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9eAs%3D","line":119,"updated":"2013-12-11 07:16:55.000000000","message":"whats the point of this change, looks like you remove the whole file in: https://review.openstack.org/#/c/60743/8","commit_id":"c6439f9fa35d05dbee712d4a380fdebbf708ffa0"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"394a09c0a74f17ccd6890b7136f4b71508f492ce","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        super(MemcacheToken, self).setUp()"},{"line_number":117,"context_line":"        self.load_backends()"},{"line_number":118,"context_line":"        self.opt_in_group(\u0027token\u0027,"},{"line_number":119,"context_line":"                          driver\u003d\u0027keystone.token.backends.memcache.Token\u0027)"},{"line_number":120,"context_line":"        fake_client \u003d MemcacheClient()"},{"line_number":121,"context_line":"        self.token_man \u003d token.Manager()"},{"line_number":122,"context_line":"        self.token_man.driver \u003d token_memcache.Token(client\u003dfake_client)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9dyw%3D","line":119,"in_reply_to":"AAAATn%2F9eAs%3D","updated":"2013-12-11 08:21:36.000000000","message":"Isolation of commits.  This is to make the commits more readable.  I didn\u0027t want to remove the memcache driver in the same commit as implementing the KVS change-over (think of cases of reverts, etc).","commit_id":"c6439f9fa35d05dbee712d4a380fdebbf708ffa0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        super(MemcacheToken, self).setUp()"},{"line_number":117,"context_line":"        self.load_backends()"},{"line_number":118,"context_line":"        self.opt_in_group(\u0027token\u0027,"},{"line_number":119,"context_line":"                          driver\u003d\u0027keystone.token.backends.memcache.Token\u0027)"},{"line_number":120,"context_line":"        fake_client \u003d MemcacheClient()"},{"line_number":121,"context_line":"        self.token_man \u003d token.Manager()"},{"line_number":122,"context_line":"        self.token_man.driver \u003d token_memcache.Token(client\u003dfake_client)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2Fjs%3D","line":119,"updated":"2014-01-04 14:12:07.000000000","message":"can you add a comment as to what this does? seems like this should have been done before load_backends.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"}],"keystone/token/backends/kvs.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"0711a9822b1b10a44e08f01b291c5d9f0a8f5508","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"@dependency.requires(\u0027trust_api\u0027)"},{"line_number":35,"context_line":"class Token(token.Driver):"},{"line_number":36,"context_line":"    \"\"\"KeyValueStore backend for tokens."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtmU%3D","line":34,"updated":"2014-01-03 16:32:29.000000000","message":"Discussed on IRC:  the data we want is in inside the token data already, but there is some question as to whether we will consistantly find it in the right location.  I suspectr that the lack of a \"token\" object that reflects both V2 and V3 tokens is really hurning us here.  This approach, using the token API, is probably OK.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fe6fd9623a817676f371703cf00e65dfb3e05671","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"@dependency.requires(\u0027trust_api\u0027)"},{"line_number":35,"context_line":"class Token(token.Driver):"},{"line_number":36,"context_line":"    \"\"\"KeyValueStore backend for tokens."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Fq6w%3D","line":34,"in_reply_to":"AAAAT3%2F%2FtmU%3D","updated":"2014-01-03 18:49:46.000000000","message":"Yep! Working on ensuring this is cleaned up.  I\u0027ll be hopefully posting a patchset that resolves this specific complaint shortly (and potentially doing a complete token rework to address the v2 vs v3 tokens down the line in Icehouse)","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"@dependency.requires(\u0027trust_api\u0027)"},{"line_number":35,"context_line":"class Token(token.Driver):"},{"line_number":36,"context_line":"    \"\"\"KeyValueStore backend for tokens."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    This is the base implementation for any/all key-value-stores (e.g."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2Fjo%3D","line":35,"updated":"2014-01-04 14:12:07.000000000","message":"this isn\u0027t deprecated anymore? seems like that should be mentioned in the commit message.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            return default"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def get_token(self, token_id):"},{"line_number":74,"context_line":"        if token_id is None:"},{"line_number":75,"context_line":"            raise exception.TokenNotFound(token_id\u003d\u0027\u0027)"},{"line_number":76,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"},{"line_number":77,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2Fjg%3D","line":74,"updated":"2014-01-04 14:12:07.000000000","message":"why would token_id be None here? seems like the caller could make sure the token_id is not None.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if CONF.trust.enabled and data.get(\u0027trust_id\u0027):"},{"line_number":101,"context_line":"            # NOTE(morganfainberg): If trusts are enabled and this is a trust"},{"line_number":102,"context_line":"            # scoped token, we add the token to the trustee list as well.  This"},{"line_number":103,"context_line":"            # allows password-changes of the trustee to also expire the token."},{"line_number":104,"context_line":"            # There is no harm in placing the token in multiple lists, as"},{"line_number":105,"context_line":"            # _list_tokens is smart enough to handle almost any case of"},{"line_number":106,"context_line":"            # valid/invalid/expired for a given token."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FjQ%3D","line":103,"updated":"2014-01-04 14:12:07.000000000","message":"change \"password-changes\" to \"password changes\"","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _get_user_token_list(self, user_key, include_expires\u003dFalse):"},{"line_number":116,"context_line":"        token_list \u003d self._get_key_or_default(user_key, [])"},{"line_number":117,"context_line":"        if not include_expires:"},{"line_number":118,"context_line":"            return [t[0] for t in token_list]"},{"line_number":119,"context_line":"        return token_list"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FjM%3D","line":116,"updated":"2014-01-04 14:12:07.000000000","message":"suggest change \"[]\" to \"default\u003d[]\"","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def _get_user_token_list(self, user_key, include_expires\u003dFalse):"},{"line_number":116,"context_line":"        token_list \u003d self._get_key_or_default(user_key, [])"},{"line_number":117,"context_line":"        if not include_expires:"},{"line_number":118,"context_line":"            return [t[0] for t in token_list]"},{"line_number":119,"context_line":"        return token_list"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _update_user_token_list(self, user_key, token_id, expires_isotime_str):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FjA%3D","line":118,"updated":"2014-01-04 14:12:07.000000000","message":"It looks like we\u0027re returning completely different things based on \"include_expires\". This is extra confusing, so suggest split up into separate functions.\n\nAlso, add a comment why this works... is t a tuple?","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        revoked_token_data[\u0027id\u0027] \u003d data[\u0027id\u0027]"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        token_list \u003d self._get_key_or_default(self.revocation_key, [])"},{"line_number":184,"context_line":"        if not isinstance(token_list, list):"},{"line_number":185,"context_line":"            LOG.error(_(\u0027Reinitializing revocation list due to error \u0027"},{"line_number":186,"context_line":"                        \u0027in loading revocation list from backend.  \u0027"},{"line_number":187,"context_line":"                        \u0027Expected `list` type got `%s`.\u0027), type(token_list))"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FiI%3D","line":184,"updated":"2014-01-04 14:12:07.000000000","message":"how would this happen?","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        for item in token_list:"},{"line_number":259,"context_line":"            try:"},{"line_number":260,"context_line":"                token_id, expires \u003d self._format_token_index_item(item)"},{"line_number":261,"context_line":"            except (ValueError, TypeError):"},{"line_number":262,"context_line":"                # NOTE(morganfainberg): Skip on expected errors possibilities"},{"line_number":263,"context_line":"                # from the `_format_token_index_item` method."},{"line_number":264,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2FhY%3D","line":261,"updated":"2014-01-04 14:12:07.000000000","message":"suggest put the exceptions in alphabetical order.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"161a168ae86a488643adfd89caca2e4a1452befa","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                # NOTE(morganfainberg): Token doesn\u0027t exist, skip it."},{"line_number":273,"context_line":"                continue"},{"line_number":274,"context_line":"            if token_ref:"},{"line_number":275,"context_line":"                # FIXME(morganfainberg): Extract this block of if/continue to"},{"line_number":276,"context_line":"                # something a bit easier to read/follow (e.g."},{"line_number":277,"context_line":"                # \"if self._tenant_matches(tenant_id, token_ref)\", ...)."},{"line_number":278,"context_line":"                if tenant_id is not None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2F%2Fhg%3D","line":275,"updated":"2014-01-04 14:12:07.000000000","message":"suggest take care of this FIXME now.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"0711a9822b1b10a44e08f01b291c5d9f0a8f5508","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                    if tenant.get(\u0027id\u0027) !\u003d tenant_id:"},{"line_number":283,"context_line":"                        continue"},{"line_number":284,"context_line":"                if trust_id is not None:"},{"line_number":285,"context_line":"                    trust \u003d token_ref.get(\u0027trust_id\u0027)"},{"line_number":286,"context_line":"                    if not trust:"},{"line_number":287,"context_line":"                        continue"},{"line_number":288,"context_line":"                    if trust !\u003d trust_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Frbo%3D","line":285,"updated":"2014-01-03 16:32:29.000000000","message":"To other reviewers:  this is why this class needs the trust-api:  to get the trustee id to add the token to the right list.  While this data is inside the token-data already, it is in a v2/v3 specific location, and we want to be sure to find it no matter what.","commit_id":"70b0e016b20cd722980d06229870cca612feea5e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5163fe705c53ca14ceb11763aa3943027b7eff89","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            LOG.debug(_(\u0027Invalid token entry expected tuple of \u0027"},{"line_number":261,"context_line":"                        \u0027`(\u003ctoken_id\u003e, \u003cexpires\u003e)` got: `%(item)r`\u0027),"},{"line_number":262,"context_line":"                      dict(item\u003ditem))"},{"line_number":263,"context_line":"            raise"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            expires \u003d timeutils.normalize_time("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2F0cE%3D","line":263,"updated":"2014-01-08 04:07:25.000000000","message":"Would it make sense to log something here so we know we hit a TypeError or ValueError?","commit_id":"ba06f30ed926c548217d1a307643d96462a42d41"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8f09b07d37993f5afd4f4e82a8d28a7013b7a14d","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            LOG.debug(_(\u0027Invalid token entry expected tuple of \u0027"},{"line_number":261,"context_line":"                        \u0027`(\u003ctoken_id\u003e, \u003cexpires\u003e)` got: `%(item)r`\u0027),"},{"line_number":262,"context_line":"                      dict(item\u003ditem))"},{"line_number":263,"context_line":"            raise"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            expires \u003d timeutils.normalize_time("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2Fwq8%3D","line":263,"in_reply_to":"AAAAUH%2F%2F0cE%3D","updated":"2014-01-08 19:18:54.000000000","message":"I think this log shows that, the %(item)r is a repr() so you will see what the object is.","commit_id":"ba06f30ed926c548217d1a307643d96462a42d41"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4844e05a2af2ffd38e896f5339a0f9438066310e","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            LOG.debug(_(\u0027Invalid token entry expected tuple of \u0027"},{"line_number":261,"context_line":"                        \u0027`(\u003ctoken_id\u003e, \u003cexpires\u003e)` got: `%(item)r`\u0027),"},{"line_number":262,"context_line":"                      dict(item\u003ditem))"},{"line_number":263,"context_line":"            raise"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        try:"},{"line_number":266,"context_line":"            expires \u003d timeutils.normalize_time("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2Fwlw%3D","line":263,"in_reply_to":"AAAAUH%2F%2Fwq8%3D","updated":"2014-01-08 19:33:43.000000000","message":"Ah right, I should have seen that. Thanks!","commit_id":"ba06f30ed926c548217d1a307643d96462a42d41"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ecbda0ad9fe891eb438c76f52397a32db587a1c4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- coding: utf-8 -*-"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 Metacloud, Inc."},{"line_number":4,"context_line":"# Copyright 2012 OpenStack Foundation"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FvBE%3D","line":1,"updated":"2014-01-09 02:16:21.000000000","message":"Note to reviewers: This code is closer to the memcache driver than the original KVS driver (to compare logic).  The original KVS driver didn\u0027t act like an external key-value-store and just mucked with the internal dictionary","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    This is the base implementation for any/all key-value-stores (e.g."},{"line_number":37,"context_line":"    memcached) for the Token backend.  It is recommended to only use the base"},{"line_number":38,"context_line":"    in-memory implementation for testing purposes."},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    revocation_key \u003d \u0027revocation-list\u0027"},{"line_number":41,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memory\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlO8%3D","line":38,"updated":"2014-01-10 20:05:35.000000000","message":"add a blank line after this for pep257","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    This is the base implementation for any/all key-value-stores (e.g."},{"line_number":37,"context_line":"    memcached) for the Token backend.  It is recommended to only use the base"},{"line_number":38,"context_line":"    in-memory implementation for testing purposes."},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    revocation_key \u003d \u0027revocation-list\u0027"},{"line_number":41,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memory\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FixE%3D","line":38,"in_reply_to":"AAAAUH%2F%2FlO8%3D","updated":"2014-01-12 01:49:56.000000000","message":"Done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    revocation_key \u003d \u0027revocation-list\u0027"},{"line_number":41,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memory\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, backing_store\u003dNone, **kwargs):"},{"line_number":44,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027token-driver\u0027)"},{"line_number":45,"context_line":"        if backing_store is not None:"},{"line_number":46,"context_line":"            self.kvs_backend \u003d backing_store"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlS0%3D","line":43,"updated":"2014-01-10 20:05:35.000000000","message":"why doesn\u0027t this call super().__init__?","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c61a7fe11b430b387c8303ed1530352563da4293","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    revocation_key \u003d \u0027revocation-list\u0027"},{"line_number":41,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memory\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, backing_store\u003dNone, **kwargs):"},{"line_number":44,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027token-driver\u0027)"},{"line_number":45,"context_line":"        if backing_store is not None:"},{"line_number":46,"context_line":"            self.kvs_backend \u003d backing_store"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fipg%3D","line":43,"in_reply_to":"AAAAUH%2F%2FixA%3D","updated":"2014-01-12 04:21:50.000000000","message":"There is no reason to call super() .__init__ because we don\u0027t define it on the abstract class.  I\u0027ll add it in either case for completeness.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    revocation_key \u003d \u0027revocation-list\u0027"},{"line_number":41,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memory\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, backing_store\u003dNone, **kwargs):"},{"line_number":44,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027token-driver\u0027)"},{"line_number":45,"context_line":"        if backing_store is not None:"},{"line_number":46,"context_line":"            self.kvs_backend \u003d backing_store"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FixA%3D","line":43,"in_reply_to":"AAAAUH%2F%2FlS0%3D","updated":"2014-01-12 01:49:56.000000000","message":"Let me 2x check on why.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if backing_store is not None:"},{"line_number":46,"context_line":"            self.kvs_backend \u003d backing_store"},{"line_number":47,"context_line":"        # NOTE(morganfainberg): Allow for extra configuration options to be"},{"line_number":48,"context_line":"        # passed to the KVS backend."},{"line_number":49,"context_line":"        self._store.configure(backing_store\u003dself.kvs_backend, **kwargs)"},{"line_number":50,"context_line":"        if self.__class__ \u003d\u003d Token:"},{"line_number":51,"context_line":"            # NOTE(morganfainberg): Only warn if the base KVS implementation"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlR8%3D","line":48,"updated":"2014-01-10 20:05:35.000000000","message":"suggest change \"KVS backend\" here to \"store\". This is the \"KeyValueStore backend for tokens\" according to the docstring for the class.. so the next line is passing extra config options to itself?\n\nAlternatively, it\u0027s pretty obvious what the next line is doing so not sure we need a comment here.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        if backing_store is not None:"},{"line_number":46,"context_line":"            self.kvs_backend \u003d backing_store"},{"line_number":47,"context_line":"        # NOTE(morganfainberg): Allow for extra configuration options to be"},{"line_number":48,"context_line":"        # passed to the KVS backend."},{"line_number":49,"context_line":"        self._store.configure(backing_store\u003dself.kvs_backend, **kwargs)"},{"line_number":50,"context_line":"        if self.__class__ \u003d\u003d Token:"},{"line_number":51,"context_line":"            # NOTE(morganfainberg): Only warn if the base KVS implementation"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiw8%3D","line":48,"in_reply_to":"AAAAUH%2F%2FlR8%3D","updated":"2014-01-12 01:49:56.000000000","message":"I\u0027ll remove the comment.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                       \u0027or keystone.token.backends.sql.Token instead.\u0027))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _prefix_token_id(self, token_id):"},{"line_number":60,"context_line":"        return \u0027token-%s\u0027 % token_id.encode(\u0027utf-8\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _prefix_user_id(self, user_id):"},{"line_number":63,"context_line":"        return \u0027usertokens-%s\u0027 % user_id.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlRM%3D","line":60,"updated":"2014-01-10 20:05:35.000000000","message":"why can\u0027t we have the caller (and maybe this should happen in controllers) encode the token_id as required?","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c61a7fe11b430b387c8303ed1530352563da4293","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                       \u0027or keystone.token.backends.sql.Token instead.\u0027))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _prefix_token_id(self, token_id):"},{"line_number":60,"context_line":"        return \u0027token-%s\u0027 % token_id.encode(\u0027utf-8\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _prefix_user_id(self, user_id):"},{"line_number":63,"context_line":"        return \u0027usertokens-%s\u0027 % user_id.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FipY%3D","line":60,"in_reply_to":"AAAAUH%2F%2Fiws%3D","updated":"2014-01-12 04:21:50.000000000","message":"Actually, we explicitly test for the ability to create tokens with unicode ids.  I\u0027m going to leave it based upon that we can evaluate removing this later if we decide to.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                       \u0027or keystone.token.backends.sql.Token instead.\u0027))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def _prefix_token_id(self, token_id):"},{"line_number":60,"context_line":"        return \u0027token-%s\u0027 % token_id.encode(\u0027utf-8\u0027)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _prefix_user_id(self, user_id):"},{"line_number":63,"context_line":"        return \u0027usertokens-%s\u0027 % user_id.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiws%3D","line":60,"in_reply_to":"AAAAUH%2F%2FlRM%3D","updated":"2014-01-12 01:49:56.000000000","message":"This is the same as the memcache backend. I didn\u0027t want to change this, but I don\u0027t see why we need to encode it, token id should _always_ be a byte string (uuid.uuid4().hex).  I\u0027ll 2x check and remove it if relevant.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            return default"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_token(self, token_id):"},{"line_number":72,"context_line":"        if token_id is None:"},{"line_number":73,"context_line":"            raise exception.TokenNotFound(token_id\u003d\u0027\u0027)"},{"line_number":74,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"},{"line_number":75,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Flag%3D","line":72,"updated":"2014-01-10 20:05:35.000000000","message":"why would token_id be None here? seems like the caller could make sure the token_id is not None. We don\u0027t check token_id is None on all of these function where it shouldn\u0027t be None, so pick one or the other. Or add a comment why this has to be handled differently here.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c61a7fe11b430b387c8303ed1530352563da4293","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            return default"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_token(self, token_id):"},{"line_number":72,"context_line":"        if token_id is None:"},{"line_number":73,"context_line":"            raise exception.TokenNotFound(token_id\u003d\u0027\u0027)"},{"line_number":74,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"},{"line_number":75,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiks%3D","line":72,"in_reply_to":"AAAAUH%2F%2Fiwg%3D","updated":"2014-01-12 04:21:50.000000000","message":"There are cases, it looks like where the contect[\u0027token_id\u0027] is None.  We also explicitly test for this case at http://git.openstack.org/cgit/openstack/keystone/tree/keystone/tests/test_backend.py?id\u003d4af150e58bf654d0f9d86e95d0ef625edf3698d5#n3020\n\nThe question is where do we put the validation.  I\u0027ve moved this check to the manager so we can skip a round-trip to the backend `if not token_id`.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            return default"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def get_token(self, token_id):"},{"line_number":72,"context_line":"        if token_id is None:"},{"line_number":73,"context_line":"            raise exception.TokenNotFound(token_id\u003d\u0027\u0027)"},{"line_number":74,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"},{"line_number":75,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiwg%3D","line":72,"in_reply_to":"AAAAUH%2F%2Flag%3D","updated":"2014-01-12 01:49:56.000000000","message":"This is one of those cases where there are potentials for token_id to actually be none.  I removed this and watched a ton of things explode.  I\u0027ll comment and log a bug to address this independently if it\u0027s more than some minor changes.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            raise exception.TokenNotFound(token_id\u003d\u0027\u0027)"},{"line_number":74,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            token_ref \u003d self._store.get(ptk)"},{"line_number":77,"context_line":"        except exception.NotFound:"},{"line_number":78,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlNo%3D","line":76,"updated":"2014-01-10 20:05:35.000000000","message":"if going to have a _get_key_or_default, then seems like would be nice to have a _get_key() and _set_key() to use, too.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            raise exception.TokenNotFound(token_id\u003d\u0027\u0027)"},{"line_number":74,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            token_ref \u003d self._store.get(ptk)"},{"line_number":77,"context_line":"        except exception.NotFound:"},{"line_number":78,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiwc%3D","line":76,"in_reply_to":"AAAAUH%2F%2FlNo%3D","updated":"2014-01-12 01:49:56.000000000","message":"Good point.  Done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            data_copy[\u0027user_id\u0027] \u003d data_copy[\u0027user\u0027][\u0027id\u0027]"},{"line_number":89,"context_line":"        # NOTE(morganfainberg): for ease of manipulating the data without"},{"line_number":90,"context_line":"        # concern about the backend, always store the value(s) in the"},{"line_number":91,"context_line":"        # index as the isotime (string) version so this is where the string is"},{"line_number":92,"context_line":"        # built."},{"line_number":93,"context_line":"        expires_str \u003d timeutils.isotime(data_copy[\u0027expires\u0027], subsecond\u003dTrue)"},{"line_number":94,"context_line":"        self._store.set(ptk, data_copy)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlMw%3D","line":91,"updated":"2014-01-10 20:05:35.000000000","message":"does this comment apply to the next line or all the lines after it? suggest add a break where the comment doesn\u0027t apply anymore.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            data_copy[\u0027user_id\u0027] \u003d data_copy[\u0027user\u0027][\u0027id\u0027]"},{"line_number":89,"context_line":"        # NOTE(morganfainberg): for ease of manipulating the data without"},{"line_number":90,"context_line":"        # concern about the backend, always store the value(s) in the"},{"line_number":91,"context_line":"        # index as the isotime (string) version so this is where the string is"},{"line_number":92,"context_line":"        # built."},{"line_number":93,"context_line":"        expires_str \u003d timeutils.isotime(data_copy[\u0027expires\u0027], subsecond\u003dTrue)"},{"line_number":94,"context_line":"        self._store.set(ptk, data_copy)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiwY%3D","line":91,"in_reply_to":"AAAAUH%2F%2FlMw%3D","updated":"2014-01-12 01:49:56.000000000","message":"done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        # built."},{"line_number":93,"context_line":"        expires_str \u003d timeutils.isotime(data_copy[\u0027expires\u0027], subsecond\u003dTrue)"},{"line_number":94,"context_line":"        self._store.set(ptk, data_copy)"},{"line_number":95,"context_line":"        user_id \u003d data[\u0027user\u0027][\u0027id\u0027]"},{"line_number":96,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":97,"context_line":"        self._update_user_token_list(user_key, token_id, expires_str)"},{"line_number":98,"context_line":"        if CONF.trust.enabled and data.get(\u0027trust_id\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlMU%3D","line":95,"updated":"2014-01-10 20:05:35.000000000","message":"I trust the caller has validated the data already... could have a docstring that mentions that the caller must have validated the data.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        # built."},{"line_number":93,"context_line":"        expires_str \u003d timeutils.isotime(data_copy[\u0027expires\u0027], subsecond\u003dTrue)"},{"line_number":94,"context_line":"        self._store.set(ptk, data_copy)"},{"line_number":95,"context_line":"        user_id \u003d data[\u0027user\u0027][\u0027id\u0027]"},{"line_number":96,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":97,"context_line":"        self._update_user_token_list(user_key, token_id, expires_str)"},{"line_number":98,"context_line":"        if CONF.trust.enabled and data.get(\u0027trust_id\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiwQ%3D","line":95,"in_reply_to":"AAAAUH%2F%2FlMU%3D","updated":"2014-01-12 01:49:56.000000000","message":"I will add a docstring to this effect.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            trustee_key \u003d self._prefix_user_id(trustee_user_id)"},{"line_number":118,"context_line":"            self._update_user_token_list(trustee_key, token_id, expires_str)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _get_user_token_list_with_expiry(self, user_key):"},{"line_number":123,"context_line":"        \"\"\"Return a list of tuples in the format (token_id, token_expiry) for"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlOg%3D","line":120,"updated":"2014-01-10 20:05:35.000000000","message":"how many copies do we need??\nhow many copies do we need??","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            trustee_key \u003d self._prefix_user_id(trustee_user_id)"},{"line_number":118,"context_line":"            self._update_user_token_list(trustee_key, token_id, expires_str)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def _get_user_token_list_with_expiry(self, user_key):"},{"line_number":123,"context_line":"        \"\"\"Return a list of tuples in the format (token_id, token_expiry) for"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiwM%3D","line":120,"in_reply_to":"AAAAUH%2F%2FlOg%3D","updated":"2014-01-12 01:49:56.000000000","message":"Previous behavior was to copy, and set, and copy.  I think you are correct in that this is not needed anymore.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _get_user_token_list(self, user_key):"},{"line_number":129,"context_line":"        \"\"\"Return a list of token_ids for the user_key.\"\"\""},{"line_number":130,"context_line":"        token_list \u003d self._get_key_or_default(user_key, default\u003d[])"},{"line_number":131,"context_line":"        # Each element is a tuple of (token_id, token_expiry). Most code does"},{"line_number":132,"context_line":"        # not care about the expiry, it is stripped out and only a"},{"line_number":133,"context_line":"        # list of token_ids are returned."}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlZc%3D","line":130,"updated":"2014-01-10 20:05:35.000000000","message":"suggest call _get_user_token_list_with_expiry() here rather than self._get_key_or_default to re-use code.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _get_user_token_list(self, user_key):"},{"line_number":129,"context_line":"        \"\"\"Return a list of token_ids for the user_key.\"\"\""},{"line_number":130,"context_line":"        token_list \u003d self._get_key_or_default(user_key, default\u003d[])"},{"line_number":131,"context_line":"        # Each element is a tuple of (token_id, token_expiry). Most code does"},{"line_number":132,"context_line":"        # not care about the expiry, it is stripped out and only a"},{"line_number":133,"context_line":"        # list of token_ids are returned."}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiwI%3D","line":130,"in_reply_to":"AAAAUH%2F%2FlZc%3D","updated":"2014-01-12 01:49:56.000000000","message":"good point. done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                if expires \u003c current_time:"},{"line_number":153,"context_line":"                    LOG.debug(_(\u0027Token `%(token_id)s` is expired, removing \u0027"},{"line_number":154,"context_line":"                                \u0027from `%(user_key)s`.\u0027),"},{"line_number":155,"context_line":"                              dict(token_id\u003ditem_id, user_key\u003duser_key))"},{"line_number":156,"context_line":"                    continue"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"                if item_id in revoked_token_list:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlLs%3D","line":155,"updated":"2014-01-10 20:05:35.000000000","message":"I don\u0027t think you need the dict here?\n\nalso applies at 162.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c61a7fe11b430b387c8303ed1530352563da4293","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                if expires \u003c current_time:"},{"line_number":153,"context_line":"                    LOG.debug(_(\u0027Token `%(token_id)s` is expired, removing \u0027"},{"line_number":154,"context_line":"                                \u0027from `%(user_key)s`.\u0027),"},{"line_number":155,"context_line":"                              dict(token_id\u003ditem_id, user_key\u003duser_key))"},{"line_number":156,"context_line":"                    continue"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"                if item_id in revoked_token_list:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FioI%3D","line":155,"in_reply_to":"AAAAUH%2F%2FiwE%3D","updated":"2014-01-12 04:21:50.000000000","message":"Confirmed a dict is needed, but converting to a literal.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                if expires \u003c current_time:"},{"line_number":153,"context_line":"                    LOG.debug(_(\u0027Token `%(token_id)s` is expired, removing \u0027"},{"line_number":154,"context_line":"                                \u0027from `%(user_key)s`.\u0027),"},{"line_number":155,"context_line":"                              dict(token_id\u003ditem_id, user_key\u003duser_key))"},{"line_number":156,"context_line":"                    continue"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"                if item_id in revoked_token_list:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiwE%3D","line":155,"in_reply_to":"AAAAUH%2F%2FlLs%3D","updated":"2014-01-12 01:49:56.000000000","message":"AFAIK you need a dict, not *args, i\u0027ll check but it should be a literal, not dict() if a dict is needed.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                    continue"},{"line_number":166,"context_line":"                filtered_list.append(item)"},{"line_number":167,"context_line":"            # NOTE(morganfainberg): Store the expire time to avoid needing to"},{"line_number":168,"context_line":"            # potentially expensive extra round-trips to the KVS backend."},{"line_number":169,"context_line":"            filtered_list.append((token_id, expires_isotime_str))"},{"line_number":170,"context_line":"            self._store.set(user_key, filtered_list, lock)"},{"line_number":171,"context_line":"            return filtered_list"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlLQ%3D","line":168,"updated":"2014-01-10 20:05:35.000000000","message":"this sentence doesn\u0027t make sense to me.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                    continue"},{"line_number":166,"context_line":"                filtered_list.append(item)"},{"line_number":167,"context_line":"            # NOTE(morganfainberg): Store the expire time to avoid needing to"},{"line_number":168,"context_line":"            # potentially expensive extra round-trips to the KVS backend."},{"line_number":169,"context_line":"            filtered_list.append((token_id, expires_isotime_str))"},{"line_number":170,"context_line":"            self._store.set(user_key, filtered_list, lock)"},{"line_number":171,"context_line":"            return filtered_list"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FiwA%3D","line":168,"in_reply_to":"AAAAUH%2F%2FlLQ%3D","updated":"2014-01-12 01:49:56.000000000","message":"I\u0027ll clarify, but in short, we hold onto the expiry here rather than asking memcache for each token in the loop for this method.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        if expires \u003c current_time:"},{"line_number":189,"context_line":"            LOG.warning(_(\u0027Token `%s` is expired, not adding to the \u0027"},{"line_number":190,"context_line":"                          \u0027revocation list.\u0027))"},{"line_number":191,"context_line":"            return"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        revoked_token_data[\u0027expires\u0027] \u003d timeutils.isotime(expires,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlKc%3D","line":190,"updated":"2014-01-10 20:05:35.000000000","message":"there\u0027s an argument missing here... is this not tested?","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c61a7fe11b430b387c8303ed1530352563da4293","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        if expires \u003c current_time:"},{"line_number":189,"context_line":"            LOG.warning(_(\u0027Token `%s` is expired, not adding to the \u0027"},{"line_number":190,"context_line":"                          \u0027revocation list.\u0027))"},{"line_number":191,"context_line":"            return"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        revoked_token_data[\u0027expires\u0027] \u003d timeutils.isotime(expires,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FioE%3D","line":190,"in_reply_to":"AAAAUH%2F%2Fiv4%3D","updated":"2014-01-12 04:21:50.000000000","message":"Also confirmed, log.XXX will not error if you dont supply a substitution, it will error if you supply too many substitutions.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        if expires \u003c current_time:"},{"line_number":189,"context_line":"            LOG.warning(_(\u0027Token `%s` is expired, not adding to the \u0027"},{"line_number":190,"context_line":"                          \u0027revocation list.\u0027))"},{"line_number":191,"context_line":"            return"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        revoked_token_data[\u0027expires\u0027] \u003d timeutils.isotime(expires,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiv4%3D","line":190,"in_reply_to":"AAAAUH%2F%2FlKc%3D","updated":"2014-01-12 01:49:56.000000000","message":"As i recall log isn\u0027t as picky as the raw % substitutions.  it only errors if we pass too many items, not too few.  I will fix this.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                                                          subsecond\u003dTrue)"},{"line_number":195,"context_line":"        revoked_token_data[\u0027id\u0027] \u003d data[\u0027id\u0027]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        token_list \u003d self._get_key_or_default(self.revocation_key, [])"},{"line_number":198,"context_line":"        if not isinstance(token_list, list):"},{"line_number":199,"context_line":"            # NOTE(morganfainberg): In the case that the revocation list is not"},{"line_number":200,"context_line":"            # in a format we understand, reinitialize it. This is an attempt to"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlPs%3D","line":197,"updated":"2014-01-10 20:05:35.000000000","message":"suggest change \"[]\" to \"default\u003d[]\"","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                                                          subsecond\u003dTrue)"},{"line_number":195,"context_line":"        revoked_token_data[\u0027id\u0027] \u003d data[\u0027id\u0027]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        token_list \u003d self._get_key_or_default(self.revocation_key, [])"},{"line_number":198,"context_line":"        if not isinstance(token_list, list):"},{"line_number":199,"context_line":"            # NOTE(morganfainberg): In the case that the revocation list is not"},{"line_number":200,"context_line":"            # in a format we understand, reinitialize it. This is an attempt to"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fiv0%3D","line":197,"in_reply_to":"AAAAUH%2F%2FlPs%3D","updated":"2014-01-12 01:49:56.000000000","message":"done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            # that is shared by multiple applications). Logging occurs at error"},{"line_number":204,"context_line":"            # level so that the cloud administrators have some awareness that"},{"line_number":205,"context_line":"            # the revocation_list needed to be cleared out. In all, this should"},{"line_number":206,"context_line":"            # be recoverable. Keystone cannot control external applications"},{"line_number":207,"context_line":"            # from changing a key in some backends, however, it is possible to"},{"line_number":208,"context_line":"            # gracefully handle and notify of this event."},{"line_number":209,"context_line":"            LOG.error(_(\u0027Reinitializing revocation list due to error \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlY0%3D","line":206,"updated":"2014-01-10 20:05:35.000000000","message":"this is a huge security hole.\n\nSeems like if we have to check this for revocation list then we have to check every time we get data from the store, like every time we call _get_key_or_default or _store.get()","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            # that is shared by multiple applications). Logging occurs at error"},{"line_number":204,"context_line":"            # level so that the cloud administrators have some awareness that"},{"line_number":205,"context_line":"            # the revocation_list needed to be cleared out. In all, this should"},{"line_number":206,"context_line":"            # be recoverable. Keystone cannot control external applications"},{"line_number":207,"context_line":"            # from changing a key in some backends, however, it is possible to"},{"line_number":208,"context_line":"            # gracefully handle and notify of this event."},{"line_number":209,"context_line":"            LOG.error(_(\u0027Reinitializing revocation list due to error \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fivw%3D","line":206,"in_reply_to":"AAAAUH%2F%2FlY0%3D","updated":"2014-01-12 01:49:56.000000000","message":"Well, this is the flaw with using external stores as the canonical source of tokens.  Do we want to break the revocation list completely (500 ISE) or do we want to error and set it to something useful?  We cannot solve the issue of the external store being secure/not mucked with.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                    timeutils.parse_isotime(token_data[\u0027expires\u0027]))"},{"line_number":222,"context_line":"            except ValueError:"},{"line_number":223,"context_line":"                # NOTE(morganfainberg): Invalid timestamp, don\u0027t re-add to the"},{"line_number":224,"context_line":"                # revocation-list."},{"line_number":225,"context_line":"                LOG.warning(_(\u0027Removing `%s` from revocation list due to \u0027"},{"line_number":226,"context_line":"                              \u0027invalid expires data in revocation list.\u0027),"},{"line_number":227,"context_line":"                            token_data.get(\u0027id\u0027, \u0027INVALID_TOKEN_DATA\u0027))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlKE%3D","line":224,"updated":"2014-01-10 20:05:35.000000000","message":"the log message already says this, so suggest remove the comment.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                    timeutils.parse_isotime(token_data[\u0027expires\u0027]))"},{"line_number":222,"context_line":"            except ValueError:"},{"line_number":223,"context_line":"                # NOTE(morganfainberg): Invalid timestamp, don\u0027t re-add to the"},{"line_number":224,"context_line":"                # revocation-list."},{"line_number":225,"context_line":"                LOG.warning(_(\u0027Removing `%s` from revocation list due to \u0027"},{"line_number":226,"context_line":"                              \u0027invalid expires data in revocation list.\u0027),"},{"line_number":227,"context_line":"                            token_data.get(\u0027id\u0027, \u0027INVALID_TOKEN_DATA\u0027))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fivs%3D","line":224,"in_reply_to":"AAAAUH%2F%2FlKE%3D","updated":"2014-01-12 01:49:56.000000000","message":"done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        try:"},{"line_number":254,"context_line":"            token_id, expires \u003d item"},{"line_number":255,"context_line":"        except (TypeError, ValueError):"},{"line_number":256,"context_line":"            # NOTE(morganfainberg): In this case, we either have a non"},{"line_number":257,"context_line":"            # iterable (TypeError) or too few/many values to unpack."},{"line_number":258,"context_line":"            # To avoid invalidating the entire list, just skip the"},{"line_number":259,"context_line":"            # invalid entries."}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlJI%3D","line":256,"updated":"2014-01-10 20:05:35.000000000","message":"why not put this in the log message, then don\u0027t need a comment.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        try:"},{"line_number":254,"context_line":"            token_id, expires \u003d item"},{"line_number":255,"context_line":"        except (TypeError, ValueError):"},{"line_number":256,"context_line":"            # NOTE(morganfainberg): In this case, we either have a non"},{"line_number":257,"context_line":"            # iterable (TypeError) or too few/many values to unpack."},{"line_number":258,"context_line":"            # To avoid invalidating the entire list, just skip the"},{"line_number":259,"context_line":"            # invalid entries."}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fivo%3D","line":256,"in_reply_to":"AAAAUH%2F%2FlJI%3D","updated":"2014-01-12 01:49:56.000000000","message":"Actually, i\u0027d argue the comment isn\u0027t needed.  The log already covers this (just not as verbosely).","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            # invalid entries."},{"line_number":260,"context_line":"            LOG.debug(_(\u0027Invalid token entry expected tuple of \u0027"},{"line_number":261,"context_line":"                        \u0027`(\u003ctoken_id\u003e, \u003cexpires\u003e)` got: `%(item)r`\u0027),"},{"line_number":262,"context_line":"                      dict(item\u003ditem))"},{"line_number":263,"context_line":"            raise"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlJg%3D","line":262,"updated":"2014-01-10 20:05:35.000000000","message":"another spot where I think dict can be removed?","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            # invalid entries."},{"line_number":260,"context_line":"            LOG.debug(_(\u0027Invalid token entry expected tuple of \u0027"},{"line_number":261,"context_line":"                        \u0027`(\u003ctoken_id\u003e, \u003cexpires\u003e)` got: `%(item)r`\u0027),"},{"line_number":262,"context_line":"                      dict(item\u003ditem))"},{"line_number":263,"context_line":"            raise"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fivk%3D","line":262,"in_reply_to":"AAAAUH%2F%2FlJg%3D","updated":"2014-01-12 01:49:56.000000000","message":"This can be converted to a %s, i will do so.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        except ValueError:"},{"line_number":269,"context_line":"            # NOTE(morganfainberg): ValueError here indicates the"},{"line_number":270,"context_line":"            # \"expires\" value is not isotime string format.  Remove it"},{"line_number":271,"context_line":"            # from this user list."},{"line_number":272,"context_line":"            LOG.debug(_(\u0027Invalid expires time on token `%(token_id)s`:\u0027"},{"line_number":273,"context_line":"                        \u0027 %(expires)r\u0027),"},{"line_number":274,"context_line":"                      dict(token_id\u003dtoken_id, expires\u003dexpires))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlJA%3D","line":271,"updated":"2014-01-10 20:05:35.000000000","message":"put the note in the debug log message, then don\u0027t need a comment.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        except ValueError:"},{"line_number":269,"context_line":"            # NOTE(morganfainberg): ValueError here indicates the"},{"line_number":270,"context_line":"            # \"expires\" value is not isotime string format.  Remove it"},{"line_number":271,"context_line":"            # from this user list."},{"line_number":272,"context_line":"            LOG.debug(_(\u0027Invalid expires time on token `%(token_id)s`:\u0027"},{"line_number":273,"context_line":"                        \u0027 %(expires)r\u0027),"},{"line_number":274,"context_line":"                      dict(token_id\u003dtoken_id, expires\u003dexpires))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fivg%3D","line":271,"in_reply_to":"AAAAUH%2F%2FlJA%3D","updated":"2014-01-12 01:49:56.000000000","message":"Same as above where the comment is already covered, just not as verbosely.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        return tokens"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def list_revoked_tokens(self):"},{"line_number":332,"context_line":"        revoked_token_list \u003d self._get_key_or_default(self.revocation_key, [])"},{"line_number":333,"context_line":"        if isinstance(revoked_token_list, list):"},{"line_number":334,"context_line":"            return revoked_token_list"},{"line_number":335,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlPo%3D","line":332,"updated":"2014-01-10 20:05:35.000000000","message":"suggest change \"[]\" to \"default\u003d[]\"","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        return tokens"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def list_revoked_tokens(self):"},{"line_number":332,"context_line":"        revoked_token_list \u003d self._get_key_or_default(self.revocation_key, [])"},{"line_number":333,"context_line":"        if isinstance(revoked_token_list, list):"},{"line_number":334,"context_line":"            return revoked_token_list"},{"line_number":335,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Fivc%3D","line":332,"in_reply_to":"AAAAUH%2F%2FlPo%3D","updated":"2014-01-12 01:49:56.000000000","message":"done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3f97ed97e0f1156e6ef00de40e5ee5d707c1881e","unresolved":false,"context_lines":[{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def flush_expired_tokens(self):"},{"line_number":338,"context_line":"        \"\"\"Archive or delete tokens that have expired."},{"line_number":339,"context_line":"        \"\"\""},{"line_number":340,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FlPY%3D","line":339,"updated":"2014-01-10 20:05:35.000000000","message":"put the \"\"\" on line 338 for one-line docstring.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf64d355ab02c771d66f1e6404bac0692704a2e1","unresolved":false,"context_lines":[{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def flush_expired_tokens(self):"},{"line_number":338,"context_line":"        \"\"\"Archive or delete tokens that have expired."},{"line_number":339,"context_line":"        \"\"\""},{"line_number":340,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FivY%3D","line":339,"in_reply_to":"AAAAUH%2F%2FlPY%3D","updated":"2014-01-12 01:49:56.000000000","message":"done in next patchset.","commit_id":"709168952d2c3b1e4379a2706f246bedddb94311"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f84960991940c23178a987531ad122883e008d69","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    revocation_key \u003d \u0027revocation-list\u0027"},{"line_number":42,"context_line":"    kvs_backend \u003d \u0027openstack.kvs.Memory\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, backing_store\u003dNone, **kwargs):"},{"line_number":45,"context_line":"        super(Token, self).__init__()"},{"line_number":46,"context_line":"        self._store \u003d kvs.get_key_value_store(\u0027token-driver\u0027)"},{"line_number":47,"context_line":"        if backing_store is not None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fhv4%3D","line":44,"updated":"2014-01-12 15:55:54.000000000","message":"(nit) might be useful to have a docstring... I\u0027m not sure what the type of backing_store is from looking at it. Apparently it\u0027s a string name of a class, like kvs_backend (but not called kvs_backend for some reason).","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f84960991940c23178a987531ad122883e008d69","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        \"\"\"Create a token by id and data."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        It is assumed the caller has performed data validation on the \"data\""},{"line_number":93,"context_line":"        parameter."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":96,"context_line":"        ptk \u003d self._prefix_token_id(token_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fhuw%3D","line":93,"updated":"2014-01-12 15:55:54.000000000","message":"(nit) add a blank line before \"\"\" for pep 257 (http://www.python.org/dev/peps/pep-0257/#multi-line-docstrings)","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f84960991940c23178a987531ad122883e008d69","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        \"\"\"Return a list of tuples in the format (token_id, token_expiry) for"},{"line_number":138,"context_line":"        the user_key."},{"line_number":139,"context_line":"        \"\"\""},{"line_number":140,"context_line":"        return self._get_key_or_default(user_key, default\u003d[])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _get_user_token_list(self, user_key):"},{"line_number":143,"context_line":"        \"\"\"Return a list of token_ids for the user_key.\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2FhtY%3D","line":140,"updated":"2014-01-12 15:55:54.000000000","message":"isn\u0027t this a case similar to the revoked_token_list, where it might not be a list as expected (see 210, 337)?","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"cec5ef96b74f115234c60cba2e58ea20c58d694a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        \"\"\"Return a list of tuples in the format (token_id, token_expiry) for"},{"line_number":138,"context_line":"        the user_key."},{"line_number":139,"context_line":"        \"\"\""},{"line_number":140,"context_line":"        return self._get_key_or_default(user_key, default\u003d[])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _get_user_token_list(self, user_key):"},{"line_number":143,"context_line":"        \"\"\"Return a list of token_ids for the user_key.\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2FdMw%3D","line":140,"in_reply_to":"AAAAUH%2F%2FhtY%3D","updated":"2014-01-13 17:52:33.000000000","message":"Hm, you appear to be correct here.  An issuance of a new token would resolve it but a token revocation even would not.  I\u0027ll get a subsequent patchset to address this behavior (there are a couple more patchsets involved with the kvs backends to come that depend on this one).  This is an edge-case just like the one below.","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f84960991940c23178a987531ad122883e008d69","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            # the revocation_list needed to be cleared out. In all, this should"},{"line_number":218,"context_line":"            # be recoverable. Keystone cannot control external applications"},{"line_number":219,"context_line":"            # from changing a key in some backends, however, it is possible to"},{"line_number":220,"context_line":"            # gracefully handle and notify of this event."},{"line_number":221,"context_line":"            LOG.error(_(\u0027Reinitializing revocation list due to error \u0027"},{"line_number":222,"context_line":"                        \u0027in loading revocation list from backend.  \u0027"},{"line_number":223,"context_line":"                        \u0027Expected `list` type got `%(type)s`. Old \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2FhuE%3D","line":220,"updated":"2014-01-12 15:55:54.000000000","message":"seems like every token should be revoked, since we don\u0027t know which tokens were revoked before.","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"cec5ef96b74f115234c60cba2e58ea20c58d694a","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            # the revocation_list needed to be cleared out. In all, this should"},{"line_number":218,"context_line":"            # be recoverable. Keystone cannot control external applications"},{"line_number":219,"context_line":"            # from changing a key in some backends, however, it is possible to"},{"line_number":220,"context_line":"            # gracefully handle and notify of this event."},{"line_number":221,"context_line":"            LOG.error(_(\u0027Reinitializing revocation list due to error \u0027"},{"line_number":222,"context_line":"                        \u0027in loading revocation list from backend.  \u0027"},{"line_number":223,"context_line":"                        \u0027Expected `list` type got `%(type)s`. Old \u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2FdNs%3D","line":220,"in_reply_to":"AAAAUH%2F%2FhuE%3D","updated":"2014-01-13 17:52:33.000000000","message":"Sadly, that isn\u0027t doable w/o the revocation events.  If this isn\u0027t a \"sane\" list, we can\u0027t revoke the tokens.  I think long term, revocation events solves this issue.","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f84960991940c23178a987531ad122883e008d69","unresolved":false,"context_lines":[{"line_number":334,"context_line":"    def list_revoked_tokens(self):"},{"line_number":335,"context_line":"        revoked_token_list \u003d self._get_key_or_default(self.revocation_key,"},{"line_number":336,"context_line":"                                                      default\u003d[])"},{"line_number":337,"context_line":"        if isinstance(revoked_token_list, list):"},{"line_number":338,"context_line":"            return revoked_token_list"},{"line_number":339,"context_line":"        return []"},{"line_number":340,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2Fhtk%3D","line":337,"updated":"2014-01-12 15:55:54.000000000","message":"suggest add a comment why revoked_token_list wouldn\u0027t be a list.","commit_id":"6802b24e11dde7ec77a87240ae23d0b76620512c"}]}
