)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"37e8426f06f1b6206db58e8ed04c3676335e10f9","unresolved":false,"context_lines":[{"line_number":6085,"context_line":""},{"line_number":6086,"context_line":""},{"line_number":6087,"context_line":"@require_context"},{"line_number":6088,"context_line":"def synchronizer_get_records_since(context, token, namespace_id):"},{"line_number":6089,"context_line":"    session \u003d get_session()"},{"line_number":6090,"context_line":"    records \u003d models.SynchronizerRecords"},{"line_number":6091,"context_line":"    updates \u003d models.SynchronizerUpdates"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FgXE%3D","line":6088,"updated":"2014-01-13 08:17:59.000000000","message":"i think that a short explanation of what is returned here is very important.\nin addition to this it is important to know the meaning of the token.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e2c087e9535f7cf270988eddd2a831e3ef839d0","unresolved":false,"context_lines":[{"line_number":6085,"context_line":""},{"line_number":6086,"context_line":""},{"line_number":6087,"context_line":"@require_context"},{"line_number":6088,"context_line":"def synchronizer_get_records_since(context, token, namespace_id):"},{"line_number":6089,"context_line":"    session \u003d get_session()"},{"line_number":6090,"context_line":"    records \u003d models.SynchronizerRecords"},{"line_number":6091,"context_line":"    updates \u003d models.SynchronizerUpdates"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BaA8%3D","line":6088,"in_reply_to":"AAAAUH%2F%2FgXE%3D","updated":"2014-01-27 11:46:30.000000000","message":"Good point.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"37e8426f06f1b6206db58e8ed04c3676335e10f9","unresolved":false,"context_lines":[{"line_number":6143,"context_line":"                                 session\u003dsession, read_deleted\u003d\"no\").\\"},{"line_number":6144,"context_line":"                                 filter(namespaces.id \u003d\u003d namespace_id).first()"},{"line_number":6145,"context_line":"        if namespace is None:"},{"line_number":6146,"context_line":"            raise Exception(_(\"Namespace with id %(s) was not found\")"},{"line_number":6147,"context_line":"                            % namespace_id)"},{"line_number":6148,"context_line":""},{"line_number":6149,"context_line":"        record \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FgWw%3D","line":6146,"updated":"2014-01-13 08:17:59.000000000","message":"why not raise a nova exception here?","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e2c087e9535f7cf270988eddd2a831e3ef839d0","unresolved":false,"context_lines":[{"line_number":6143,"context_line":"                                 session\u003dsession, read_deleted\u003d\"no\").\\"},{"line_number":6144,"context_line":"                                 filter(namespaces.id \u003d\u003d namespace_id).first()"},{"line_number":6145,"context_line":"        if namespace is None:"},{"line_number":6146,"context_line":"            raise Exception(_(\"Namespace with id %(s) was not found\")"},{"line_number":6147,"context_line":"                            % namespace_id)"},{"line_number":6148,"context_line":""},{"line_number":6149,"context_line":"        record \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BaBE%3D","line":6146,"in_reply_to":"AAAAUH%2F%2FgWw%3D","updated":"2014-01-27 11:46:30.000000000","message":"Ok, I\u0027ll use it.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"37e8426f06f1b6206db58e8ed04c3676335e10f9","unresolved":false,"context_lines":[{"line_number":6156,"context_line":"            record.namespace_id \u003d namespace_id"},{"line_number":6157,"context_line":"            session.add(record)"},{"line_number":6158,"context_line":"        record.value \u003d value"},{"line_number":6159,"context_line":"        session.flush()"},{"line_number":6160,"context_line":"        update \u003d models.SynchronizerUpdates()"},{"line_number":6161,"context_line":"        update.record_id \u003d record.id"},{"line_number":6162,"context_line":"        session.add(update)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FgWs%3D","line":6159,"updated":"2014-01-13 08:17:59.000000000","message":"can you please explain the multiple flushes that we have here? that is, there is one additional one of 6163.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e2c087e9535f7cf270988eddd2a831e3ef839d0","unresolved":false,"context_lines":[{"line_number":6156,"context_line":"            record.namespace_id \u003d namespace_id"},{"line_number":6157,"context_line":"            session.add(record)"},{"line_number":6158,"context_line":"        record.value \u003d value"},{"line_number":6159,"context_line":"        session.flush()"},{"line_number":6160,"context_line":"        update \u003d models.SynchronizerUpdates()"},{"line_number":6161,"context_line":"        update.record_id \u003d record.id"},{"line_number":6162,"context_line":"        session.add(update)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BaCg%3D","line":6159,"in_reply_to":"AAAAUH%2F%2FgWs%3D","updated":"2014-01-27 11:46:30.000000000","message":"They are done to propagate ids which are generated by DB.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1bba11e3a3f554661b832a208f3fad6e71b8f50d","unresolved":false,"context_lines":[{"line_number":6159,"context_line":"        session.flush()"},{"line_number":6160,"context_line":"        update \u003d models.SynchronizerUpdates()"},{"line_number":6161,"context_line":"        update.record_id \u003d record.id"},{"line_number":6162,"context_line":"        session.add(update)"},{"line_number":6163,"context_line":"        session.flush()"},{"line_number":6164,"context_line":"        namespace.last_update_id \u003d update.id"},{"line_number":6165,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2Fe7U%3D","line":6162,"updated":"2014-01-13 13:01:46.000000000","message":"Just question, is there any race problem happend between update SynchronizerRecords and SynchronizerUpdates?","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e2c087e9535f7cf270988eddd2a831e3ef839d0","unresolved":false,"context_lines":[{"line_number":6159,"context_line":"        session.flush()"},{"line_number":6160,"context_line":"        update \u003d models.SynchronizerUpdates()"},{"line_number":6161,"context_line":"        update.record_id \u003d record.id"},{"line_number":6162,"context_line":"        session.add(update)"},{"line_number":6163,"context_line":"        session.flush()"},{"line_number":6164,"context_line":"        namespace.last_update_id \u003d update.id"},{"line_number":6165,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BaCM%3D","line":6162,"in_reply_to":"AAAAUH%2F%2Fe7U%3D","updated":"2014-01-27 11:46:30.000000000","message":"No, as soon as it has a record_id it won\u0027t be affected by other DB operations which may happen here.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"37e8426f06f1b6206db58e8ed04c3676335e10f9","unresolved":false,"context_lines":[{"line_number":6168,"context_line":"def synchronizer_remove_record(context, record_id):"},{"line_number":6169,"context_line":"    session \u003d get_session()"},{"line_number":6170,"context_line":"    with session.begin():"},{"line_number":6171,"context_line":"        return model_query(context, models.SynchronizerRecords,"},{"line_number":6172,"context_line":"                            session\u003dsession).\\"},{"line_number":6173,"context_line":"                    filter_by(id\u003drecord_id).delete()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FgWg%3D","line":6171,"updated":"2014-01-13 08:17:59.000000000","message":"would this throw an exception if the record is not found? is that something we wish to consider","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e2c087e9535f7cf270988eddd2a831e3ef839d0","unresolved":false,"context_lines":[{"line_number":6168,"context_line":"def synchronizer_remove_record(context, record_id):"},{"line_number":6169,"context_line":"    session \u003d get_session()"},{"line_number":6170,"context_line":"    with session.begin():"},{"line_number":6171,"context_line":"        return model_query(context, models.SynchronizerRecords,"},{"line_number":6172,"context_line":"                            session\u003dsession).\\"},{"line_number":6173,"context_line":"                    filter_by(id\u003drecord_id).delete()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2BZ94%3D","line":6171,"in_reply_to":"AAAAUH%2F%2FgWg%3D","updated":"2014-01-27 11:46:30.000000000","message":"In case when the record is not found None should be returned. I doubt that we should consider this as a problem which must be addressed here.","commit_id":"f14a28e91e0df627c97a4f4c0935bf82157232e8"}],"nova/db/sqlalchemy/migrate_repo/versions/229_add_tables_needed_for_state_synchronization.py":[{"author":{"_account_id":360,"name":"Dan Prince","email":"dprince@redhat.com","username":"dan-prince"},"change_message_id":"cf4a8b3b642953219aecf29d9f69085f21713849","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"from sqlalchemy import types"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"from nova.openstack.common import log as logging"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BSvU%3D","line":8,"updated":"2013-11-27 19:27:30.000000000","message":"We aren\u0027t using logger in this migration so I think you can drop these.","commit_id":"0b5ec0f215a2f230df7ea1fa00438ac85207fdf5"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8f02f5adce6b5d3f3b0a4406c88833c0c853e1c5","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"from sqlalchemy import types"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"from nova.openstack.common import log as logging"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BM0s%3D","line":8,"in_reply_to":"AAAATn%2F%2BSvU%3D","updated":"2013-11-29 10:15:25.000000000","message":"Thank you, I will remove it.","commit_id":"0b5ec0f215a2f230df7ea1fa00438ac85207fdf5"},{"author":{"_account_id":360,"name":"Dan Prince","email":"dprince@redhat.com","username":"dan-prince"},"change_message_id":"cf4a8b3b642953219aecf29d9f69085f21713849","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                  \u0027synchronizer_update_record_fkey\u0027],"},{"line_number":61,"context_line":"             ]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    for fkey_pair in fkeys:"},{"line_number":64,"context_line":"        if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":65,"context_line":"            # For MySQL we name our fkeys explicitly so they match Folsom"},{"line_number":66,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BSu4%3D","line":63,"updated":"2013-11-27 19:27:30.000000000","message":"This code here looks very similar (copied) from the 133_folsom migration (currently the initial migration for nova). This conditional split for MySQL/PostgreSQL is needed in that migration to make sure our constraint names match historical values for previous releases.\n\nGoing forward I would actually very much like to see us explicitly name our Fkey constraints on both MySQL as well as PostgreSQL.","commit_id":"0b5ec0f215a2f230df7ea1fa00438ac85207fdf5"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8f02f5adce6b5d3f3b0a4406c88833c0c853e1c5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                  \u0027synchronizer_update_record_fkey\u0027],"},{"line_number":61,"context_line":"             ]"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    for fkey_pair in fkeys:"},{"line_number":64,"context_line":"        if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":65,"context_line":"            # For MySQL we name our fkeys explicitly so they match Folsom"},{"line_number":66,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2BM04%3D","line":63,"in_reply_to":"AAAATn%2F%2BSu4%3D","updated":"2013-11-29 10:15:25.000000000","message":"Do I get it right and it is not necessary to separately handle MySQL and PostgreSQL cases?","commit_id":"0b5ec0f215a2f230df7ea1fa00438ac85207fdf5"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from migrate import ForeignKeyConstraint"},{"line_number":2,"context_line":"from sqlalchemy import Boolean, Column, DateTime, ForeignKey"},{"line_number":3,"context_line":"from sqlalchemy import Integer, MetaData, String, Table, Text"},{"line_number":4,"context_line":"from sqlalchemy.sql.expression import text"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMjg%3D","line":1,"updated":"2013-11-29 10:53:00.000000000","message":"license is missed","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":2,"context_line":"from sqlalchemy import Boolean, Column, DateTime, ForeignKey"},{"line_number":3,"context_line":"from sqlalchemy import Integer, MetaData, String, Table, Text"},{"line_number":4,"context_line":"from sqlalchemy.sql.expression import text"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"from sqlalchemy import types"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMjk%3D","line":5,"updated":"2013-11-29 10:53:00.000000000","message":"this empty line is redundant.","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":67,"context_line":"            # PostgreSQL names things like it wants (correct and compatible!)"},{"line_number":68,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":69,"context_line":"                                   refcolumns\u003dfkey_pair[1])"},{"line_number":70,"context_line":"            fkey.create()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    if migrate_engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMhs%3D","line":69,"updated":"2013-11-29 10:53:00.000000000","message":"My opinion - we should use same names for all backends, so it makes a sense to set name obviously","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    meta \u003d MetaData()"},{"line_number":83,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    namespaces \u003d Table(\u0027synchronizer_namespaces\u0027, meta,"},{"line_number":86,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":87,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":88,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMgw%3D","line":85,"updated":"2013-11-29 10:53:00.000000000","message":"nit: you can use autoload instead of table definition. See for example https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/migrate_repo/versions/148_add_instance_actions.py#L76","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"5f279ddae661c95b3fd5f7acd1ea534e011e78aa","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    meta \u003d MetaData()"},{"line_number":12,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    namespaces \u003d Table(\u0027synchronizer_namespaces\u0027, meta,"},{"line_number":15,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":16,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":17,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BBXM%3D","line":14,"updated":"2013-12-03 11:36:14.000000000","message":"you should add shadow tables for all these tables. \n\nshadow tables should have the name:\n\"shadow_synchronizer_namespaces\"\nand the same columns (without indexes and fks)","commit_id":"c9ac45e51f366556fa97c8ca2bcb21d3de73ff8d"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"934ccba3de1375486725c6e1d463062a28ec549a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    meta \u003d MetaData()"},{"line_number":12,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    namespaces \u003d Table(\u0027synchronizer_namespaces\u0027, meta,"},{"line_number":15,"context_line":"        Column(\u0027created_at\u0027, DateTime),"},{"line_number":16,"context_line":"        Column(\u0027updated_at\u0027, DateTime),"},{"line_number":17,"context_line":"        Column(\u0027deleted_at\u0027, DateTime),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F97S0%3D","line":14,"in_reply_to":"AAAATn%2F%2BBXM%3D","updated":"2013-12-04 11:54:58.000000000","message":"Um, well, they are kind of added in this very file. Please see lines 50 to 52.","commit_id":"c9ac45e51f366556fa97c8ca2bcb21d3de73ff8d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"1d9e9ecc5464f385ac3cf1f5fa18bd66e67ff45e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    updates.create()"},{"line_number":50,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003dnamespaces)"},{"line_number":51,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003drecords)"},{"line_number":52,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003dupdates)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    fkeys \u003d ["},{"line_number":55,"context_line":"              [[records.c.namespace_id],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BHvE%3D","line":52,"updated":"2013-12-02 11:33:05.000000000","message":"do you drop these tables in downgrade?","commit_id":"c9ac45e51f366556fa97c8ca2bcb21d3de73ff8d"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"934ccba3de1375486725c6e1d463062a28ec549a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    updates.create()"},{"line_number":50,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003dnamespaces)"},{"line_number":51,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003drecords)"},{"line_number":52,"context_line":"    utils.create_shadow_table(migrate_engine, table\u003dupdates)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    fkeys \u003d ["},{"line_number":55,"context_line":"              [[records.c.namespace_id],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F97Ss%3D","line":52,"in_reply_to":"AAAATn%2F%2BHvE%3D","updated":"2013-12-04 11:54:58.000000000","message":"No, I don\u0027t. Thank you for pointing this out.","commit_id":"c9ac45e51f366556fa97c8ca2bcb21d3de73ff8d"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"87255b6ef851781adac7264b5396d11dc63c4e97","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from migrate import ForeignKeyConstraint"},{"line_number":2,"context_line":"from sqlalchemy import Boolean, Column, DateTime, ForeignKey"},{"line_number":3,"context_line":"from sqlalchemy import Integer, MetaData, String, Table, Text"},{"line_number":4,"context_line":"from sqlalchemy.sql.expression import text"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97Qg%3D","line":1,"updated":"2013-12-04 12:07:45.000000000","message":"What about apache license?","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"39e161890a86d161625778c1403bfce6d7e1639a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from migrate import ForeignKeyConstraint"},{"line_number":2,"context_line":"from sqlalchemy import Boolean, Column, DateTime, ForeignKey"},{"line_number":3,"context_line":"from sqlalchemy import Integer, MetaData, String, Table, Text"},{"line_number":4,"context_line":"from sqlalchemy.sql.expression import text"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97OY%3D","line":1,"in_reply_to":"AAAATn%2F97Qg%3D","updated":"2013-12-04 12:34:55.000000000","message":"Done","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"87255b6ef851781adac7264b5396d11dc63c4e97","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                                   name\u003dfkey_pair[2])"},{"line_number":69,"context_line":"            fkey.create()"},{"line_number":70,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":71,"context_line":"            # PostgreSQL names things like it wants (correct and compatible!)"},{"line_number":72,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":73,"context_line":"                                   refcolumns\u003dfkey_pair[1])"},{"line_number":74,"context_line":"            fkey.create()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97P0%3D","line":71,"updated":"2013-12-04 12:07:45.000000000","message":"We should have same FK names for all backends.","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"17f1d5d2050d3f1d6e7617c2a066742afb9960f6","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                                   name\u003dfkey_pair[2])"},{"line_number":69,"context_line":"            fkey.create()"},{"line_number":70,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":71,"context_line":"            # PostgreSQL names things like it wants (correct and compatible!)"},{"line_number":72,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":73,"context_line":"                                   refcolumns\u003dfkey_pair[1])"},{"line_number":74,"context_line":"            fkey.create()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F92JY%3D","line":71,"in_reply_to":"AAAATn%2F95yg%3D","updated":"2013-12-05 10:04:40.000000000","message":"Ok, I\u0027ve removed dialect-specific magic.","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"ca62e2448182eae1ecd134a207705b5d23842594","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                                   name\u003dfkey_pair[2])"},{"line_number":69,"context_line":"            fkey.create()"},{"line_number":70,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":71,"context_line":"            # PostgreSQL names things like it wants (correct and compatible!)"},{"line_number":72,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":73,"context_line":"                                   refcolumns\u003dfkey_pair[1])"},{"line_number":74,"context_line":"            fkey.create()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F95yg%3D","line":71,"in_reply_to":"AAAATn%2F97Ng%3D","updated":"2013-12-04 17:26:02.000000000","message":"He have a lot of problems, due to different UC/FK/etc naming on different backends, so it makes a sense to set name obviously.","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"39e161890a86d161625778c1403bfce6d7e1639a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                                   name\u003dfkey_pair[2])"},{"line_number":69,"context_line":"            fkey.create()"},{"line_number":70,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":71,"context_line":"            # PostgreSQL names things like it wants (correct and compatible!)"},{"line_number":72,"context_line":"            fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":73,"context_line":"                                   refcolumns\u003dfkey_pair[1])"},{"line_number":74,"context_line":"            fkey.create()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97Ng%3D","line":71,"in_reply_to":"AAAATn%2F97P0%3D","updated":"2013-12-04 12:34:55.000000000","message":"Ok, that sounds like a great idea, but it was done this way in the first migration (133_folsom). I don\u0027t mind explicit FK naming, but I am not sure if it should be done. If it is the right way then just let me know and I\u0027ll fix it.","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"87255b6ef851781adac7264b5396d11dc63c4e97","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    records \u003d Table(\u0027synchronizer_records\u0027, meta, autoload\u003dTrue)"},{"line_number":91,"context_line":"    updates \u003d Table(\u0027synchronizer_updates\u0027, meta, autoload\u003dTrue)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    s_namespaces \u003d Table(\u0027shadow_synchronizer_namespaces\u0027, meta, autoload\u003dTrue)"},{"line_number":94,"context_line":"    s_records \u003d Table(\u0027shadow_synchronizer_records\u0027, meta, autoload\u003dTrue)"},{"line_number":95,"context_line":"    s_updates \u003d Table(\u0027shadow_synchronizer_updates\u0027, meta, autoload\u003dTrue)"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97Qk%3D","line":93,"updated":"2013-12-04 12:07:45.000000000","message":"It\u0027s a bad idea - to form shadow tables name in a such way. Please use _SHADOW_TABLE_PREFIX variable from nova.db.sqlalchemy.api module.","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"39e161890a86d161625778c1403bfce6d7e1639a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    records \u003d Table(\u0027synchronizer_records\u0027, meta, autoload\u003dTrue)"},{"line_number":91,"context_line":"    updates \u003d Table(\u0027synchronizer_updates\u0027, meta, autoload\u003dTrue)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    s_namespaces \u003d Table(\u0027shadow_synchronizer_namespaces\u0027, meta, autoload\u003dTrue)"},{"line_number":94,"context_line":"    s_records \u003d Table(\u0027shadow_synchronizer_records\u0027, meta, autoload\u003dTrue)"},{"line_number":95,"context_line":"    s_updates \u003d Table(\u0027shadow_synchronizer_updates\u0027, meta, autoload\u003dTrue)"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97NY%3D","line":93,"in_reply_to":"AAAATn%2F97Qk%3D","updated":"2013-12-04 12:34:55.000000000","message":"Done","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"c7f9e62d0c4061883f1a3c71d1ab4410e52db0f3","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova.db.sqlalchemy import api as sqlalchemy_api"},{"line_number":21,"context_line":"from nova.db.sqlalchemy import utils"},{"line_number":22,"context_line":"from sqlalchemy import types"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F9168%3D","line":22,"updated":"2013-12-05 11:44:29.000000000","message":"nit: move it to first import group","commit_id":"bcab2580ac885c32db0f5528b581aac590033fe4"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"18872fa9f831b9c8d776853ee5be61e96a1b1bd4","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova.db.sqlalchemy import api as sqlalchemy_api"},{"line_number":21,"context_line":"from nova.db.sqlalchemy import utils"},{"line_number":22,"context_line":"from sqlalchemy import types"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F90mA%3D","line":22,"in_reply_to":"AAAATn%2F9168%3D","updated":"2013-12-05 15:23:47.000000000","message":"Done","commit_id":"bcab2580ac885c32db0f5528b581aac590033fe4"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"c7f9e62d0c4061883f1a3c71d1ab4410e52db0f3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                  \u0027synchronizer_update_record_fkey\u0027],"},{"line_number":76,"context_line":"             ]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    for fkey_pair in fkeys:"},{"line_number":79,"context_line":"        fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":80,"context_line":"                               refcolumns\u003dfkey_pair[1],"},{"line_number":81,"context_line":"                               name\u003dfkey_pair[2])"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F916o%3D","line":78,"updated":"2013-12-05 11:44:29.000000000","message":"nit you can avoid of use list indexes in a such way: \n\nfor columns, refcolumns, name in fkeys:\n    fkey \u003d ForeignKeyConstraint(...)","commit_id":"bcab2580ac885c32db0f5528b581aac590033fe4"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"18872fa9f831b9c8d776853ee5be61e96a1b1bd4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                  \u0027synchronizer_update_record_fkey\u0027],"},{"line_number":76,"context_line":"             ]"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    for fkey_pair in fkeys:"},{"line_number":79,"context_line":"        fkey \u003d ForeignKeyConstraint(columns\u003dfkey_pair[0],"},{"line_number":80,"context_line":"                               refcolumns\u003dfkey_pair[1],"},{"line_number":81,"context_line":"                               name\u003dfkey_pair[2])"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F90nk%3D","line":78,"in_reply_to":"AAAATn%2F916o%3D","updated":"2013-12-05 15:23:47.000000000","message":"Done","commit_id":"bcab2580ac885c32db0f5528b581aac590033fe4"}],"nova/db/sqlalchemy/models.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":1412,"context_line":""},{"line_number":1413,"context_line":"    __tablename__ \u003d \u0027synchronizer_namespaces\u0027"},{"line_number":1414,"context_line":"    __table_args__ \u003d ()"},{"line_number":1415,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":1416,"context_line":"    name \u003d Column(String(255))"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMiw%3D","line":1415,"updated":"2013-11-29 10:53:00.000000000","message":"What about nullable?","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":1420,"context_line":""},{"line_number":1421,"context_line":"    __tablename__ \u003d \u0027synchronizer_records\u0027"},{"line_number":1422,"context_line":"    __table_args__ \u003d ()"},{"line_number":1423,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":1424,"context_line":"    namespace_id \u003d Column(Integer, ForeignKey(\u0027synchronizer_namespaces.id\u0027),"},{"line_number":1425,"context_line":"                          nullable\u003dFalse)"},{"line_number":1426,"context_line":"    namespace \u003d relationship(SynchronizerNamespaces,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMik%3D","line":1423,"updated":"2013-11-29 10:53:00.000000000","message":"ditto","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4993ffaabfe196bf1aad2bdababff968967bbed6","unresolved":false,"context_lines":[{"line_number":1433,"context_line":""},{"line_number":1434,"context_line":"    __tablename__ \u003d \u0027synchronizer_updates\u0027"},{"line_number":1435,"context_line":"    __table_args__ \u003d ()"},{"line_number":1436,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":1437,"context_line":"    record_id \u003d Column(Integer, ForeignKey(\u0027synchronizer_records.id\u0027),"},{"line_number":1438,"context_line":"                       nullable\u003dFalse)"},{"line_number":1439,"context_line":"    timestamp \u003d Column(\u0027timestamp\u0027, types.types.TIMESTAMP,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BMic%3D","line":1436,"updated":"2013-11-29 10:53:00.000000000","message":"ditto","commit_id":"f0d110f3d65254abd39958e26777901d12f42ac8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"c7f9e62d0c4061883f1a3c71d1ab4410e52db0f3","unresolved":false,"context_lines":[{"line_number":1412,"context_line":""},{"line_number":1413,"context_line":"    __tablename__ \u003d \u0027synchronizer_namespaces\u0027"},{"line_number":1414,"context_line":"    __table_args__ \u003d ()"},{"line_number":1415,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":1416,"context_line":"    name \u003d Column(String(255))"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F91rs%3D","line":1415,"updated":"2013-12-05 11:44:29.000000000","message":"can you please add a `nullable` parameter here? (same as in migration)","commit_id":"bcab2580ac885c32db0f5528b581aac590033fe4"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"18872fa9f831b9c8d776853ee5be61e96a1b1bd4","unresolved":false,"context_lines":[{"line_number":1412,"context_line":""},{"line_number":1413,"context_line":"    __tablename__ \u003d \u0027synchronizer_namespaces\u0027"},{"line_number":1414,"context_line":"    __table_args__ \u003d ()"},{"line_number":1415,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":1416,"context_line":"    name \u003d Column(String(255))"},{"line_number":1417,"context_line":""},{"line_number":1418,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F901E%3D","line":1415,"in_reply_to":"AAAATn%2F91rs%3D","updated":"2013-12-05 15:23:47.000000000","message":"Done","commit_id":"bcab2580ac885c32db0f5528b581aac590033fe4"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"a1d8645ae25d4612449e380a01e951535a874d97","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    primary_join \u003d (\u0027and_(ComputeNodeStat.compute_node_id \u003d\u003d \u0027"},{"line_number":141,"context_line":"                    \u0027ComputeNode.id, ComputeNodeStat.deleted \u003d\u003d 0)\u0027)"},{"line_number":142,"context_line":"    stats \u003d relationship(\"ComputeNode\", backref\u003d\"stats\","},{"line_number":143,"context_line":"            primaryjoin\u003dprimary_join)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def __str__(self):"},{"line_number":146,"context_line":"        return \"{%d: %s \u003d %s}\" % (self.compute_node_id, self.key, self.value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9oEM%3D","line":143,"updated":"2013-12-09 15:16:22.000000000","message":"Above code snippet seems totally unrelated to this change.\n\nBTW, if this column is back reference from ComputeNode table as \u0027stats\u0027, then it should be defined as \u0027compute_node\u0027 instead of \u0027stats\u0027 here.\n\nPlease correct me if I was wrong.","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"bd1691737f6ffa6c8bc94eab63317bf6ccebc035","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    primary_join \u003d (\u0027and_(ComputeNodeStat.compute_node_id \u003d\u003d \u0027"},{"line_number":141,"context_line":"                    \u0027ComputeNode.id, ComputeNodeStat.deleted \u003d\u003d 0)\u0027)"},{"line_number":142,"context_line":"    stats \u003d relationship(\"ComputeNode\", backref\u003d\"stats\","},{"line_number":143,"context_line":"            primaryjoin\u003dprimary_join)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def __str__(self):"},{"line_number":146,"context_line":"        return \"{%d: %s \u003d %s}\" % (self.compute_node_id, self.key, self.value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9i44%3D","line":143,"in_reply_to":"AAAATn%2F9oEM%3D","updated":"2013-12-10 11:53:48.000000000","message":"You a right, this one is unrelated, I will fix this in the next patchset.","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"}],"nova/tests/db/test_db_api.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c12c5bc214d658e9d60006242dd165cf33667851","unresolved":false,"context_lines":[{"line_number":7127,"context_line":"                          v2[\u0027compute_node_id\u0027],"},{"line_number":7128,"context_line":"                          v2[\u0027address\u0027])"},{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":""},{"line_number":7131,"context_line":"class SynchronizerTestCase(test.TestCase, ModelsObjectComparatorMixin):"},{"line_number":7132,"context_line":""},{"line_number":7133,"context_line":"    _ignored_keys \u003d [\u0027id\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BSB4%3D","line":7130,"updated":"2014-01-28 12:50:09.000000000","message":"please add a test thta checks NamespaceNotFound(NovaException exception handling","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b7a9c92b192b95ec5389b7acb1936d9f98fec20","unresolved":false,"context_lines":[{"line_number":7127,"context_line":"                          v2[\u0027compute_node_id\u0027],"},{"line_number":7128,"context_line":"                          v2[\u0027address\u0027])"},{"line_number":7129,"context_line":""},{"line_number":7130,"context_line":""},{"line_number":7131,"context_line":"class SynchronizerTestCase(test.TestCase, ModelsObjectComparatorMixin):"},{"line_number":7132,"context_line":""},{"line_number":7133,"context_line":"    _ignored_keys \u003d [\u0027id\u0027, \u0027deleted\u0027, \u0027deleted_at\u0027, \u0027created_at\u0027, \u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BFqk%3D","line":7130,"in_reply_to":"AAAAUH%2F%2BSB4%3D","updated":"2014-01-30 09:49:31.000000000","message":"Done","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c12c5bc214d658e9d60006242dd165cf33667851","unresolved":false,"context_lines":[{"line_number":7183,"context_line":"        #      make synchronizer_put_record() call first, so no separate tests"},{"line_number":7184,"context_line":"        #      for synchronizer_put_record() today."},{"line_number":7185,"context_line":"        records \u003d db.synchronizer_get_records(self.ctxt, self.namespace.id)"},{"line_number":7186,"context_line":"        self.assertEqual(len(records), 1)"},{"line_number":7187,"context_line":"        record \u003d records[0]"},{"line_number":7188,"context_line":"        self._assert_dict_equal(anyjson.loads(record.value),"},{"line_number":7189,"context_line":"                                self.compute_node_dict)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BSBo%3D","line":7186,"updated":"2014-01-28 12:50:09.000000000","message":"in general the expected value should come as the first parameter","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b7a9c92b192b95ec5389b7acb1936d9f98fec20","unresolved":false,"context_lines":[{"line_number":7183,"context_line":"        #      make synchronizer_put_record() call first, so no separate tests"},{"line_number":7184,"context_line":"        #      for synchronizer_put_record() today."},{"line_number":7185,"context_line":"        records \u003d db.synchronizer_get_records(self.ctxt, self.namespace.id)"},{"line_number":7186,"context_line":"        self.assertEqual(len(records), 1)"},{"line_number":7187,"context_line":"        record \u003d records[0]"},{"line_number":7188,"context_line":"        self._assert_dict_equal(anyjson.loads(record.value),"},{"line_number":7189,"context_line":"                                self.compute_node_dict)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BFqg%3D","line":7186,"in_reply_to":"AAAAUH%2F%2BSBo%3D","updated":"2014-01-30 09:49:31.000000000","message":"Done","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c12c5bc214d658e9d60006242dd165cf33667851","unresolved":false,"context_lines":[{"line_number":7194,"context_line":"                                                      self.namespace.id)"},{"line_number":7195,"context_line":"        self.assertEqual(total_rec[0], 1)"},{"line_number":7196,"context_line":"        self.assertEqual(len(total_rec[1]), 1)"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"    def test_synchronizer_remove_record(self):"},{"line_number":7199,"context_line":"        fake_record \u003d {\u0027memory\u0027: 0, \u0027hypervisor_hostname\u0027: \u0027zero\u0027}"},{"line_number":7200,"context_line":"        total_rec \u003d db.synchronizer_get_records_since(self.ctxt, 0,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BSA0%3D","line":7197,"updated":"2014-01-28 12:50:09.000000000","message":"in the flow of the code there are a number of different cases. Can you please have a test that check each flow of synchronizer_get_records_since","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b7a9c92b192b95ec5389b7acb1936d9f98fec20","unresolved":false,"context_lines":[{"line_number":7194,"context_line":"                                                      self.namespace.id)"},{"line_number":7195,"context_line":"        self.assertEqual(total_rec[0], 1)"},{"line_number":7196,"context_line":"        self.assertEqual(len(total_rec[1]), 1)"},{"line_number":7197,"context_line":""},{"line_number":7198,"context_line":"    def test_synchronizer_remove_record(self):"},{"line_number":7199,"context_line":"        fake_record \u003d {\u0027memory\u0027: 0, \u0027hypervisor_hostname\u0027: \u0027zero\u0027}"},{"line_number":7200,"context_line":"        total_rec \u003d db.synchronizer_get_records_since(self.ctxt, 0,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BFeg%3D","line":7197,"in_reply_to":"AAAAUH%2F%2BSA0%3D","updated":"2014-01-30 09:49:31.000000000","message":"Done","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c12c5bc214d658e9d60006242dd165cf33667851","unresolved":false,"context_lines":[{"line_number":7215,"context_line":"        # Update No.2 appears in updates table."},{"line_number":7216,"context_line":"        db.synchronizer_put_record(self.ctxt, None, anyjson.dumps(fake_record),"},{"line_number":7217,"context_line":"                                   self.namespace.id)"},{"line_number":7218,"context_line":"        time.sleep(0.2)"},{"line_number":7219,"context_line":"        #delta \u003d datetime.datetime.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7220,"context_line":"        delta \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7221,"context_line":"        # Now it is time to see if update No.2 will be removed"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BSAY%3D","line":7218,"updated":"2014-01-28 12:50:09.000000000","message":"a time.sleep is not the best thing to do with the unit tests. you can use the utcoverride time (https://github.com/openstack/nova/blob/master/nova/openstack/common/timeutils.py#L121)","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b7a9c92b192b95ec5389b7acb1936d9f98fec20","unresolved":false,"context_lines":[{"line_number":7215,"context_line":"        # Update No.2 appears in updates table."},{"line_number":7216,"context_line":"        db.synchronizer_put_record(self.ctxt, None, anyjson.dumps(fake_record),"},{"line_number":7217,"context_line":"                                   self.namespace.id)"},{"line_number":7218,"context_line":"        time.sleep(0.2)"},{"line_number":7219,"context_line":"        #delta \u003d datetime.datetime.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7220,"context_line":"        delta \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7221,"context_line":"        # Now it is time to see if update No.2 will be removed"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BFww%3D","line":7218,"in_reply_to":"AAAAUH%2F%2BSAY%3D","updated":"2014-01-30 09:49:31.000000000","message":"Good point, thank you. I\u0027ll use it.","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c12c5bc214d658e9d60006242dd165cf33667851","unresolved":false,"context_lines":[{"line_number":7216,"context_line":"        db.synchronizer_put_record(self.ctxt, None, anyjson.dumps(fake_record),"},{"line_number":7217,"context_line":"                                   self.namespace.id)"},{"line_number":7218,"context_line":"        time.sleep(0.2)"},{"line_number":7219,"context_line":"        #delta \u003d datetime.datetime.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7220,"context_line":"        delta \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7221,"context_line":"        # Now it is time to see if update No.2 will be removed"},{"line_number":7222,"context_line":"        out \u003d db.synchronizer_purge_outdated_data(self.ctxt, delta)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BSAM%3D","line":7219,"updated":"2014-01-28 12:50:09.000000000","message":"this comment is not needed","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b7a9c92b192b95ec5389b7acb1936d9f98fec20","unresolved":false,"context_lines":[{"line_number":7216,"context_line":"        db.synchronizer_put_record(self.ctxt, None, anyjson.dumps(fake_record),"},{"line_number":7217,"context_line":"                                   self.namespace.id)"},{"line_number":7218,"context_line":"        time.sleep(0.2)"},{"line_number":7219,"context_line":"        #delta \u003d datetime.datetime.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7220,"context_line":"        delta \u003d timeutils.utcnow() - datetime.timedelta(seconds\u003d0.1)"},{"line_number":7221,"context_line":"        # Now it is time to see if update No.2 will be removed"},{"line_number":7222,"context_line":"        out \u003d db.synchronizer_purge_outdated_data(self.ctxt, delta)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2BLIE%3D","line":7219,"in_reply_to":"AAAAUH%2F%2BSAM%3D","updated":"2014-01-30 09:49:31.000000000","message":"Done","commit_id":"420a29730a56ede5ae3caae929b3339254d4d761"}],"nova/tests/db/test_migrations.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"87255b6ef851781adac7264b5396d11dc63c4e97","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        conn_string \u003d self.test_databases[key]"},{"line_number":362,"context_line":"        conn_pieces \u003d urlparse.urlparse(conn_string)"},{"line_number":363,"context_line":"        engine.dispose()"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        if conn_string.startswith(\u0027sqlite\u0027):"},{"line_number":366,"context_line":"            self._reset_sqlite(conn_pieces)"},{"line_number":367,"context_line":"        elif conn_string.startswith(\u0027mysql\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97PQ%3D","line":364,"updated":"2013-12-04 12:07:45.000000000","message":"seems to be unrelated change","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"39e161890a86d161625778c1403bfce6d7e1639a","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        conn_string \u003d self.test_databases[key]"},{"line_number":362,"context_line":"        conn_pieces \u003d urlparse.urlparse(conn_string)"},{"line_number":363,"context_line":"        engine.dispose()"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        if conn_string.startswith(\u0027sqlite\u0027):"},{"line_number":366,"context_line":"            self._reset_sqlite(conn_pieces)"},{"line_number":367,"context_line":"        elif conn_string.startswith(\u0027mysql\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97Js%3D","line":364,"in_reply_to":"AAAATn%2F97PQ%3D","updated":"2013-12-04 12:34:55.000000000","message":"Done","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"87255b6ef851781adac7264b5396d11dc63c4e97","unresolved":false,"context_lines":[{"line_number":3351,"context_line":"    def _post_downgrade_228(self, engine):"},{"line_number":3352,"context_line":"        self.assertColumnNotExists(engine, \u0027compute_nodes\u0027, \u0027metrics\u0027)"},{"line_number":3353,"context_line":""},{"line_number":3354,"context_line":"    def _TableExists(self, engine, table):"},{"line_number":3355,"context_line":"        try:"},{"line_number":3356,"context_line":"            t \u003d db_utils.get_table(engine, table)"},{"line_number":3357,"context_line":"        except sqlalchemy.exc.NoSuchTableError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97Pg%3D","line":3354,"updated":"2013-12-04 12:07:45.000000000","message":"I\u0027ts not pep-8 style. See http://www.python.org/dev/peps/pep-0008/#function-names","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"39e161890a86d161625778c1403bfce6d7e1639a","unresolved":false,"context_lines":[{"line_number":3351,"context_line":"    def _post_downgrade_228(self, engine):"},{"line_number":3352,"context_line":"        self.assertColumnNotExists(engine, \u0027compute_nodes\u0027, \u0027metrics\u0027)"},{"line_number":3353,"context_line":""},{"line_number":3354,"context_line":"    def _TableExists(self, engine, table):"},{"line_number":3355,"context_line":"        try:"},{"line_number":3356,"context_line":"            t \u003d db_utils.get_table(engine, table)"},{"line_number":3357,"context_line":"        except sqlalchemy.exc.NoSuchTableError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F97Jg%3D","line":3354,"in_reply_to":"AAAATn%2F97Pg%3D","updated":"2013-12-04 12:34:55.000000000","message":"Done","commit_id":"bda884d66cb7916b6af3da14b91bdf7d0578ab44"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"a1d8645ae25d4612449e380a01e951535a874d97","unresolved":false,"context_lines":[{"line_number":3361,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3362,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3363,"context_line":"        for table in tables:"},{"line_number":3364,"context_line":"            self.assertTrue(self._table_exists(engine, table))"},{"line_number":3365,"context_line":""},{"line_number":3366,"context_line":"    def _post_downgrade_229(self, engine):"},{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9oIo%3D","line":3364,"updated":"2013-12-09 15:16:22.000000000","message":"Could as simple as \n\nself.assertRaises(sqlalchemy.exc.NoSuchTableError,\n                          db_utils.get_table, engine,\n                          table)\n\nand save the trouble of additional _table_exists()","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"07e0d908080133824fe8577cea4609d6c071c366","unresolved":false,"context_lines":[{"line_number":3361,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3362,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3363,"context_line":"        for table in tables:"},{"line_number":3364,"context_line":"            self.assertTrue(self._table_exists(engine, table))"},{"line_number":3365,"context_line":""},{"line_number":3366,"context_line":"    def _post_downgrade_229(self, engine):"},{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9ojw%3D","line":3364,"updated":"2013-12-09 14:05:27.000000000","message":"nit: you can add informative error message here","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"84a777160e26f6d735efc9e27ddc8df5484e7876","unresolved":false,"context_lines":[{"line_number":3361,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3362,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3363,"context_line":"        for table in tables:"},{"line_number":3364,"context_line":"            self.assertTrue(self._table_exists(engine, table))"},{"line_number":3365,"context_line":""},{"line_number":3366,"context_line":"    def _post_downgrade_229(self, engine):"},{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Ras%3D","line":3364,"in_reply_to":"AAAATn%2F9c9c%3D","updated":"2013-12-13 08:30:53.000000000","message":"Ok, got what you suggest, thank you. I\u0027ll do it in one of the following patch sets.","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"26faaadfcae044e07f166ca6e839d52b1749c6b9","unresolved":false,"context_lines":[{"line_number":3361,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3362,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3363,"context_line":"        for table in tables:"},{"line_number":3364,"context_line":"            self.assertTrue(self._table_exists(engine, table))"},{"line_number":3365,"context_line":""},{"line_number":3366,"context_line":"    def _post_downgrade_229(self, engine):"},{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9c9c%3D","line":3364,"in_reply_to":"AAAATn%2F9i5c%3D","updated":"2013-12-11 11:36:19.000000000","message":"I see your point here. My suggestion is to use naming like _check_no_synchronizer_tables(), instead of use a generic name like _table_exists. Put all the table details there, and call it in both _pre_upgrade_229 and _post_downgrade_229\n\n tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,\n3368\t                  \u0027synchronizer_updates\u0027]\n\nin _check_229, you need some more specific test, like geneate a fake line of data, insert and select.","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"bd1691737f6ffa6c8bc94eab63317bf6ccebc035","unresolved":false,"context_lines":[{"line_number":3361,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3362,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3363,"context_line":"        for table in tables:"},{"line_number":3364,"context_line":"            self.assertTrue(self._table_exists(engine, table))"},{"line_number":3365,"context_line":""},{"line_number":3366,"context_line":"    def _post_downgrade_229(self, engine):"},{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9i5c%3D","line":3364,"in_reply_to":"AAAATn%2F9oIo%3D","updated":"2013-12-10 11:53:48.000000000","message":"Yes, but here I actually want to make sure that it doesn\u0027t raise anything. At the same time I reuse this function in _post_downgrade_229(), so could you please elaborate how assertRaises can cover both cases?","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"bd1691737f6ffa6c8bc94eab63317bf6ccebc035","unresolved":false,"context_lines":[{"line_number":3361,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3362,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3363,"context_line":"        for table in tables:"},{"line_number":3364,"context_line":"            self.assertTrue(self._table_exists(engine, table))"},{"line_number":3365,"context_line":""},{"line_number":3366,"context_line":"    def _post_downgrade_229(self, engine):"},{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9i50%3D","line":3364,"in_reply_to":"AAAATn%2F9ojw%3D","updated":"2013-12-10 11:53:48.000000000","message":"Ookay, but this is a test. A test for migration. Does it really make sence to add a message to a very specific and narrow test case?","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"07e0d908080133824fe8577cea4609d6c071c366","unresolved":false,"context_lines":[{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3368,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3369,"context_line":"        for table in tables:"},{"line_number":3370,"context_line":"            self.assertFalse(self._table_exists(engine, table))"},{"line_number":3371,"context_line":""},{"line_number":3372,"context_line":""},{"line_number":3373,"context_line":"class TestBaremetalMigrations(BaseWalkMigrationTestCase, CommonTestsMixIn):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9ojs%3D","line":3370,"updated":"2013-12-09 14:05:27.000000000","message":"ditto","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"bd1691737f6ffa6c8bc94eab63317bf6ccebc035","unresolved":false,"context_lines":[{"line_number":3367,"context_line":"        tables \u003d [\u0027synchronizer_namespaces\u0027, \u0027synchronizer_records\u0027,"},{"line_number":3368,"context_line":"                  \u0027synchronizer_updates\u0027]"},{"line_number":3369,"context_line":"        for table in tables:"},{"line_number":3370,"context_line":"            self.assertFalse(self._table_exists(engine, table))"},{"line_number":3371,"context_line":""},{"line_number":3372,"context_line":""},{"line_number":3373,"context_line":"class TestBaremetalMigrations(BaseWalkMigrationTestCase, CommonTestsMixIn):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9i5M%3D","line":3370,"in_reply_to":"AAAATn%2F9ojs%3D","updated":"2013-12-10 11:53:48.000000000","message":"The same question as above.","commit_id":"aad8819a806872447d9fa4a2edc57af91dbff389"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"97adc3988d8164ba42daa8c611e26eb2eb1db82c","unresolved":false,"context_lines":[{"line_number":2735,"context_line":"    def _post_downgrade_228(self, engine):"},{"line_number":2736,"context_line":"        self.assertColumnNotExists(engine, \u0027compute_nodes\u0027, \u0027metrics\u0027)"},{"line_number":2737,"context_line":""},{"line_number":2738,"context_line":"    def _table_exists(self, engine, table):"},{"line_number":2739,"context_line":"        try:"},{"line_number":2740,"context_line":"            t \u003d db_utils.get_table(engine, table)"},{"line_number":2741,"context_line":"        except sqlalchemy.exc.NoSuchTableError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9c78%3D","line":2738,"updated":"2013-12-11 11:39:32.000000000","message":"Would like see the naming more related to migration 229 itself, instead of a generic one. Since these code are grouped together. \n\nPlease check my comments in patchset 7. Thanks!","commit_id":"e251b5dc70f4d28a023b9cdd1ad022341ffbfdf0"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"05af4f601de2615563be2549aa24e5c6ca7f3430","unresolved":false,"context_lines":[{"line_number":2735,"context_line":"    def _post_downgrade_228(self, engine):"},{"line_number":2736,"context_line":"        self.assertColumnNotExists(engine, \u0027compute_nodes\u0027, \u0027metrics\u0027)"},{"line_number":2737,"context_line":""},{"line_number":2738,"context_line":"    def _table_exists(self, engine, table):"},{"line_number":2739,"context_line":"        try:"},{"line_number":2740,"context_line":"            t \u003d db_utils.get_table(engine, table)"},{"line_number":2741,"context_line":"        except sqlalchemy.exc.NoSuchTableError:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9RZ8%3D","line":2738,"in_reply_to":"AAAATn%2F9c78%3D","updated":"2013-12-13 08:33:21.000000000","message":"Yes, this is a good point.","commit_id":"e251b5dc70f4d28a023b9cdd1ad022341ffbfdf0"}]}
