)]}'
{"doc/source/configuration.rst":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":993,"context_line":"access or cleaning this table via ``keystone-manage`` so this table needs"},{"line_number":994,"context_line":"to be handled directly."},{"line_number":995,"context_line":""},{"line_number":996,"context_line":"The KVS backend only supports using ``--strategy\u003ddelete``."},{"line_number":997,"context_line":""},{"line_number":998,"context_line":"The memcache backend automatically discards expired tokens and so flushing"},{"line_number":999,"context_line":"is unnecessary."}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FWRA%3D","line":996,"updated":"2013-05-14 01:32:19.000000000","message":"Should describe what happens if you try to use --strategy\u003darchive, is it ignored or is it an error?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":993,"context_line":"access or cleaning this table via ``keystone-manage`` so this table needs"},{"line_number":994,"context_line":"to be handled directly."},{"line_number":995,"context_line":""},{"line_number":996,"context_line":"The KVS backend only supports using ``--strategy\u003ddelete``."},{"line_number":997,"context_line":""},{"line_number":998,"context_line":"The memcache backend automatically discards expired tokens and so flushing"},{"line_number":999,"context_line":"is unnecessary."}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FVHw%3D","line":996,"in_reply_to":"AAAAOn%2F%2FWRA%3D","updated":"2013-05-14 14:39:26.000000000","message":"i wouldn\u0027t even document the kvs backend here... because it\u0027s not persistent, keystone-manage can\u0027t influence it, anyway.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":996,"context_line":"The KVS backend only supports using ``--strategy\u003ddelete``."},{"line_number":997,"context_line":""},{"line_number":998,"context_line":"The memcache backend automatically discards expired tokens and so flushing"},{"line_number":999,"context_line":"is unnecessary."},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"Configuring the LDAP Identity Provider"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FWQ8%3D","line":999,"updated":"2013-05-14 01:32:19.000000000","message":"Should describe what happens if you try to token_flush when using memcache backend.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dd4783df82e08f4c4355c2351ad318c71380d070","unresolved":false,"context_lines":[{"line_number":989,"context_line":"strategy is ``archive``."},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"Only the SQL token backend has the ability to archive tokens by moving"},{"line_number":992,"context_line":"them to a table called token_archive. Currently there is no means of"},{"line_number":993,"context_line":"access or cleaning this table via ``keystone-manage`` so this table needs"},{"line_number":994,"context_line":"to be handled directly."},{"line_number":995,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"AAAAO3%2F%2F%2FKM%3D","line":992,"updated":"2013-05-15 14:34:48.000000000","message":"``token_archive``","commit_id":"81f14cdb8f5d1b1c407a290e18b36bc810f7a2fd"}],"doc/source/man/keystone-manage.rst":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":49,"context_line":"* ``import_nova_auth``: Import a dump of nova auth data into keystone."},{"line_number":50,"context_line":"* ``pki_setup``: Initialize the certificates used to sign tokens."},{"line_number":51,"context_line":"* ``ssl_setup``: Generate certificates for SSL."},{"line_number":52,"context_line":"* ``token_flush``: Purge expired tokens from the database."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"OPTIONS"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FWQ4%3D","line":52,"updated":"2013-05-14 01:32:19.000000000","message":"suggest remove \"from the database\" since kvs isn\u0027t really a database.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":49,"context_line":"* ``import_nova_auth``: Import a dump of nova auth data into keystone."},{"line_number":50,"context_line":"* ``pki_setup``: Initialize the certificates used to sign tokens."},{"line_number":51,"context_line":"* ``ssl_setup``: Generate certificates for SSL."},{"line_number":52,"context_line":"* ``token_flush``: Purge expired tokens from the database."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"OPTIONS"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FVHo%3D","line":52,"in_reply_to":"AAAAOn%2F%2FWQ4%3D","updated":"2013-05-14 14:39:26.000000000","message":"+1","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"* ``import_nova_auth``: Import a dump of nova auth data into keystone."},{"line_number":50,"context_line":"* ``pki_setup``: Initialize the certificates used to sign tokens."},{"line_number":51,"context_line":"* ``ssl_setup``: Generate certificates for SSL."},{"line_number":52,"context_line":"* ``token_flush``: Purge expired tokens from the database."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"OPTIONS"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FT6s%3D","line":52,"in_reply_to":"AAAAOn%2F%2FWQ4%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  --log-format FORMAT   A logging.Formatter log message format string which"},{"line_number":94,"context_line":"                        may use any of the available logging.LogRecord"},{"line_number":95,"context_line":"                        attributes."},{"line_number":96,"context_line":"  --log-file PATH       Name of log file to output. If not set, logging will"},{"line_number":97,"context_line":"                        go to stdout."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"FILES"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FWQ0%3D","line":96,"updated":"2013-05-14 01:32:19.000000000","message":"add the --strategy option for token_flush","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  --log-format FORMAT   A logging.Formatter log message format string which"},{"line_number":94,"context_line":"                        may use any of the available logging.LogRecord"},{"line_number":95,"context_line":"                        attributes."},{"line_number":96,"context_line":"  --log-file PATH       Name of log file to output. If not set, logging will"},{"line_number":97,"context_line":"                        go to stdout."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"FILES"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FT6M%3D","line":96,"in_reply_to":"AAAAOn%2F%2FVHc%3D","updated":"2013-05-15 02:39:06.000000000","message":"Dolph, not sure what you mean there. \n\nBrant, was going of the strategy of other keystone-manage commands. Eg ssl_setup can take a --keystone-user, --keystone-group arguments that are not documented as an option. Maybe there should be a command specific options area but i don\u0027t think i should add strategy here.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  --log-format FORMAT   A logging.Formatter log message format string which"},{"line_number":94,"context_line":"                        may use any of the available logging.LogRecord"},{"line_number":95,"context_line":"                        attributes."},{"line_number":96,"context_line":"  --log-file PATH       Name of log file to output. If not set, logging will"},{"line_number":97,"context_line":"                        go to stdout."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"FILES"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAOn%2F%2FVHc%3D","line":96,"in_reply_to":"AAAAOn%2F%2FWQ0%3D","updated":"2013-05-14 14:39:26.000000000","message":"if it shows up.. it actually shouldn\u0027t","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"}],"keystone/cli.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b79892c524077d7649e8394ce30939623093268f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                             % strategy)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        token_manager \u003d token.Manager()"},{"line_number":140,"context_line":"        token_manager.driver.flush_expired_tokens(allow_deletion)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class ImportLegacy(BaseApp):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FgKo%3D","line":140,"updated":"2013-05-07 16:08:26.000000000","message":"doesn\u0027t appear that you\u0027re using the count, so why not just remove all that?","commit_id":"7d7599dc3ae010494ce75e1ce09d0fc83d18aae1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import openssl"},{"line_number":25,"context_line":"from keystone import config"},{"line_number":26,"context_line":"from keystone import token"},{"line_number":27,"context_line":"from keystone.openstack.common import importutils"},{"line_number":28,"context_line":"from keystone.openstack.common import jsonutils"},{"line_number":29,"context_line":"from keystone.openstack.common import version"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWQk%3D","line":26,"updated":"2013-05-14 01:32:19.000000000","message":"to keep in alphabetical order, should be after keystone.common imports.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import openssl"},{"line_number":25,"context_line":"from keystone import config"},{"line_number":26,"context_line":"from keystone import token"},{"line_number":27,"context_line":"from keystone.openstack.common import importutils"},{"line_number":28,"context_line":"from keystone.openstack.common import jsonutils"},{"line_number":29,"context_line":"from keystone.openstack.common import version"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FTzg%3D","line":26,"in_reply_to":"AAAAOn%2F%2FVHU%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import openssl"},{"line_number":25,"context_line":"from keystone import config"},{"line_number":26,"context_line":"from keystone import token"},{"line_number":27,"context_line":"from keystone.openstack.common import importutils"},{"line_number":28,"context_line":"from keystone.openstack.common import jsonutils"},{"line_number":29,"context_line":"from keystone.openstack.common import version"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVHU%3D","line":26,"in_reply_to":"AAAAOn%2F%2FWQk%3D","updated":"2013-05-14 14:39:26.000000000","message":"after keystone.openstack.common **","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    @classmethod"},{"line_number":121,"context_line":"    def add_argument_parser(cls, subparsers):"},{"line_number":122,"context_line":"        parser \u003d super(TokenFlush, cls).add_argument_parser(subparsers)"},{"line_number":123,"context_line":"        parser.add_argument(\u0027--strategy\u0027)"},{"line_number":124,"context_line":"        return parser"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVHM%3D","line":123,"updated":"2013-05-14 14:39:26.000000000","message":"this should use choices http://argparse.googlecode.com/svn/trunk/doc/add_argument.html#choices","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    @classmethod"},{"line_number":121,"context_line":"    def add_argument_parser(cls, subparsers):"},{"line_number":122,"context_line":"        parser \u003d super(TokenFlush, cls).add_argument_parser(subparsers)"},{"line_number":123,"context_line":"        parser.add_argument(\u0027--strategy\u0027)"},{"line_number":124,"context_line":"        return parser"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FTzc%3D","line":123,"in_reply_to":"AAAAOn%2F%2FVHM%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            raise ValueError(\"Unknown strategy: \u0027%s\u0027. \""},{"line_number":136,"context_line":"                             \"Valid strategies are [delete, archive]\""},{"line_number":137,"context_line":"                             % strategy)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        token_manager \u003d token.Manager()"},{"line_number":140,"context_line":"        token_manager.driver.flush_expired_tokens(allow_deletion)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVHI%3D","line":137,"updated":"2013-05-14 14:39:26.000000000","message":"so that you don\u0027t have to perform your own validation","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dd4783df82e08f4c4355c2351ad318c71380d070","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from keystone.openstack.common import importutils"},{"line_number":26,"context_line":"from keystone.openstack.common import jsonutils"},{"line_number":27,"context_line":"from keystone.openstack.common import version"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from keystone import config"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAO3%2F%2F%2FJ8%3D","line":28,"updated":"2013-05-15 14:34:48.000000000","message":"erm, keystone.config was in the correct order before, and the extra line break is unnecessary (see HACKING regarding import order)","commit_id":"81f14cdb8f5d1b1c407a290e18b36bc810f7a2fd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dd4783df82e08f4c4355c2351ad318c71380d070","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    @classmethod"},{"line_number":122,"context_line":"    def add_argument_parser(cls, subparsers):"},{"line_number":123,"context_line":"        parser \u003d super(TokenFlush, cls).add_argument_parser(subparsers)"},{"line_number":124,"context_line":"        parser.add_argument(\u0027--strategy\u0027, choices\u003d(\u0027archive\u0027, \u0027delete\u0027))"},{"line_number":125,"context_line":"        return parser"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAO3%2F%2F%2FI4%3D","line":124,"updated":"2013-05-15 14:34:48.000000000","message":"if you give this a default\u003d\u0027archive\u0027 kwarg, then...","commit_id":"81f14cdb8f5d1b1c407a290e18b36bc810f7a2fd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dd4783df82e08f4c4355c2351ad318c71380d070","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    def main(cls):"},{"line_number":129,"context_line":"        strategy \u003d CONF.command.strategy"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        if strategy is None or strategy \u003d\u003d \u0027archive\u0027:"},{"line_number":132,"context_line":"            allow_deletion \u003d False"},{"line_number":133,"context_line":"        elif strategy \u003d\u003d \u0027delete\u0027:"},{"line_number":134,"context_line":"            allow_deletion \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAO3%2F%2F%2FI0%3D","line":131,"updated":"2013-05-15 14:34:48.000000000","message":"... strategy is None is not possible","commit_id":"81f14cdb8f5d1b1c407a290e18b36bc810f7a2fd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dd4783df82e08f4c4355c2351ad318c71380d070","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        elif strategy \u003d\u003d \u0027delete\u0027:"},{"line_number":134,"context_line":"            allow_deletion \u003d True"},{"line_number":135,"context_line":"        else:"},{"line_number":136,"context_line":"            raise ValueError(\"Unknown strategy: \u0027%s\u0027\" % strategy)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        token_manager \u003d token.Manager()"},{"line_number":139,"context_line":"        token_manager.driver.flush_expired_tokens(allow_deletion)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAO3%2F%2F%2FIw%3D","line":136,"updated":"2013-05-15 14:34:48.000000000","message":"and this else block is already not reachable, so please remove that","commit_id":"81f14cdb8f5d1b1c407a290e18b36bc810f7a2fd"}],"keystone/common/sql/migrate_repo/versions/023_add_token_archive.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"import sqlalchemy as sql"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWQA%3D","line":1,"updated":"2013-05-14 01:32:19.000000000","message":"should have copyright.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    table \u003d sql.Table("},{"line_number":10,"context_line":"        \u0027token_archive\u0027,"},{"line_number":11,"context_line":"        meta,"},{"line_number":12,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWP8%3D","line":12,"updated":"2013-05-14 01:32:19.000000000","message":"does this need a primary key?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    table \u003d sql.Table("},{"line_number":10,"context_line":"        \u0027token_archive\u0027,"},{"line_number":11,"context_line":"        meta,"},{"line_number":12,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FT54%3D","line":12,"in_reply_to":"AAAAOn%2F%2FVHA%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    table \u003d sql.Table("},{"line_number":10,"context_line":"        \u0027token_archive\u0027,"},{"line_number":11,"context_line":"        meta,"},{"line_number":12,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVHA%3D","line":12,"in_reply_to":"AAAAOn%2F%2FWP8%3D","updated":"2013-05-14 14:39:26.000000000","message":"good catch, i don\u0027t see a reason for one","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWOc%3D","line":15,"updated":"2013-05-14 01:32:19.000000000","message":"should be default\u003dFalse?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FT58%3D","line":15,"in_reply_to":"AAAAOn%2F%2FWOc%3D","updated":"2013-05-15 02:39:06.000000000","message":"This was just the same as the original token table. I\u0027ve removed default as this value must be set in the token table.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWPg%3D","line":16,"updated":"2013-05-14 01:32:19.000000000","message":"suggest remove nullable\u003dTrue, or use it consistenly on lines 13 and 14.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FT5s%3D","line":16,"in_reply_to":"AAAAOn%2F%2FVG0%3D","updated":"2013-05-15 02:39:06.000000000","message":"This is just the same settings as were on the original table.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":13,"context_line":"        sql.Column(\u0027expires\u0027, sql.DateTime()),"},{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVG0%3D","line":16,"in_reply_to":"AAAAOn%2F%2FWPg%3D","updated":"2013-05-14 14:39:26.000000000","message":"shouldn\u0027t this just match the primary token table?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWOg%3D","line":17,"updated":"2013-05-14 01:32:19.000000000","message":"If the columns here were in the same order as thay are in token.backends.sql TokenBase.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":14,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":15,"context_line":"        sql.Column(\u0027valid\u0027, sql.Boolean(), default\u003dTrue, nullable\u003dFalse),"},{"line_number":16,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":17,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":18,"context_line":"    table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FT5g%3D","line":17,"in_reply_to":"AAAAOn%2F%2FWOg%3D","updated":"2013-05-15 02:39:06.000000000","message":"not sure there was a question in there.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    table \u003d sql.Table(\u0027token_archive\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"    table.drop(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWPU%3D","line":26,"updated":"2013-05-14 01:32:19.000000000","message":"seems a little unsafe, since somebody might have a bunch of flushed tokens in here and now they\u0027re gone. Maybe check if it\u0027s empty first?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    table \u003d sql.Table(\u0027token_archive\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":"    table.drop(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVGc%3D","line":26,"in_reply_to":"AAAAOn%2F%2FWPU%3D","updated":"2013-05-14 14:39:26.000000000","message":"that\u0027s a much broader problem -- some downgrades are known to discard data and we\u0027ve never addressed that","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"}],"keystone/token/backends/kvs.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"07d7602bb846f6d7e852edca141adf614193220b","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            tokens.append(record)"},{"line_number":117,"context_line":"        return tokens"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def flush_expired_tokens(self, allow_deletion\u003dFalse):"},{"line_number":120,"context_line":"        now \u003d timeutils.utcnow()"},{"line_number":121,"context_line":"        count \u003d 0"},{"line_number":122,"context_line":"        for token, token_ref in self.db.items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOn%2F%2Fkmc%3D","line":119,"updated":"2013-05-03 13:59:16.000000000","message":"Not that it\u0027s possible for this to do any work in the real world from keystone-manage, but the function should only delete tokens if allow_deletion is True","commit_id":"d70bf855e64692b7ab5043879a06e3c1f1661046"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b79892c524077d7649e8394ce30939623093268f","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def flush_expired_tokens(self, allow_deletion\u003dFalse):"},{"line_number":120,"context_line":"        if not allow_deletion:"},{"line_number":121,"context_line":"            return None"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        now \u003d timeutils.utcnow()"},{"line_number":124,"context_line":"        count \u003d 0"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FgLI%3D","line":121,"updated":"2013-05-07 16:08:26.000000000","message":"similar to memcache, this should raise an exception as the specified behavior can\u0027t be achieved by the driver, so the cli should get a non-zero result","commit_id":"7d7599dc3ae010494ce75e1ce09d0fc83d18aae1"}],"keystone/token/backends/memcache.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b79892c524077d7649e8394ce30939623093268f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return []"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def flush_expired_tokens(self, allow_deletion\u003dFalse):"},{"line_number":136,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FgLU%3D","line":136,"updated":"2013-05-07 16:08:26.000000000","message":"this should probably just raise notimplemented","commit_id":"7d7599dc3ae010494ce75e1ce09d0fc83d18aae1"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"07d7602bb846f6d7e852edca141adf614193220b","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return ArchivedTokenModel.from_dict(self.to_dict())"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ArchivedTokenModel(sql.ModelBase, sql.DictBase):"},{"line_number":43,"context_line":"    __tablename__ \u003d \u0027token_archive\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027expires\u0027, \u0027user_id\u0027, \u0027trust_id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOn%2F%2Fkmg%3D","line":42,"updated":"2013-05-03 13:59:16.000000000","message":"can this inherit from TokenModel so we don\u0027t have to maintain both?","commit_id":"d70bf855e64692b7ab5043879a06e3c1f1661046"},{"author":{"_account_id":6526,"name":"David Geng","email":"gengjh@cn.ibm.com","username":"genggjh"},"change_message_id":"6ccdfc6daa6afec85c1f07f141f322490d5b5311","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"},{"line_number":163,"context_line":"                    session.delete(token_ref)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FfJE%3D","line":161,"updated":"2013-05-08 06:13:10.000000000","message":"We really need consider the performance here and use the better sql to do this. You know in our long run test environment, there are more than 144 thousand tokens, with more than 19000 non expired in the db in about 2 days (5 tenants and 300 users). \nRun the for loop to delete those expired tokens will lead the program no response long time.","commit_id":"6c3ee80dda8ae32c41376aac19773e6ac26d1329"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e10f15b249df554fe95c5d849e9b02dcde362a92","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"},{"line_number":163,"context_line":"                    session.delete(token_ref)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FejM%3D","line":161,"in_reply_to":"AAAAOn%2F%2FfF8%3D","updated":"2013-05-08 14:38:07.000000000","message":"David: this is intended to be managed periodically by cron, etc and the first issue you mentioned regarding _delete_tokens_for_user is way out of scope here","commit_id":"6c3ee80dda8ae32c41376aac19773e6ac26d1329"},{"author":{"_account_id":6526,"name":"David Geng","email":"gengjh@cn.ibm.com","username":"genggjh"},"change_message_id":"9872707f8197b7b4276b86733c710ab563f80060","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"},{"line_number":163,"context_line":"                    session.delete(token_ref)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FfF8%3D","line":161,"in_reply_to":"AAAAOn%2F%2FfHo%3D","updated":"2013-05-08 07:41:12.000000000","message":"Sorry, I missed you are running the for loop in one session, I am still fall into the bad performance when delete user since the for loop in _delete_tokens_for_user (keystone/keystone/common/controller.py) is outside the session.\n\nBut anyway, we need avoid run the for loop too many times, right? Try to insert/delete by group is better than now I think.\n\nIf you have no plan to run this automatically such as a cron job to run in the keystone main process, the performance issue should be always there.","commit_id":"6c3ee80dda8ae32c41376aac19773e6ac26d1329"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"8a105099f18531d4aa1f93735440cd87d7d2155e","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"},{"line_number":163,"context_line":"                    session.delete(token_ref)"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FfHo%3D","line":161,"in_reply_to":"AAAAOn%2F%2FfJE%3D","updated":"2013-05-08 06:41:28.000000000","message":"In my tests using add and delete within the session like this with a manual flush, sqlalchemy is smart enough to develop two large batch statements, not hundreds/thousands of inserts and deletes. \n\nI guess using the ORM here at all is an overhead, but i really don\u0027t know how much. What were you thinking, something like read in 1000 at a time and issue insert/deletes in groups?\n\nIn general I would think that performance could be maintained by simply increasing the frequency with which you ran the flush.","commit_id":"6c3ee80dda8ae32c41376aac19773e6ac26d1329"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027expires\u0027, \u0027user_id\u0027, \u0027trust_id\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":32,"context_line":"    expires \u003d sql.Column(sql.DateTime(), default\u003dNone)"},{"line_number":33,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":34,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FTz8%3D","line":31,"updated":"2013-05-15 02:39:06.000000000","message":"id doesn\u0027t have to be a primary key on the table, but it does have to be on the model. The ORM doesn\u0027t know what to do with a table without a primary key so it can issue updates.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":32,"context_line":"    expires \u003d sql.Column(sql.DateTime(), default\u003dNone)"},{"line_number":33,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":34,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":35,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":36,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWOY%3D","line":34,"updated":"2013-05-14 01:32:19.000000000","message":"for the archive table, should be default\u003dFalse?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":32,"context_line":"    expires \u003d sql.Column(sql.DateTime(), default\u003dNone)"},{"line_number":33,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":34,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":35,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":36,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FTzs%3D","line":34,"in_reply_to":"AAAAOn%2F%2FWOY%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            query \u003d session.query(TokenModel)"},{"line_number":157,"context_line":"            query \u003d query.filter(TokenModel.expires \u003c timeutils.utcnow())"},{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWOE%3D","line":159,"updated":"2013-05-14 01:32:19.000000000","message":"suggest give a name to the False paramater so reviewers know what it\u0027s for.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            query \u003d session.query(TokenModel)"},{"line_number":157,"context_line":"            query \u003d query.filter(TokenModel.expires \u003c timeutils.utcnow())"},{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FTzo%3D","line":159,"in_reply_to":"AAAAOn%2F%2FVFs%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            query \u003d session.query(TokenModel)"},{"line_number":157,"context_line":"            query \u003d query.filter(TokenModel.expires \u003c timeutils.utcnow())"},{"line_number":158,"context_line":"            if allow_deletion:"},{"line_number":159,"context_line":"                query.delete(False)"},{"line_number":160,"context_line":"            else:"},{"line_number":161,"context_line":"                for token_ref in query:"},{"line_number":162,"context_line":"                    session.add(token_ref.archive())"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVFs%3D","line":159,"in_reply_to":"AAAAOn%2F%2FWOE%3D","updated":"2013-05-14 14:39:26.000000000","message":"synchronize_session\u003dFalse","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"dd4783df82e08f4c4355c2351ad318c71380d070","unresolved":false,"context_lines":[{"line_number":49,"context_line":"class ArchivedTokenModel(TokenBase, sql.ModelBase, sql.DictBase):"},{"line_number":50,"context_line":"    __tablename__ \u003d \u0027token_archive\u0027"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    valid \u003d sql.Column(sql.Boolean())"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class Token(sql.Base, token.Driver):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAO3%2F%2F%2FIg%3D","line":52,"updated":"2013-05-15 14:34:48.000000000","message":"don\u0027t you also need to redefine the id column to not be a primary key?","commit_id":"81f14cdb8f5d1b1c407a290e18b36bc810f7a2fd"},{"author":{"_account_id":6526,"name":"David Geng","email":"gengjh@cn.ibm.com","username":"genggjh"},"change_message_id":"4ab03f7b64ee6f14b48804d297e1712192e75256","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def flush_expired_tokens(self):"},{"line_number":136,"context_line":"        session \u003d self.get_session()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        query \u003d session.query(TokenModel)"},{"line_number":139,"context_line":"        query \u003d query.filter(TokenModel.expires \u003c timeutils.utcnow())"},{"line_number":140,"context_line":"        query.delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPH%2F%2F3uE%3D","line":137,"updated":"2013-05-21 09:41:25.000000000","message":"Are you missing the \u0027with session.begin():\u0027 here?","commit_id":"ff76a1b5cd3308cfb0ce936800364e27413ed946"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"1a8984e357364e7a67cbd7a2af25c857f85b75fb","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def flush_expired_tokens(self):"},{"line_number":136,"context_line":"        session \u003d self.get_session()"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        query \u003d session.query(TokenModel)"},{"line_number":139,"context_line":"        query \u003d query.filter(TokenModel.expires \u003c timeutils.utcnow())"},{"line_number":140,"context_line":"        query.delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPH%2F%2F3pI%3D","line":137,"in_reply_to":"AAAAPH%2F%2F3uE%3D","updated":"2013-05-21 10:34:12.000000000","message":"I\u0027m pretty sure you don\u0027t need it in this case as we aren\u0027t doing transactions and building up queries, we are just running the one statement.","commit_id":"ff76a1b5cd3308cfb0ce936800364e27413ed946"}],"keystone/token/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b79892c524077d7649e8394ce30939623093268f","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        :param allow_deletion: True to permanently delete tokens"},{"line_number":195,"context_line":"        :type allow_deletion: Boolean"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        :returns: count of removed tokens or None if not supported by backend"},{"line_number":198,"context_line":"        \"\"\""},{"line_number":199,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FgK0%3D","line":197,"updated":"2013-05-07 16:08:26.000000000","message":"regarding the count- i\u0027m not 100% sure we can expect backends to return a specific number","commit_id":"7d7599dc3ae010494ce75e1ce09d0fc83d18aae1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    def flush_expired_tokens(self, allow_deletion\u003dFalse):"},{"line_number":192,"context_line":"        \"\"\"Archive or delete tokens that have expired"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        :param allow_deletion: True to permanently delete tokens"},{"line_number":195,"context_line":"        :type allow_deletion: Boolean"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWNo%3D","line":194,"updated":"2013-05-14 01:32:19.000000000","message":"seems like the parameter should make it clear not that deleting is allowed but that deleting will happen. So suggest call it \"do_delete\" or something. Also, could pass in an enumeration or constant value rather than a boolean. Consider:\n\n process_expired_tokens(ARCHIVE)\n\nor \n \n process_expired_tokens(DELETE)\n\nwould be easier to understand.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    def flush_expired_tokens(self, allow_deletion\u003dFalse):"},{"line_number":192,"context_line":"        \"\"\"Archive or delete tokens that have expired"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        :param allow_deletion: True to permanently delete tokens"},{"line_number":195,"context_line":"        :type allow_deletion: Boolean"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVDk%3D","line":194,"in_reply_to":"AAAAOn%2F%2FWNo%3D","updated":"2013-05-14 14:39:26.000000000","message":"I suggested allow_deletion at the driver layer because it\u0027s up to the driver implementation to decide if deletion is possible, not up to the external tool to dictate... e.g.: http://paste.openstack.org/raw/37237/","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"}],"tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"07d7602bb846f6d7e852edca141adf614193220b","unresolved":false,"context_lines":[{"line_number":2103,"context_line":""},{"line_number":2104,"context_line":"        self.assertIn(self.token_api.flush_expired_tokens(False), (2, None))"},{"line_number":2105,"context_line":"        tokens \u003d self.token_api.list_tokens(\u0027testuserid\u0027)"},{"line_number":2106,"context_line":"        self.assertEqual(len(tokens), 1)"},{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    def check_list_revoked_tokens(self, token_ids):"},{"line_number":2109,"context_line":"        revoked_ids \u003d [x[\u0027id\u0027] for x in self.token_api.list_revoked_tokens()]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOn%2F%2FkmA%3D","line":2106,"updated":"2013-05-03 13:59:16.000000000","message":"you could also test that token_id is in tokens","commit_id":"d70bf855e64692b7ab5043879a06e3c1f1661046"}],"tests/test_backend_kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        data_ref.pop(\u0027user_id\u0027)"},{"line_number":98,"context_line":"        self.assertDictEqual(data_ref, data)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.token_api.flush_expired_tokens(True)"},{"line_number":101,"context_line":"        tokens \u003d self.token_api.list_tokens(\u0027testuserid\u0027)"},{"line_number":102,"context_line":"        self.assertEqual(len(tokens), 1)"},{"line_number":103,"context_line":"        self.assertIn(token_id, tokens)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWNc%3D","line":100,"updated":"2013-05-14 01:32:19.000000000","message":"suggest give a name for the True argument so reviewers know what it is.","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"7599b814e610dbedf01e45afee320c8520325d2e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        data_ref.pop(\u0027user_id\u0027)"},{"line_number":98,"context_line":"        self.assertDictEqual(data_ref, data)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.token_api.flush_expired_tokens(True)"},{"line_number":101,"context_line":"        tokens \u003d self.token_api.list_tokens(\u0027testuserid\u0027)"},{"line_number":102,"context_line":"        self.assertEqual(len(tokens), 1)"},{"line_number":103,"context_line":"        self.assertIn(token_id, tokens)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FT1Y%3D","line":100,"in_reply_to":"AAAAOn%2F%2FWNc%3D","updated":"2013-05-15 02:39:06.000000000","message":"Done","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a03dfeea28adfde713fcd97153f89f14f9fcb039","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":"import datetime"},{"line_number":18,"context_line":"import nose.exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone import catalog"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2F6jg%3D","line":17,"updated":"2013-05-20 14:01:41.000000000","message":"import order","commit_id":"7d59bcfea8f24520da477cb03ce1a752d8a62118"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a03dfeea28adfde713fcd97153f89f14f9fcb039","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone import test"},{"line_number":25,"context_line":"from keystone.token.backends import kvs as token_kvs"},{"line_number":26,"context_line":"from keystone.trust.backends import kvs as trust_kvs"},{"line_number":27,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"import default_fixtures"},{"line_number":30,"context_line":"import test_backend"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2F6jc%3D","line":27,"updated":"2013-05-20 14:01:41.000000000","message":"import order","commit_id":"7d59bcfea8f24520da477cb03ce1a752d8a62118"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a03dfeea28adfde713fcd97153f89f14f9fcb039","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        super(KvsToken, self).setUp()"},{"line_number":77,"context_line":"        self.token_api \u003d token_kvs.Token(db\u003d{})"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def test_flush_expired_token(self):"},{"line_number":80,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":81,"context_line":"        expire_time \u003d timeutils.utcnow() - datetime.timedelta(minutes\u003d1)"},{"line_number":82,"context_line":"        data \u003d {\u0027id_hash\u0027: token_id, \u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAPH%2F%2F6cg%3D","line":79,"updated":"2013-05-20 14:01:41.000000000","message":"It looks like this test can be removed from KvsToken and SqlToken and moved up to test_backend.TokenTests instead? with an override for memcache tests, if necessary","commit_id":"7d59bcfea8f24520da477cb03ce1a752d8a62118"}],"tests/test_backend_sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7879ddaba48dbbedd2f04c0ed55eb98f6509dbeb","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class SqlToken(SqlTests, test_backend.TokenTests):"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def test_flush_expired_token(self):"},{"line_number":237,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":238,"context_line":"        expire_time \u003d timeutils.utcnow() - datetime.timedelta(minutes\u003d1)"},{"line_number":239,"context_line":"        data \u003d {\u0027id_hash\u0027: token_id, \u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FWMg%3D","line":236,"updated":"2013-05-14 01:32:19.000000000","message":"should this be up in TokenTests rather than in duplicated?","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7669ed67794503912fc484e8aeb93717de431f41","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"class SqlToken(SqlTests, test_backend.TokenTests):"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def test_flush_expired_token(self):"},{"line_number":237,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":238,"context_line":"        expire_time \u003d timeutils.utcnow() - datetime.timedelta(minutes\u003d1)"},{"line_number":239,"context_line":"        data \u003d {\u0027id_hash\u0027: token_id, \u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVDc%3D","line":236,"in_reply_to":"AAAAOn%2F%2FWMg%3D","updated":"2013-05-14 14:39:26.000000000","message":"the expected behavior varies per driver impl","commit_id":"11d82c0d7bc56c8f15e8b011dd337639915d5e99"}]}
