)]}'
{"nova/compute/api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"d96ed7342fb6822637455fd08004fc71d5db3f30","unresolved":false,"context_lines":[{"line_number":2519,"context_line":""},{"line_number":2520,"context_line":"        try:"},{"line_number":2521,"context_line":"            self.db.key_pair_create(context, keypair)"},{"line_number":2522,"context_line":"        except exception.DBDuplicateEntry:"},{"line_number":2523,"context_line":"            raise exception.KeyPairExists(key_name\u003dkey_name)"},{"line_number":2524,"context_line":"        return keypair"},{"line_number":2525,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FGFc%3D","line":2522,"updated":"2013-02-07 09:30:50.000000000","message":"I think that this should be in sqlalchemy.api","commit_id":"8f549ab38c3786820e195e12654e507c58933138"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"6de92ec4993fe2650b40408a656da9349c1c4162","unresolved":false,"context_lines":[{"line_number":2519,"context_line":""},{"line_number":2520,"context_line":"        try:"},{"line_number":2521,"context_line":"            self.db.key_pair_create(context, keypair)"},{"line_number":2522,"context_line":"        except exception.DBDuplicateEntry:"},{"line_number":2523,"context_line":"            raise exception.KeyPairExists(key_name\u003dkey_name)"},{"line_number":2524,"context_line":"        return keypair"},{"line_number":2525,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FGBQ%3D","line":2522,"in_reply_to":"AAAAM3%2F%2FGFc%3D","updated":"2013-02-07 10:16:50.000000000","message":"Done","commit_id":"8f549ab38c3786820e195e12654e507c58933138"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"d96ed7342fb6822637455fd08004fc71d5db3f30","unresolved":false,"context_lines":[{"line_number":2541,"context_line":"                   \u0027public_key\u0027: public_key,"},{"line_number":2542,"context_line":"                   \u0027private_key\u0027: private_key}"},{"line_number":2543,"context_line":"        try:"},{"line_number":2544,"context_line":"            self.db.key_pair_create(context, keypair)"},{"line_number":2545,"context_line":"        except exception.DBDuplicateEntry:"},{"line_number":2546,"context_line":"            raise exception.KeyPairExists(key_name\u003dkey_name)"},{"line_number":2547,"context_line":"        return keypair"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FGFY%3D","line":2544,"updated":"2013-02-07 09:30:50.000000000","message":"also","commit_id":"8f549ab38c3786820e195e12654e507c58933138"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"6de92ec4993fe2650b40408a656da9349c1c4162","unresolved":false,"context_lines":[{"line_number":2541,"context_line":"                   \u0027public_key\u0027: public_key,"},{"line_number":2542,"context_line":"                   \u0027private_key\u0027: private_key}"},{"line_number":2543,"context_line":"        try:"},{"line_number":2544,"context_line":"            self.db.key_pair_create(context, keypair)"},{"line_number":2545,"context_line":"        except exception.DBDuplicateEntry:"},{"line_number":2546,"context_line":"            raise exception.KeyPairExists(key_name\u003dkey_name)"},{"line_number":2547,"context_line":"        return keypair"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FGBM%3D","line":2544,"in_reply_to":"AAAAM3%2F%2FGFY%3D","updated":"2013-02-07 10:16:50.000000000","message":"Done","commit_id":"8f549ab38c3786820e195e12654e507c58933138"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e8f528814c48f26c2a0025e7cdf804ecbe5d92a1","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":"    def get_key_pairs(self, context, user_id):"},{"line_number":2720,"context_line":"        \"\"\"List key pairs.\"\"\""},{"line_number":2721,"context_line":"        if context.is_admin:"},{"line_number":2722,"context_line":"            context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":2723,"context_line":"        key_pairs \u003d self.db.key_pair_get_all_by_user(context, user_id)"},{"line_number":2724,"context_line":"        rval \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAANH%2F%2F%2FI0%3D","line":2721,"updated":"2013-02-28 15:00:25.000000000","message":"This will now always return deleted key pairs to an admin. I\u0027m not entirely sure how that affects things - I imagine it will affect the UI.  Even if admins want to see deleted keys (and I\u0027m not sure they do), I see a problem - you\u0027re not adding \u0027deleted\u0027 to the return value, so the caller has no way to know which key pair is deleted!\n\nThis late in grizzly, I would avoid a functional change like this which might affect UI.","commit_id":"65ea5da11143de6553b663dc0fda52d5852b8f40"},{"author":{"_account_id":1011,"name":"Tushar Patil","email":"tushar.vitthal.patil@gmail.com","username":"tpatil"},"change_message_id":"c527c736515bcd61e8d84ff70397c46a4b773893","unresolved":false,"context_lines":[{"line_number":2718,"context_line":""},{"line_number":2719,"context_line":"    def get_key_pairs(self, context, user_id):"},{"line_number":2720,"context_line":"        \"\"\"List key pairs.\"\"\""},{"line_number":2721,"context_line":"        if context.is_admin:"},{"line_number":2722,"context_line":"            context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":2723,"context_line":"        key_pairs \u003d self.db.key_pair_get_all_by_user(context, user_id)"},{"line_number":2724,"context_line":"        rval \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAANH%2F%2F%2BUk%3D","line":2721,"in_reply_to":"AAAANH%2F%2F%2FI0%3D","updated":"2013-02-28 22:21:08.000000000","message":"you are correct, this change is not needed.","commit_id":"65ea5da11143de6553b663dc0fda52d5852b8f40"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"52e39279947ae35af6342ee51934517af27d3009","unresolved":false,"context_lines":[{"line_number":1981,"context_line":"@require_context"},{"line_number":1982,"context_line":"def key_pair_get(context, user_id, name):"},{"line_number":1983,"context_line":"    nova.context.authorize_user_context(context, user_id)"},{"line_number":1984,"context_line":"    result \u003d model_query(context, models.KeyPair, read_deleted\u003d\"no\").\\"},{"line_number":1985,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":1986,"context_line":"                     filter_by(name\u003dname).\\"},{"line_number":1987,"context_line":"                     first()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BsHA%3D","line":1984,"updated":"2013-02-21 16:11:08.000000000","message":"read_deleted is no by default. Why is this necessary?","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":1981,"context_line":"@require_context"},{"line_number":1982,"context_line":"def key_pair_get(context, user_id, name):"},{"line_number":1983,"context_line":"    nova.context.authorize_user_context(context, user_id)"},{"line_number":1984,"context_line":"    result \u003d model_query(context, models.KeyPair, read_deleted\u003d\"no\").\\"},{"line_number":1985,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":1986,"context_line":"                     filter_by(name\u003dname).\\"},{"line_number":1987,"context_line":"                     first()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Bqqg%3D","line":1984,"in_reply_to":"AAAAM3%2F%2Brng%3D","updated":"2013-02-22 11:09:12.000000000","message":"Deleted keypairs will only be shown to admin context.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":1981,"context_line":"@require_context"},{"line_number":1982,"context_line":"def key_pair_get(context, user_id, name):"},{"line_number":1983,"context_line":"    nova.context.authorize_user_context(context, user_id)"},{"line_number":1984,"context_line":"    result \u003d model_query(context, models.KeyPair, read_deleted\u003d\"no\").\\"},{"line_number":1985,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":1986,"context_line":"                     filter_by(name\u003dname).\\"},{"line_number":1987,"context_line":"                     first()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Brng%3D","line":1984,"in_reply_to":"AAAAM3%2F%2BsHA%3D","updated":"2013-02-21 20:25:12.000000000","message":"As I know it is not so simple with read_deleted, if we don\u0027t use explicit read_deleted kwargs, then we will get it from context. And in context is possible to get all range of values...\n\nThis thing use strict read_deleted\u003d\"no\". \n\nProbably at this moment it is not required.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":1981,"context_line":"@require_context"},{"line_number":1982,"context_line":"def key_pair_get(context, user_id, name):"},{"line_number":1983,"context_line":"    nova.context.authorize_user_context(context, user_id)"},{"line_number":1984,"context_line":"    result \u003d model_query(context, models.KeyPair, read_deleted\u003d\"no\").\\"},{"line_number":1985,"context_line":"                     filter_by(user_id\u003duser_id).\\"},{"line_number":1986,"context_line":"                     filter_by(name\u003dname).\\"},{"line_number":1987,"context_line":"                     first()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Bqqk%3D","line":1984,"in_reply_to":"AAAAM3%2F%2BsHA%3D","updated":"2013-02-22 11:09:12.000000000","message":"Done","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"23329af33e3b06efaa471e8be783aa35133abc83","unresolved":false,"context_lines":[{"line_number":1951,"context_line":"        key_pair_ref.update(values)"},{"line_number":1952,"context_line":"        key_pair_ref.save()"},{"line_number":1953,"context_line":"        return key_pair_ref"},{"line_number":1954,"context_line":"    except db_session.DBDuplicateEntry:"},{"line_number":1955,"context_line":"        raise exception.KeyPairExists(key_name\u003dvalues[\u0027name\u0027])"},{"line_number":1956,"context_line":""},{"line_number":1957,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAANH%2F%2F%2FZM%3D","line":1954,"updated":"2013-02-28 07:21:49.000000000","message":"This should be db_exc.DBDuplicateEntry","commit_id":"21088bc92abc6394aca48bc419e3483b87a72817"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c587a984693b321239f7b79cb6da7d9e661869f7","unresolved":false,"context_lines":[{"line_number":1990,"context_line":"@require_context"},{"line_number":1991,"context_line":"def key_pair_get_all_by_user(context, user_id):"},{"line_number":1992,"context_line":"    nova.context.authorize_user_context(context, user_id)"},{"line_number":1993,"context_line":"    return model_query(context, models.KeyPair).\\"},{"line_number":1994,"context_line":"                   filter_by(user_id\u003duser_id).\\"},{"line_number":1995,"context_line":"                   all()"},{"line_number":1996,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAOH%2F%2FxsE%3D","line":1993,"updated":"2013-03-27 22:49:08.000000000","message":"why do you remove this \"read_deleted\u003dno\" ...","commit_id":"87177f0d22d5873964616d40f591b0199d37a3d2"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c587a984693b321239f7b79cb6da7d9e661869f7","unresolved":false,"context_lines":[{"line_number":1997,"context_line":""},{"line_number":1998,"context_line":"def key_pair_count_by_user(context, user_id):"},{"line_number":1999,"context_line":"    nova.context.authorize_user_context(context, user_id)"},{"line_number":2000,"context_line":"    return model_query(context, models.KeyPair, read_deleted\u003d\"no\").\\"},{"line_number":2001,"context_line":"                   filter_by(user_id\u003duser_id).\\"},{"line_number":2002,"context_line":"                   count()"},{"line_number":2003,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAOH%2F%2Fxr8%3D","line":2000,"updated":"2013-03-27 22:49:08.000000000","message":"... and not this one?","commit_id":"87177f0d22d5873964616d40f591b0199d37a3d2"}],"nova/db/sqlalchemy/migrate_repo/versions/158_add_unique_constraint_to_key_pairs.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"cd3bfedd0f5f653f7732bcf3210d1434226f54fb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            \"\"\" % TABLE_NAME"},{"line_number":42,"context_line":"            LOG.warning(msg, unicode(ex))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"            if migrate_engine.name in \u0027sqlite\u0027:"},{"line_number":45,"context_line":"                _remove_temp_table_sqlite(meta)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"            _rename_duplicate_keypairs(migrate_engine, meta, t)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2Bu%2Fo%3D","line":44,"updated":"2013-02-20 12:13:56.000000000","message":"Here is typo/bug\nmigrate_engine.name in [\u0027sqlite\u0027]\notherwise you will search that name in in [\u0027s\u0027,\u0027q\u0027,\u0027l\u0027,\u0027i\u0027,\u0027t\u0027,\u0027e\u0027]","commit_id":"b493e7a62025640ebd98e8d889ad0a7774267b73"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"da01fd8dee16cffb4b9fa0f3cb1bad7158db939f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            \"\"\" % TABLE_NAME"},{"line_number":42,"context_line":"            LOG.warning(msg, unicode(ex))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"            if migrate_engine.name in \u0027sqlite\u0027:"},{"line_number":45,"context_line":"                _remove_temp_table_sqlite(meta)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"            _rename_duplicate_keypairs(migrate_engine, meta, t)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2Bu%2FU%3D","line":44,"in_reply_to":"AAAAM3%2F%2Bu%2Fo%3D","updated":"2013-02-20 13:01:52.000000000","message":"Done","commit_id":"b493e7a62025640ebd98e8d889ad0a7774267b73"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"c2d65c79616ccdfc116f75c34dd9d36ce9fe1457","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            if migrate_engine.name in \u0027sqlite\u0027:"},{"line_number":45,"context_line":"                _remove_temp_table_sqlite(meta)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"            _rename_duplicate_keypairs(migrate_engine, meta, t)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _create_temp_table(migrate_engine, meta, columns, constraints):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2BvAM%3D","line":47,"updated":"2013-02-20 12:06:13.000000000","message":"nit, if this comes up for review again, please put a comment here that the constraint is now built on a temp table.","commit_id":"b493e7a62025640ebd98e8d889ad0a7774267b73"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"da01fd8dee16cffb4b9fa0f3cb1bad7158db939f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            if migrate_engine.name in \u0027sqlite\u0027:"},{"line_number":45,"context_line":"                _remove_temp_table_sqlite(meta)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"            _rename_duplicate_keypairs(migrate_engine, meta, t)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _create_temp_table(migrate_engine, meta, columns, constraints):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAM3%2F%2Bu%2FQ%3D","line":47,"in_reply_to":"AAAAM3%2F%2BvAM%3D","updated":"2013-02-20 13:01:52.000000000","message":"Done","commit_id":"b493e7a62025640ebd98e8d889ad0a7774267b73"}],"nova/db/sqlalchemy/migrate_repo/versions/159_add_unique_constraint_to_key_pairs.py":[{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"52e39279947ae35af6342ee51934517af27d3009","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UNIQUE_CONSTRAINT_NAME \u003d \u0027key_pairs_uniq_name_and_user_id\u0027"},{"line_number":25,"context_line":"TABLE_NAME \u003d \u0027key_pairs\u0027"},{"line_number":26,"context_line":"UNIQUE_CONSTRAINT_COLUMNS \u003d [\u0027name\u0027, \u0027user_id\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BsHI%3D","line":26,"updated":"2013-02-21 16:11:08.000000000","message":"why not put [\u0027deleted\u0027] here?","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"432ebd40b11587658952418b281be7489f2a1079","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UNIQUE_CONSTRAINT_NAME \u003d \u0027key_pairs_uniq_name_and_user_id\u0027"},{"line_number":25,"context_line":"TABLE_NAME \u003d \u0027key_pairs\u0027"},{"line_number":26,"context_line":"UNIQUE_CONSTRAINT_COLUMNS \u003d [\u0027name\u0027, \u0027user_id\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BrjI%3D","line":26,"in_reply_to":"AAAAM3%2F%2Brog%3D","updated":"2013-02-21 20:46:35.000000000","message":"ah i see thanks.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UNIQUE_CONSTRAINT_NAME \u003d \u0027key_pairs_uniq_name_and_user_id\u0027"},{"line_number":25,"context_line":"TABLE_NAME \u003d \u0027key_pairs\u0027"},{"line_number":26,"context_line":"UNIQUE_CONSTRAINT_COLUMNS \u003d [\u0027name\u0027, \u0027user_id\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Brog%3D","line":26,"in_reply_to":"AAAAM3%2F%2BsHI%3D","updated":"2013-02-21 20:25:12.000000000","message":"In current key-pair implementation we are removing from DB rows. So it is possible to avoid using of deleted column in UC. \n\nI think that this solution has better for performance...","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    t \u003d Table(TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":32,"context_line":"    # During migration we don\u0027t get default values from the models."},{"line_number":33,"context_line":"    # Making sure that \"deleted\" column\u0027s default value is 0."},{"line_number":34,"context_line":"    t.update().where(t.c.deleted \u003d\u003d None).values(deleted\u003d0).execute()"},{"line_number":35,"context_line":"    sqlalchemy_utils.drop_old_duplicate_entries_from_table(migrate_engine,"},{"line_number":36,"context_line":"                                                TABLE_NAME, True,"},{"line_number":37,"context_line":"                                                *UNIQUE_CONSTRAINT_COLUMNS)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Brlo%3D","line":34,"updated":"2013-02-21 20:25:12.000000000","message":"In production: deleted column will be 0 so this is useless.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    t \u003d Table(TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":32,"context_line":"    # During migration we don\u0027t get default values from the models."},{"line_number":33,"context_line":"    # Making sure that \"deleted\" column\u0027s default value is 0."},{"line_number":34,"context_line":"    t.update().where(t.c.deleted \u003d\u003d None).values(deleted\u003d0).execute()"},{"line_number":35,"context_line":"    sqlalchemy_utils.drop_old_duplicate_entries_from_table(migrate_engine,"},{"line_number":36,"context_line":"                                                TABLE_NAME, True,"},{"line_number":37,"context_line":"                                                *UNIQUE_CONSTRAINT_COLUMNS)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BqqY%3D","line":34,"in_reply_to":"AAAAM3%2F%2Brlo%3D","updated":"2013-02-22 11:09:12.000000000","message":"Done","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                                TABLE_NAME, True,"},{"line_number":37,"context_line":"                                                *UNIQUE_CONSTRAINT_COLUMNS)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    uc \u003d UniqueConstraint(*(UNIQUE_CONSTRAINT_COLUMNS + [\u0027deleted\u0027]), table\u003dt,"},{"line_number":40,"context_line":"                           name\u003dUNIQUE_CONSTRAINT_NAME)"},{"line_number":41,"context_line":"    uc.create()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BrlY%3D","line":39,"updated":"2013-02-21 20:25:12.000000000","message":"I\u0027am not sure that we should use \u0027deleted\u0027 column in UC.d","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                                TABLE_NAME, True,"},{"line_number":37,"context_line":"                                                *UNIQUE_CONSTRAINT_COLUMNS)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    uc \u003d UniqueConstraint(*(UNIQUE_CONSTRAINT_COLUMNS + [\u0027deleted\u0027]), table\u003dt,"},{"line_number":40,"context_line":"                           name\u003dUNIQUE_CONSTRAINT_NAME)"},{"line_number":41,"context_line":"    uc.create()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Bqqc%3D","line":39,"in_reply_to":"AAAAM3%2F%2Brig%3D","updated":"2013-02-22 11:09:12.000000000","message":"Done","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"5803e44531ad003bdd349952f980ce1de8961cda","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                                TABLE_NAME, True,"},{"line_number":37,"context_line":"                                                *UNIQUE_CONSTRAINT_COLUMNS)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    uc \u003d UniqueConstraint(*(UNIQUE_CONSTRAINT_COLUMNS + [\u0027deleted\u0027]), table\u003dt,"},{"line_number":40,"context_line":"                           name\u003dUNIQUE_CONSTRAINT_NAME)"},{"line_number":41,"context_line":"    uc.create()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Brig%3D","line":39,"in_reply_to":"AAAAM3%2F%2BrjE%3D","updated":"2013-02-21 20:52:09.000000000","message":"Ok if we want to do this, then we should also change \nkey_pair_destroy method to do soft_delete and not real delete.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":67,"name":"Vish Ishaya","email":"vishvananda@gmail.com","username":"vishvananda"},"change_message_id":"432ebd40b11587658952418b281be7489f2a1079","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                                TABLE_NAME, True,"},{"line_number":37,"context_line":"                                                *UNIQUE_CONSTRAINT_COLUMNS)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    uc \u003d UniqueConstraint(*(UNIQUE_CONSTRAINT_COLUMNS + [\u0027deleted\u0027]), table\u003dt,"},{"line_number":40,"context_line":"                           name\u003dUNIQUE_CONSTRAINT_NAME)"},{"line_number":41,"context_line":"    uc.create()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BrjE%3D","line":39,"in_reply_to":"AAAAM3%2F%2BrlY%3D","updated":"2013-02-21 20:46:35.000000000","message":"I still think we should use the deleted column and switch to soft-deleting the keypairs. We should be consistent and do this the same way for everything.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def downgrade(migrate_engine):"},{"line_number":45,"context_line":"    sqlalchemy_utils.drop_unique_constraint(migrate_engine, TABLE_NAME,"},{"line_number":46,"context_line":"                                            UNIQUE_CONSTRAINT_NAME)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BrlU%3D","line":45,"updated":"2013-02-21 20:25:12.000000000","message":"To drop this UC in postgresql and mysql you should pass the argument *columns (that are in UC)","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def downgrade(migrate_engine):"},{"line_number":45,"context_line":"    sqlalchemy_utils.drop_unique_constraint(migrate_engine, TABLE_NAME,"},{"line_number":46,"context_line":"                                            UNIQUE_CONSTRAINT_NAME)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BqqU%3D","line":45,"in_reply_to":"AAAAM3%2F%2BrlU%3D","updated":"2013-02-22 11:09:12.000000000","message":"Done","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"596f24486a5a4e54dde4c1d0354badd1d0eb8c48","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UC_NAME \u003d \u0027key_pairs_uniq_name_and_user_id\u0027"},{"line_number":25,"context_line":"TABLE_NAME \u003d \u0027key_pairs\u0027"},{"line_number":26,"context_line":"UC_COLUMNS \u003d [\u0027name\u0027, \u0027user_id\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2BqeA%3D","line":26,"updated":"2013-02-22 11:41:56.000000000","message":"I think that you should add \u0027deleted\u0027 in UC columns..","commit_id":"36a3b538aa6d3bc9bd65ac7b445e6d2561ce8d8b"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"d28cf992b04556e43b46c66a4fcee0b5728a3541","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UC_NAME \u003d \u0027key_pairs_uniq_name_and_user_id\u0027"},{"line_number":25,"context_line":"TABLE_NAME \u003d \u0027key_pairs\u0027"},{"line_number":26,"context_line":"UC_COLUMNS \u003d [\u0027name\u0027, \u0027user_id\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2BqYE%3D","line":26,"in_reply_to":"AAAAM3%2F%2BqeA%3D","updated":"2013-02-22 12:42:57.000000000","message":"I dont think \"deleted\" is required in UC columns while dropping duplicate entries. Because currently in production before this migration, we arent soft deleting the keypairs, hence \"deleted\" will always be 0 for this migration in production. We only need \"name\", \"user_id\" to uniquely identify duplicates.","commit_id":"36a3b538aa6d3bc9bd65ac7b445e6d2561ce8d8b"}],"nova/db/sqlalchemy/migrate_repo/versions/172_add_unique_constraint_to_key_pairs.py":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"c587a984693b321239f7b79cb6da7d9e661869f7","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"UC_NAME \u003d \u0027key_pairs_uniq_name_and_user_id\u0027"},{"line_number":25,"context_line":"TABLE_NAME \u003d \u0027key_pairs\u0027"},{"line_number":26,"context_line":"UC_COLUMNS \u003d [\u0027name\u0027, \u0027user_id\u0027, \u0027deleted\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAOH%2F%2Fxrs%3D","line":26,"updated":"2013-03-27 22:49:08.000000000","message":"There are two methods which query by only user_id, and some which query by both user_id and name.\n\nPlease reverse the order of columns here so that this index can be used by all the key_pair_*_get methods. This line should read:\n\n  UC_COLUMNS \u003d [\u0027user_id\u0027, \u0027name\u0027, \u0027deleted\u0027]\n\nAlso, this matches an existing (non-unique) index on the table, which should be dropped in this migration. That index is created in 133_folsom and is named key_pair_user_id_name_idx.","commit_id":"87177f0d22d5873964616d40f591b0199d37a3d2"}],"nova/tests/test_db_api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1084,"context_line":"        values \u003d {\u0027name\u0027: \u0027test_keypair\u0027, \u0027public_key\u0027: \u0027test-public-key\u0027,"},{"line_number":1085,"context_line":"                \u0027user_id\u0027: \u0027test_user_id\u0027, \u0027fingerprint\u0027: \u0027test_fingerprint\u0027,"},{"line_number":1086,"context_line":"                \u0027deleted\u0027: 1}"},{"line_number":1087,"context_line":"        keypair \u003d db.key_pair_create(ctxt, values)"},{"line_number":1088,"context_line":"        self.assertRaises(exception.KeypairNotFound, db.key_pair_get, ctxt,"},{"line_number":1089,"context_line":"                          keypair[\u0027user_id\u0027], keypair[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2BroM%3D","line":1086,"updated":"2013-02-21 20:25:12.000000000","message":"Oh this is bad...\nI am not sure that this test is required.\n+ deleted should be set to `id` value not not default..","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1084,"context_line":"        values \u003d {\u0027name\u0027: \u0027test_keypair\u0027, \u0027public_key\u0027: \u0027test-public-key\u0027,"},{"line_number":1085,"context_line":"                \u0027user_id\u0027: \u0027test_user_id\u0027, \u0027fingerprint\u0027: \u0027test_fingerprint\u0027,"},{"line_number":1086,"context_line":"                \u0027deleted\u0027: 1}"},{"line_number":1087,"context_line":"        keypair \u003d db.key_pair_create(ctxt, values)"},{"line_number":1088,"context_line":"        self.assertRaises(exception.KeypairNotFound, db.key_pair_get, ctxt,"},{"line_number":1089,"context_line":"                          keypair[\u0027user_id\u0027], keypair[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Bqp4%3D","line":1086,"in_reply_to":"AAAAM3%2F%2BroM%3D","updated":"2013-02-22 11:09:12.000000000","message":"Fixed the testcase , now testing for soft_deleted in key_pairs_destroy too.","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"55e6f2aeb63326a17e3ce8a7953b957da0437d0c","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"            self.assertTrue(keypair[\u0027deleted\u0027] in expected_deleted_ids)"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    def test_key_pair_soft_delete(self):"},{"line_number":1127,"context_line":"        # Test key pair soft delete"},{"line_number":1128,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1129,"context_line":"        keypair_values \u003d {\u0027name\u0027: \u0027test_keypair\u0027,"},{"line_number":1130,"context_line":"                          \u0027public_key\u0027: \u0027test-public-key1\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2BkTg%3D","line":1127,"updated":"2013-02-27 05:17:48.000000000","message":"It seems that everything this test does is also done by test admin get deleted. So this test seems unnecessary.","commit_id":"36a3b538aa6d3bc9bd65ac7b445e6d2561ce8d8b"}],"nova/tests/test_migrations.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"99604ff731db3359c9884d2f72b0620ba9103fea","unresolved":false,"context_lines":[{"line_number":22,"context_line":"the test case runs a series of test cases to ensure that migrations work"},{"line_number":23,"context_line":"properly both upgrading and downgrading, and that no data loss occurs"},{"line_number":24,"context_line":"if possible."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"There are also \"opportunistic\" tests for both mysql and postgresql in here,"},{"line_number":27,"context_line":"which allows testing against all 3 databases (sqlite in memory, mysql, pg) in"},{"line_number":28,"context_line":"a properly configured unit test environment."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FGA0%3D","side":"PARENT","line":25,"updated":"2013-02-07 10:23:50.000000000","message":"Also rebase problems?","commit_id":"3fd1c63e37436eaf4621df62f112ae1886d238cc"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"028ee131c73ba4c3bdabc4e54f0719fffeb3bee1","unresolved":false,"context_lines":[{"line_number":22,"context_line":"the test case runs a series of test cases to ensure that migrations work"},{"line_number":23,"context_line":"properly both upgrading and downgrading, and that no data loss occurs"},{"line_number":24,"context_line":"if possible."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"There are also \"opportunistic\" tests for both mysql and postgresql in here,"},{"line_number":27,"context_line":"which allows testing against all 3 databases (sqlite in memory, mysql, pg) in"},{"line_number":28,"context_line":"a properly configured unit test environment."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FF%2Fg%3D","side":"PARENT","line":25,"in_reply_to":"AAAAM3%2F%2FGA0%3D","updated":"2013-02-07 10:43:28.000000000","message":"Done","commit_id":"3fd1c63e37436eaf4621df62f112ae1886d238cc"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"99604ff731db3359c9884d2f72b0620ba9103fea","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":"    if backend \u003d\u003d \"postgres\":"},{"line_number":71,"context_line":"        backend \u003d \"postgresql+psycopg2\""},{"line_number":72,"context_line":"    elif backend \u003d\u003d \"mysql\":"},{"line_number":73,"context_line":"        backend \u003d \"mysql+mysqldb\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    return (\"%(backend)s://%(user)s:%(passwd)s@localhost/%(database)s\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FGAs%3D","side":"PARENT","line":72,"updated":"2013-02-07 10:23:50.000000000","message":"and here, and below..","commit_id":"3fd1c63e37436eaf4621df62f112ae1886d238cc"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"028ee131c73ba4c3bdabc4e54f0719fffeb3bee1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    \"\"\""},{"line_number":70,"context_line":"    if backend \u003d\u003d \"postgres\":"},{"line_number":71,"context_line":"        backend \u003d \"postgresql+psycopg2\""},{"line_number":72,"context_line":"    elif backend \u003d\u003d \"mysql\":"},{"line_number":73,"context_line":"        backend \u003d \"mysql+mysqldb\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    return (\"%(backend)s://%(user)s:%(passwd)s@localhost/%(database)s\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FF%2Fc%3D","side":"PARENT","line":72,"in_reply_to":"AAAAM3%2F%2FGAs%3D","updated":"2013-02-07 10:43:28.000000000","message":"Done","commit_id":"3fd1c63e37436eaf4621df62f112ae1886d238cc"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"6eab10a0b6d9fd40dce5d687beed53073a107eca","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    # migration 159, add unique constraint to keypairs"},{"line_number":892,"context_line":"    def _prerun_159(self, engine):"},{"line_number":893,"context_line":"        created_at \u003d [datetime.datetime.now() for x in range(0, 7)]"},{"line_number":894,"context_line":"        fake_keypairs \u003d [dict(name\u003d\u0027key1\u0027, user_id\u003d\u00271a\u0027,"},{"line_number":895,"context_line":"                              created_at\u003dcreated_at[0]),"},{"line_number":896,"context_line":"                        dict(name\u003d\u0027key1\u0027, user_id\u003d\u00271a\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Brmg%3D","line":893,"updated":"2013-02-21 20:25:12.000000000","message":"You should insert here explicit deleted\u003d0, because default values are not populated by DB, only by sqlalchemy and only when we are using models.\n\nThe reason of such strange behavior is next:\n1) Info about default values are stored only in Models (not in DB)\n\n2) Table autoload gets info from DB not models.\n\n----\n\nHm as I know sqlalchemy is not able to make both bulk inserts and generate ID columns..","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6124,"name":"Rohan Kanade","email":"openstack@rohankanade.com","username":"kanaderohan"},"change_message_id":"92e8eb0eeb0bd1bdd6dbfef0e1f6c2b77b213920","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    # migration 159, add unique constraint to keypairs"},{"line_number":892,"context_line":"    def _prerun_159(self, engine):"},{"line_number":893,"context_line":"        created_at \u003d [datetime.datetime.now() for x in range(0, 7)]"},{"line_number":894,"context_line":"        fake_keypairs \u003d [dict(name\u003d\u0027key1\u0027, user_id\u003d\u00271a\u0027,"},{"line_number":895,"context_line":"                              created_at\u003dcreated_at[0]),"},{"line_number":896,"context_line":"                        dict(name\u003d\u0027key1\u0027, user_id\u003d\u00271a\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAM3%2F%2Bqp0%3D","line":893,"in_reply_to":"AAAAM3%2F%2Brmg%3D","updated":"2013-02-22 11:09:12.000000000","message":"Done","commit_id":"ee00cf810b52396be71dcc8a9b88ee7b59354fbe"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"596f24486a5a4e54dde4c1d0354badd1d0eb8c48","unresolved":false,"context_lines":[{"line_number":919,"context_line":"    def _check_159(self, engine, data):"},{"line_number":920,"context_line":"        # Unique constraints are not listed in table.constraints for any db."},{"line_number":921,"context_line":"        # So, simply add a duplicate keypair to check if unique constraint is"},{"line_number":922,"context_line":"        # is applied to the key_pairs table or not."},{"line_number":923,"context_line":"        keypairs \u003d get_table(engine, \u0027key_pairs\u0027)"},{"line_number":924,"context_line":"        insert \u003d keypairs.insert()"},{"line_number":925,"context_line":"        key_pair \u003d dict(name\u003d\u0027key6\u0027, user_id\u003d\u00276a\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2Bqf4%3D","line":922,"updated":"2013-02-22 11:41:56.000000000","message":"I think that you should compare len(of rows that are not deleted) with expected value..\nJust to be sure that all is ok.","commit_id":"36a3b538aa6d3bc9bd65ac7b445e6d2561ce8d8b"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"55e6f2aeb63326a17e3ce8a7953b957da0437d0c","unresolved":false,"context_lines":[{"line_number":919,"context_line":"    def _check_159(self, engine, data):"},{"line_number":920,"context_line":"        # Unique constraints are not listed in table.constraints for any db."},{"line_number":921,"context_line":"        # So, simply add a duplicate keypair to check if unique constraint is"},{"line_number":922,"context_line":"        # is applied to the key_pairs table or not."},{"line_number":923,"context_line":"        keypairs \u003d get_table(engine, \u0027key_pairs\u0027)"},{"line_number":924,"context_line":"        insert \u003d keypairs.insert()"},{"line_number":925,"context_line":"        key_pair \u003d dict(name\u003d\u0027key6\u0027, user_id\u003d\u00276a\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2BkTQ%3D","line":922,"in_reply_to":"AAAAM3%2F%2Bqf4%3D","updated":"2013-02-27 05:17:48.000000000","message":"++\n\nThe check for this migration should ensure that duplicates that might have snuck in were removed","commit_id":"36a3b538aa6d3bc9bd65ac7b445e6d2561ce8d8b"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"99e2f0a8cd56b0377aaf18942abd88f192848dfc","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        # the previous (higher numbered) migration."},{"line_number":404,"context_line":"        post_downgrade \u003d getattr("},{"line_number":405,"context_line":"                self, \"_post_downgrade_%d\" % (version + 1), None)"},{"line_number":406,"context_line":"        if post_downgrade:"},{"line_number":407,"context_line":"            post_downgrade(engine)"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def _migrate_up(self, engine, version, with_data\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2Bjf8%3D","side":"PARENT","line":406,"updated":"2013-02-27 16:10:15.000000000","message":"and why remove the post_downgrade check?","commit_id":"907594ec28193a1ba9fdaf7420b153433e7ea47b"},{"author":{"_account_id":5174,"name":"Mauro Sergio Martins Rodrigues","email":"maurosr@linux.vnet.ibm.com","username":"maurosr"},"change_message_id":"ccad4827d066f60cbb4974dfd8b92f73d96fd7ba","unresolved":false,"context_lines":[{"line_number":567,"context_line":"        aggregate_md \u003d get_table(engine, \u0027aggregate_metadata\u0027)"},{"line_number":568,"context_line":"        num_azs \u003d aggregate_md.count().where("},{"line_number":569,"context_line":"                aggregate_md.c.key \u003d\u003d \u0027availability_zone\u0027).execute().scalar()"},{"line_number":570,"context_line":"        self.assertEqual(0, num_azs)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    # migration 147, availability zone transition for services"},{"line_number":573,"context_line":"    def _pre_upgrade_147(self, engine):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2Bjbk%3D","side":"PARENT","line":570,"updated":"2013-02-27 16:39:05.000000000","message":"why remove?","commit_id":"907594ec28193a1ba9fdaf7420b153433e7ea47b"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"99e2f0a8cd56b0377aaf18942abd88f192848dfc","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            # upgrade -\u003e downgrade -\u003e upgrade"},{"line_number":376,"context_line":"            self._migrate_up(engine, version, with_data\u003dTrue)"},{"line_number":377,"context_line":"            if snake_walk:"},{"line_number":378,"context_line":"                self._migrate_down(engine, version)"},{"line_number":379,"context_line":"                self._migrate_up(engine, version)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        if downgrade:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2BjgI%3D","line":378,"updated":"2013-02-27 16:10:15.000000000","message":"why change the target version here?","commit_id":"9bc4d47739ce079c93e02999404faec7fc3005fb"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"99e2f0a8cd56b0377aaf18942abd88f192848dfc","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                xrange(self.INIT_VERSION + 2,"},{"line_number":386,"context_line":"                       self.REPOSITORY.latest + 1)):"},{"line_number":387,"context_line":"                # downgrade -\u003e upgrade -\u003e downgrade"},{"line_number":388,"context_line":"                self._migrate_down(engine, version)"},{"line_number":389,"context_line":"                if snake_walk:"},{"line_number":390,"context_line":"                    self._migrate_up(engine, version)"},{"line_number":391,"context_line":"                    self._migrate_down(engine, version)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2BjgE%3D","line":388,"updated":"2013-02-27 16:10:15.000000000","message":"and here?","commit_id":"9bc4d47739ce079c93e02999404faec7fc3005fb"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"99e2f0a8cd56b0377aaf18942abd88f192848dfc","unresolved":false,"context_lines":[{"line_number":388,"context_line":"                self._migrate_down(engine, version)"},{"line_number":389,"context_line":"                if snake_walk:"},{"line_number":390,"context_line":"                    self._migrate_up(engine, version)"},{"line_number":391,"context_line":"                    self._migrate_down(engine, version)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def _migrate_down(self, engine, version):"},{"line_number":394,"context_line":"        self.migration_api.downgrade(engine,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2BjgA%3D","line":391,"updated":"2013-02-27 16:10:15.000000000","message":"and here?","commit_id":"9bc4d47739ce079c93e02999404faec7fc3005fb"},{"author":{"_account_id":5174,"name":"Mauro Sergio Martins Rodrigues","email":"maurosr@linux.vnet.ibm.com","username":"maurosr"},"change_message_id":"ccad4827d066f60cbb4974dfd8b92f73d96fd7ba","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        self.assertEqual(data[\u0027availability_zone\u0027], md[\u0027value\u0027])"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    # migration 147, availability zone transition for services"},{"line_number":558,"context_line":"    def _prerun_147(self, engine):"},{"line_number":559,"context_line":"        az \u003d \u0027test_zone\u0027"},{"line_number":560,"context_line":"        host1 \u003d \u0027compute-host1\u0027"},{"line_number":561,"context_line":"        host2 \u003d \u0027compute-host2\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2BjbY%3D","line":558,"updated":"2013-02-27 16:39:05.000000000","message":"you need a rebase man... it uses pre_upgrade now (all methods name same comment)","commit_id":"9bc4d47739ce079c93e02999404faec7fc3005fb"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"99e2f0a8cd56b0377aaf18942abd88f192848dfc","unresolved":false,"context_lines":[{"line_number":915,"context_line":"        duplicate_keypair \u003d dict(name\u003d\u0027key2\u0027, user_id\u003d\u00272a\u0027,"},{"line_number":916,"context_line":"                        created_at\u003ddatetime.datetime.now(),"},{"line_number":917,"context_line":"                        deleted\u003d0)"},{"line_number":918,"context_line":"        insert.execute(duplicate_keypair)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        # Check for IntegrityError, if duplicate keypair is inserted"},{"line_number":921,"context_line":"        # after applying unique constraint"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAM3%2F%2Bjgk%3D","line":918,"updated":"2013-02-27 16:10:15.000000000","message":"Shouldn\u0027t this insert fail on the first execution here, since [key2, 2a] was already inserted in _prerun_159?","commit_id":"9bc4d47739ce079c93e02999404faec7fc3005fb"}]}
