)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"92e86141c4c0cc0c42cc89ec2815a1b7cd49b1cf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ann Kamyshnikova \u003cakamyshnikova@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-06-09 15:09:01 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Script"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add script that will add all tables for all plugins and make db schema"},{"line_number":10,"context_line":"unconditional."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_cdd76c22","line":7,"updated":"2014-06-09 12:05:07.000000000","message":"Please change this to \"Database healing migration\".","commit_id":"3517bbb101f333fe8c964c234d359ffc5a67853a"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"6b23e22bec3d1b440dd50667c9c577b803056166","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ann Kamyshnikova \u003cakamyshnikova@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-06-09 15:09:01 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Script"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add script that will add all tables for all plugins and make db schema"},{"line_number":10,"context_line":"unconditional."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_ed8188fc","line":7,"in_reply_to":"1ae5cdf2_cdd76c22","updated":"2014-06-09 12:16:47.000000000","message":"Ok","commit_id":"3517bbb101f333fe8c964c234d359ffc5a67853a"}],"neutron/db/migration/alembic_migrations/heal_script.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import pprint"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def heal():"},{"line_number":28,"context_line":"    import_tables()"},{"line_number":29,"context_line":"    models_metadata \u003d model_base.BASEV2.metadata"},{"line_number":30,"context_line":"    # Compare metadata from models and metadata from migrations"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_771c676b","line":27,"updated":"2014-06-09 11:22:01.000000000","message":"Should we start with a check for online mode?","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":24,"context_line":"import pprint"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def heal():"},{"line_number":28,"context_line":"    import_tables()"},{"line_number":29,"context_line":"    models_metadata \u003d model_base.BASEV2.metadata"},{"line_number":30,"context_line":"    # Compare metadata from models and metadata from migrations"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_922bc193","line":27,"in_reply_to":"1ae5cdf2_771c676b","updated":"2014-06-09 12:09:00.000000000","message":"Thanks for point on this. I will add check. But may be it is better to do it in migration.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    import_tables()"},{"line_number":29,"context_line":"    models_metadata \u003d model_base.BASEV2.metadata"},{"line_number":30,"context_line":"    # Compare metadata from models and metadata from migrations"},{"line_number":31,"context_line":"    diff \u003d autogen.compare_metadata(context.get_context(), models_metadata)"},{"line_number":32,"context_line":"    pprint.pprint(diff, indent\u003d2, width\u003d20)"},{"line_number":33,"context_line":"    # For each difference run command"},{"line_number":34,"context_line":"    for el in diff:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_57accb35","line":31,"updated":"2014-06-09 11:22:01.000000000","message":"I am not familiar with alembic and therefore did not know what the diff contents may look like. This made reading/understanding the code below quite an effort. I think we should add some comments here. I can help since I am going through trying to learn it.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    import_tables()"},{"line_number":29,"context_line":"    models_metadata \u003d model_base.BASEV2.metadata"},{"line_number":30,"context_line":"    # Compare metadata from models and metadata from migrations"},{"line_number":31,"context_line":"    diff \u003d autogen.compare_metadata(context.get_context(), models_metadata)"},{"line_number":32,"context_line":"    pprint.pprint(diff, indent\u003d2, width\u003d20)"},{"line_number":33,"context_line":"    # For each difference run command"},{"line_number":34,"context_line":"    for el in diff:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_f2aa4584","line":31,"in_reply_to":"1ae5cdf2_57accb35","updated":"2014-06-09 12:09:00.000000000","message":"Ok I\u0027ll do this, but in alembic doc there is an example http://alembic.readthedocs.org/en/latest/api.html#alembic.autogenerate.compare_metadata","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    models_metadata \u003d model_base.BASEV2.metadata"},{"line_number":30,"context_line":"    # Compare metadata from models and metadata from migrations"},{"line_number":31,"context_line":"    diff \u003d autogen.compare_metadata(context.get_context(), models_metadata)"},{"line_number":32,"context_line":"    pprint.pprint(diff, indent\u003d2, width\u003d20)"},{"line_number":33,"context_line":"    # For each difference run command"},{"line_number":34,"context_line":"    for el in diff:"},{"line_number":35,"context_line":"        parse_command(el)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_772e27a7","line":32,"updated":"2014-06-09 11:22:01.000000000","message":"I presume this is temporary for debugging.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    models_metadata \u003d model_base.BASEV2.metadata"},{"line_number":30,"context_line":"    # Compare metadata from models and metadata from migrations"},{"line_number":31,"context_line":"    diff \u003d autogen.compare_metadata(context.get_context(), models_metadata)"},{"line_number":32,"context_line":"    pprint.pprint(diff, indent\u003d2, width\u003d20)"},{"line_number":33,"context_line":"    # For each difference run command"},{"line_number":34,"context_line":"    for el in diff:"},{"line_number":35,"context_line":"        parse_command(el)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_d2be29d4","line":32,"in_reply_to":"1ae5cdf2_772e27a7","updated":"2014-06-09 12:09:00.000000000","message":"yeap, it is just for me :)","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def parse_command(command):"},{"line_number":38,"context_line":"    if isinstance(command, tuple):"},{"line_number":39,"context_line":"        globals()[command[0]](*command[1:])"},{"line_number":40,"context_line":"    else:"},{"line_number":41,"context_line":"        parse_modify_command(command)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_37d01ff7","line":39,"updated":"2014-06-09 11:22:01.000000000","message":"This is somewhat unusual Python, and I think a comment here would help.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"073b4ed09e717f60867088e644a9e42baf312024","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def parse_command(command):"},{"line_number":38,"context_line":"    if isinstance(command, tuple):"},{"line_number":39,"context_line":"        globals()[command[0]](*command[1:])"},{"line_number":40,"context_line":"    else:"},{"line_number":41,"context_line":"        parse_modify_command(command)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_925e6111","line":39,"in_reply_to":"1ae5cdf2_37d01ff7","updated":"2014-06-09 11:27:19.000000000","message":"I didn\u0027t send some comments from patchset two so I\u0027ll put it here since I was concerned with this line too. \n\nSuggestion: Would it be better (readable and purer) if you would create an instance of class encapsulating below actions and calling\n\n getattr(executor, command[0])(*command[1:])\n\ninstead?","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def parse_command(command):"},{"line_number":38,"context_line":"    if isinstance(command, tuple):"},{"line_number":39,"context_line":"        globals()[command[0]](*command[1:])"},{"line_number":40,"context_line":"    else:"},{"line_number":41,"context_line":"        parse_modify_command(command)"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_ad5dc0ee","line":39,"in_reply_to":"1ae5cdf2_925e6111","updated":"2014-06-09 12:09:00.000000000","message":"I will add comment.\n\n@Jakub Libosvar\t\n\nI can add class but I doubt that it would be better (readable and purer). So I prefer to leave as it is now and add explanatory comment.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def parse_modify_command(command):"},{"line_number":45,"context_line":"    for modifed, _, table, column, existing, new, old in command:"},{"line_number":46,"context_line":"        args \u003d [table, column]"},{"line_number":47,"context_line":"        if modifed.endswith(\u0027type\u0027):"},{"line_number":48,"context_line":"            modifed \u003d \u0027_type\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_b7b98fee","line":45,"updated":"2014-06-09 11:22:01.000000000","message":"s/modifed/modified/","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                    [getattr(col, \"name\", None) for col in index.columns])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(akamyshnikova) dropping tables should be organized more careful."},{"line_number":73,"context_line":"def remove_table(table):"},{"line_number":74,"context_line":"     # op.drop_table(table.name)"},{"line_number":75,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_7780e78b","line":72,"updated":"2014-06-09 11:22:01.000000000","message":"Will we be dropping any tables in heal? If so then the spec is lying.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                    [getattr(col, \"name\", None) for col in index.columns])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"# TODO(akamyshnikova) dropping tables should be organized more careful."},{"line_number":73,"context_line":"def remove_table(table):"},{"line_number":74,"context_line":"     # op.drop_table(table.name)"},{"line_number":75,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_f2fde56f","line":72,"in_reply_to":"1ae5cdf2_7780e78b","updated":"2014-06-09 12:09:00.000000000","message":"Comparison of schema at this moment shows that some tables needs to be removed. I\u0027m not sure as for now it is test checking.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def import_tables():"},{"line_number":100,"context_line":"    # List of all models"},{"line_number":101,"context_line":"    models_modules \u003d ["},{"line_number":102,"context_line":"        \u0027neutron.plugins.ml2.models\u0027,"},{"line_number":103,"context_line":"        \u0027neutron.plugins.ml2.drivers.brocade.db.models\u0027,"},{"line_number":104,"context_line":"        \u0027neutron.plugins.ml2.drivers.cisco.nexus.nexus_models_v2\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_97549322","line":101,"updated":"2014-06-09 11:22:01.000000000","message":"How did you get this list? I got the same, but just curious what your method was.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def import_tables():"},{"line_number":100,"context_line":"    # List of all models"},{"line_number":101,"context_line":"    models_modules \u003d ["},{"line_number":102,"context_line":"        \u0027neutron.plugins.ml2.models\u0027,"},{"line_number":103,"context_line":"        \u0027neutron.plugins.ml2.drivers.brocade.db.models\u0027,"},{"line_number":104,"context_line":"        \u0027neutron.plugins.ml2.drivers.cisco.nexus.nexus_models_v2\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_72c39538","line":101,"in_reply_to":"1ae5cdf2_97549322","updated":"2014-06-09 12:09:00.000000000","message":"I just look through and get files that contain db models.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f34afedf5421506f95188eb58d43c214660d3abf","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \u0027neutron.db.vpn.vpn_db\u0027,"},{"line_number":147,"context_line":"    ]"},{"line_number":148,"context_line":"    for module in models_modules:"},{"line_number":149,"context_line":"        importlib.import_module(module)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_1246d123","line":149,"updated":"2014-06-09 11:30:26.000000000","message":"If the codebase will be \"Juno\", these models are from Juno too. That means we won\u0027t achieve \"icehouse_healed\" state but automated migration from \"old_db\" to \"current_code\" and not to Icehouse models.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \u0027neutron.db.vpn.vpn_db\u0027,"},{"line_number":147,"context_line":"    ]"},{"line_number":148,"context_line":"    for module in models_modules:"},{"line_number":149,"context_line":"        importlib.import_module(module)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_92a9017e","line":149,"in_reply_to":"1ae5cdf2_1246d123","updated":"2014-06-09 12:09:00.000000000","message":"I know that. It is just for now to make it easier :) I still think about way that get icehouse models. Can you suggest one?","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"34ef2babc9dc4170a12202b5c969c7db96d7b7f0","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \u0027neutron.db.vpn.vpn_db\u0027,"},{"line_number":147,"context_line":"    ]"},{"line_number":148,"context_line":"    for module in models_modules:"},{"line_number":149,"context_line":"        importlib.import_module(module)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_8dc0042c","line":149,"in_reply_to":"1ae5cdf2_1246d123","updated":"2014-06-09 12:14:07.000000000","message":"Yes, this is a problem. The only solution I can think of right now is to manually copy-paste all icehouse models here. But I have not had much sleep, so there may be a better way.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"596faf5e1f96e588685597979893f30a49697181","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    #     True,"},{"line_number":55,"context_line":"    #     False)]]"},{"line_number":56,"context_line":"    diff \u003d autogen.compare_metadata(context.get_context(), models_metadata)"},{"line_number":57,"context_line":"    pprint.pprint(diff, indent\u003d2, width\u003d20)"},{"line_number":58,"context_line":"    # For each difference run command"},{"line_number":59,"context_line":"    for el in diff:"},{"line_number":60,"context_line":"        parse_command(el)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_6780504a","line":57,"updated":"2014-06-16 12:05:44.000000000","message":"is this just for logging purposes? if so, we should do it properly","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"58475b0e8359bfd8e1a8898b272ee3a2c1f8783a","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    #     True,"},{"line_number":55,"context_line":"    #     False)]]"},{"line_number":56,"context_line":"    diff \u003d autogen.compare_metadata(context.get_context(), models_metadata)"},{"line_number":57,"context_line":"    pprint.pprint(diff, indent\u003d2, width\u003d20)"},{"line_number":58,"context_line":"    # For each difference run command"},{"line_number":59,"context_line":"    for el in diff:"},{"line_number":60,"context_line":"        parse_command(el)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_c40b5029","line":57,"in_reply_to":"1ae5cdf2_6780504a","updated":"2014-06-19 09:02:22.000000000","message":"This is not logging, this is just for me, for testing.","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"596faf5e1f96e588685597979893f30a49697181","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # Here methods add_table, drop_index, etc is running. Name of method is"},{"line_number":69,"context_line":"        # the first element of the tuple, arguments to this method comes from"},{"line_number":70,"context_line":"        # the next element(s)."},{"line_number":71,"context_line":"        globals()[command[0]](*command[1:])"},{"line_number":72,"context_line":"    else:"},{"line_number":73,"context_line":"        # For all commands that changing type, nullable or other parameters"},{"line_number":74,"context_line":"        # of the column is used alter_column method from alembic."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_276008cf","line":71,"updated":"2014-06-16 12:05:44.000000000","message":"nit: not an issue, but this would probably look cleaner if you used e.g. a dict of functions","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"58475b0e8359bfd8e1a8898b272ee3a2c1f8783a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        # Here methods add_table, drop_index, etc is running. Name of method is"},{"line_number":69,"context_line":"        # the first element of the tuple, arguments to this method comes from"},{"line_number":70,"context_line":"        # the next element(s)."},{"line_number":71,"context_line":"        globals()[command[0]](*command[1:])"},{"line_number":72,"context_line":"    else:"},{"line_number":73,"context_line":"        # For all commands that changing type, nullable or other parameters"},{"line_number":74,"context_line":"        # of the column is used alter_column method from alembic."}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_31650f45","line":71,"in_reply_to":"1ae5cdf2_276008cf","updated":"2014-06-19 09:02:22.000000000","message":"ok, try to replace this.","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"596faf5e1f96e588685597979893f30a49697181","unresolved":false,"context_lines":[{"line_number":104,"context_line":"def add_index(index):"},{"line_number":105,"context_line":"    bind \u003d op.get_bind()"},{"line_number":106,"context_line":"    insp \u003d sqlalchemy.engine.reflection.Inspector.from_engine(bind)"},{"line_number":107,"context_line":"    if not index.name in [idx[\u0027name\u0027] for idx in"},{"line_number":108,"context_line":"                          insp.get_indexes(index.table.name)]:"},{"line_number":109,"context_line":"        op.create_index(index.name, index.table.name,"},{"line_number":110,"context_line":"                        [getattr(col, \"name\", None) for col in index.columns])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_278e487a","line":107,"updated":"2014-06-16 12:05:44.000000000","message":"Hmm, I\u0027m not sure why this is needed as alembic should have provided you with a list of *missing* indexes by now. Could you please elaborate on why you need this check here?","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"58475b0e8359bfd8e1a8898b272ee3a2c1f8783a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"def add_index(index):"},{"line_number":105,"context_line":"    bind \u003d op.get_bind()"},{"line_number":106,"context_line":"    insp \u003d sqlalchemy.engine.reflection.Inspector.from_engine(bind)"},{"line_number":107,"context_line":"    if not index.name in [idx[\u0027name\u0027] for idx in"},{"line_number":108,"context_line":"                          insp.get_indexes(index.table.name)]:"},{"line_number":109,"context_line":"        op.create_index(index.name, index.table.name,"},{"line_number":110,"context_line":"                        [getattr(col, \"name\", None) for col in index.columns])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_98dc4876","line":107,"in_reply_to":"1ae5cdf2_278e487a","updated":"2014-06-19 09:02:22.000000000","message":"This is done because of \u0027quotas\u0027 table. There was a several bugs on this theme.So scrip shows this http://pastebin.com/sX1Qnxyk. And after creating table it fails with creating index, that is way I add this check.","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"596faf5e1f96e588685597979893f30a49697181","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"# TODO(akamyshnikova) dropping tables should be organized more careful."},{"line_number":114,"context_line":"def remove_table(table):"},{"line_number":115,"context_line":"     # op.drop_table(table.name)"},{"line_number":116,"context_line":"    pass"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_4718b475","line":114,"updated":"2014-06-16 12:05:44.000000000","message":"if we enable all the plugins, this should not be needed IMO (only new tables should be created or modifications to existing tables be made by the healing script)","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"58475b0e8359bfd8e1a8898b272ee3a2c1f8783a","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"# TODO(akamyshnikova) dropping tables should be organized more careful."},{"line_number":114,"context_line":"def remove_table(table):"},{"line_number":115,"context_line":"     # op.drop_table(table.name)"},{"line_number":116,"context_line":"    pass"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_71acf79f","line":114,"in_reply_to":"1ae5cdf2_4718b475","updated":"2014-06-19 09:02:22.000000000","message":"And what if table was renamed? Script drop existing table and create new one, in this case don\u0027t we need this?","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"596faf5e1f96e588685597979893f30a49697181","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"# TODO(akamyshnikova): replace importing all existing models with importing"},{"line_number":145,"context_line":"# from current module that contain models state for icehouse."},{"line_number":146,"context_line":"def import_tables():"},{"line_number":147,"context_line":"    # For this moment just import all existing models."},{"line_number":148,"context_line":"    models_modules \u003d ["}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_e76540e3","line":145,"updated":"2014-06-16 12:05:44.000000000","message":"AFAIU, if we already have merged any migration scripts in Juno, we should not heal up to Icehouse state here, but rather to the latest state, right?","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"58475b0e8359bfd8e1a8898b272ee3a2c1f8783a","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"# TODO(akamyshnikova): replace importing all existing models with importing"},{"line_number":145,"context_line":"# from current module that contain models state for icehouse."},{"line_number":146,"context_line":"def import_tables():"},{"line_number":147,"context_line":"    # For this moment just import all existing models."},{"line_number":148,"context_line":"    models_modules \u003d ["}],"source_content_type":"text/x-python","patch_set":8,"id":"1ae5cdf2_b1783f2c","line":145,"in_reply_to":"1ae5cdf2_e76540e3","updated":"2014-06-19 09:02:22.000000000","message":"Will remove the comment.","commit_id":"14fa2651505f4868e54c621e6e6426d8da8a670e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from sqlalchemy import schema as sa_schema"},{"line_number":23,"context_line":"import sqlalchemy.sql.expression as expr"},{"line_number":24,"context_line":"from sqlalchemy.sql import text"},{"line_number":25,"context_line":"import sqlalchemy.types as types"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from neutron.db.migration.models import frozen as frozen_models"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_fc4ae581","line":25,"updated":"2014-07-10 15:32:48.000000000","message":"from sqlalchemy import types","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from sqlalchemy import schema as sa_schema"},{"line_number":23,"context_line":"import sqlalchemy.sql.expression as expr"},{"line_number":24,"context_line":"from sqlalchemy.sql import text"},{"line_number":25,"context_line":"import sqlalchemy.types as types"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from neutron.db.migration.models import frozen as frozen_models"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_08cbb753","line":25,"in_reply_to":"baada198_fc4ae581","updated":"2014-07-11 07:34:52.000000000","message":"Will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        parse_command(el)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def parse_command(command):"},{"line_number":80,"context_line":"    # Commands like add_table, remove_table, add_index, add_column, etc is a"},{"line_number":81,"context_line":"    # tuple and can be handle after running special functions from alembic for"},{"line_number":82,"context_line":"    # them."}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_dc01a107","line":79,"updated":"2014-07-10 15:32:48.000000000","message":"I\u0027d call it \"execute_command\" as it\u0027s actually performing some modifications.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        parse_command(el)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def parse_command(command):"},{"line_number":80,"context_line":"    # Commands like add_table, remove_table, add_index, add_column, etc is a"},{"line_number":81,"context_line":"    # tuple and can be handle after running special functions from alembic for"},{"line_number":82,"context_line":"    # them."}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_28c87b54","line":79,"in_reply_to":"baada198_dc01a107","updated":"2014-07-11 07:34:52.000000000","message":"Will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if isinstance(new, basestring):"},{"line_number":120,"context_line":"            new \u003d text(new)"},{"line_number":121,"context_line":"        kwargs \u003d {modified: new, \u0027schema\u0027: schema}"},{"line_number":122,"context_line":"        if existing.get(\u0027existing_server_default\u0027, None):"},{"line_number":123,"context_line":"            default \u003d existing[\u0027existing_server_default\u0027]"},{"line_number":124,"context_line":"            if isinstance(default, sa_schema.DefaultClause):"},{"line_number":125,"context_line":"                if isinstance(default, basestring):"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_bfc85f75","line":122,"updated":"2014-07-10 15:32:48.000000000","message":"None is default in get(), \"if existing.get(\u0027existing_server_default\u0027)\" is sufficient.\n\n default \u003d existing.get(\u0027existing_server_default\u0027)\n if default:\n     if isinstance(default, sa_schema.DefaultClause):\n         existing[\u0027existing_server_default\u0027] \u003d default.arg.compile(...)\n     elif isinstance(default, basestring):\n         existing[\u0027existing_server_default\u0027] \u003d defalt.arg","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        if existing.get(\u0027existing_server_default\u0027, None):"},{"line_number":123,"context_line":"            default \u003d existing[\u0027existing_server_default\u0027]"},{"line_number":124,"context_line":"            if isinstance(default, sa_schema.DefaultClause):"},{"line_number":125,"context_line":"                if isinstance(default, basestring):"},{"line_number":126,"context_line":"                    existing[\u0027existing_server_default\u0027] \u003d default.arg"},{"line_number":127,"context_line":"                else:"},{"line_number":128,"context_line":"                    existing[\u0027existing_server_default\u0027] \u003d default.arg.compile("}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_5febc3af","line":125,"updated":"2014-07-10 15:32:48.000000000","message":"This seems to be always False.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        if existing.get(\u0027existing_server_default\u0027, None):"},{"line_number":123,"context_line":"            default \u003d existing[\u0027existing_server_default\u0027]"},{"line_number":124,"context_line":"            if isinstance(default, sa_schema.DefaultClause):"},{"line_number":125,"context_line":"                if isinstance(default, basestring):"},{"line_number":126,"context_line":"                    existing[\u0027existing_server_default\u0027] \u003d default.arg"},{"line_number":127,"context_line":"                else:"},{"line_number":128,"context_line":"                    existing[\u0027existing_server_default\u0027] \u003d default.arg.compile("}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_c8ad3f86","line":125,"in_reply_to":"baada198_5febc3af","updated":"2014-07-11 07:34:52.000000000","message":"There should be default.arg. Thanks for pointing this.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                        dialect\u003dbind.engine.name"},{"line_number":130,"context_line":"                    )"},{"line_number":131,"context_line":"        kwargs.update(existing)"},{"line_number":132,"context_line":"        op.alter_column(*args, **kwargs)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"@amethod"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_7fb0878b","line":132,"updated":"2014-07-10 15:32:48.000000000","message":"Suggestion for readability:\n\n op.alter_column(table, column, **kwargs)\n\nand drop L108","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                        dialect\u003dbind.engine.name"},{"line_number":130,"context_line":"                    )"},{"line_number":131,"context_line":"        kwargs.update(existing)"},{"line_number":132,"context_line":"        op.alter_column(*args, **kwargs)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"@amethod"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_48c12f2e","line":132,"in_reply_to":"baada198_7fb0878b","updated":"2014-07-11 07:34:52.000000000","message":"Will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":181,"context_line":"def add_constraint(constraint):"},{"line_number":182,"context_line":"    op.create_unique_constraint(constraint.name, constraint.table.name,"},{"line_number":183,"context_line":"                                [col.name for col in constraint.columns if"},{"line_number":184,"context_line":"                                 hasattr(col, \u0027name\u0027)])"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"@amethod"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_0283b256","line":184,"updated":"2014-07-10 15:32:48.000000000","message":"It has the same pattern as L150, you can consider a function for that\n\n def column_names(obj):\n     return [col.name for col in obj.columns if hasattr(col, \u0027name\u0027)]\n\n op.create_unique_constraint(constraint.name, constraint.table.name,\n                             column_names(constraint))","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":181,"context_line":"def add_constraint(constraint):"},{"line_number":182,"context_line":"    op.create_unique_constraint(constraint.name, constraint.table.name,"},{"line_number":183,"context_line":"                                [col.name for col in constraint.columns if"},{"line_number":184,"context_line":"                                 hasattr(col, \u0027name\u0027)])"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"@amethod"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_68ec33bc","line":184,"in_reply_to":"baada198_0283b256","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                          fk_remote_cols)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"def check_foreign_keys(metabata):"},{"line_number":209,"context_line":"    # This methods checks foreign keys that tables contain in models with"},{"line_number":210,"context_line":"    # foreign keys that are in db."},{"line_number":211,"context_line":"    diff \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_fedadc15","line":208,"updated":"2014-07-10 15:32:48.000000000","message":"Typo: metabata -\u003e metadata","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                          fk_remote_cols)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"def check_foreign_keys(metabata):"},{"line_number":209,"context_line":"    # This methods checks foreign keys that tables contain in models with"},{"line_number":210,"context_line":"    # foreign keys that are in db."},{"line_number":211,"context_line":"    diff \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_c8329f5d","line":208,"in_reply_to":"baada198_fedadc15","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        fk_db \u003d dict((_get_fk_info_db(i), i[\u0027name\u0027]) for i in"},{"line_number":221,"context_line":"                     insp.get_foreign_keys(table))"},{"line_number":222,"context_line":"        fk_db_set \u003d set(fk_db.keys())"},{"line_number":223,"context_line":"        if table not in model_tables.keys():"},{"line_number":224,"context_line":"            continue"},{"line_number":225,"context_line":"        # Get all necessary information about key of current table from models"},{"line_number":226,"context_line":"        fk_models \u003d dict((_get_fk_info_from_model(fk), fk) for fk in"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_3e1294b4","line":223,"updated":"2014-07-10 15:32:48.000000000","message":"calling keys() is not necessary:\n\n if table not in model_tables:\n\nI think this condition can be moved to L219","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        fk_db \u003d dict((_get_fk_info_db(i), i[\u0027name\u0027]) for i in"},{"line_number":221,"context_line":"                     insp.get_foreign_keys(table))"},{"line_number":222,"context_line":"        fk_db_set \u003d set(fk_db.keys())"},{"line_number":223,"context_line":"        if table not in model_tables.keys():"},{"line_number":224,"context_line":"            continue"},{"line_number":225,"context_line":"        # Get all necessary information about key of current table from models"},{"line_number":226,"context_line":"        fk_models \u003d dict((_get_fk_info_from_model(fk), fk) for fk in"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_c809bf85","line":223,"in_reply_to":"baada198_3e1294b4","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    # This functions checks if table exists or not"},{"line_number":243,"context_line":"    bind \u003d op.get_bind()"},{"line_number":244,"context_line":"    insp \u003d sqlalchemy.engine.reflection.Inspector.from_engine(bind)"},{"line_number":245,"context_line":"    return table in insp.get_table_names() and table \\"},{"line_number":246,"context_line":"        not in frozen_models.renamed_tables.keys()"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_9c63a9dc","line":245,"updated":"2014-07-10 15:32:48.000000000","message":"return (table in insp.get_table_names() and\n        table not in frozen_models)","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":242,"context_line":"    # This functions checks if table exists or not"},{"line_number":243,"context_line":"    bind \u003d op.get_bind()"},{"line_number":244,"context_line":"    insp \u003d sqlalchemy.engine.reflection.Inspector.from_engine(bind)"},{"line_number":245,"context_line":"    return table in insp.get_table_names() and table \\"},{"line_number":246,"context_line":"        not in frozen_models.renamed_tables.keys()"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_08273713","line":245,"in_reply_to":"baada198_9c63a9dc","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    # if it does the previous one will be renamed."},{"line_number":252,"context_line":"    # Returns True/False if it is needed to create new table"},{"line_number":253,"context_line":"    create \u003d False"},{"line_number":254,"context_line":"    if table in frozen_models.renamed_tables.keys():"},{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_bc906d96","line":254,"updated":"2014-07-10 15:32:48.000000000","message":"if (table in frozen_models.renamed_tables and\n         check_if_table_exists(fozen_models.renamed_tables[table]):\n     ...","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":251,"context_line":"    # if it does the previous one will be renamed."},{"line_number":252,"context_line":"    # Returns True/False if it is needed to create new table"},{"line_number":253,"context_line":"    create \u003d False"},{"line_number":254,"context_line":"    if table in frozen_models.renamed_tables.keys():"},{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_481dafbd","line":254,"in_reply_to":"baada198_bc906d96","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    # Returns True/False if it is needed to create new table"},{"line_number":253,"context_line":"    create \u003d False"},{"line_number":254,"context_line":"    if table in frozen_models.renamed_tables.keys():"},{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"},{"line_number":258,"context_line":"    return create"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_9cd80981","line":255,"updated":"2014-07-10 15:32:48.000000000","message":"Suggestion: I think it would be useful to put LOG.info in here to see what tables were renamed.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    # Returns True/False if it is needed to create new table"},{"line_number":253,"context_line":"    create \u003d False"},{"line_number":254,"context_line":"    if table in frozen_models.renamed_tables.keys():"},{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"},{"line_number":258,"context_line":"    return create"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_887a67ef","line":255,"in_reply_to":"baada198_9cd80981","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    if table in frozen_models.renamed_tables.keys():"},{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"},{"line_number":258,"context_line":"    return create"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_3f3c4fe2","line":257,"updated":"2014-07-10 15:32:48.000000000","message":"return True","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    if table in frozen_models.renamed_tables.keys():"},{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"},{"line_number":258,"context_line":"    return create"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_a87f2bdf","line":257,"in_reply_to":"baada198_3f3c4fe2","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"},{"line_number":258,"context_line":"    return create"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"def _get_fk_info_db(fk):"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_9f72bbe1","line":258,"updated":"2014-07-10 15:32:48.000000000","message":"return False","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        if check_if_table_exists(frozen_models.renamed_tables[table]):"},{"line_number":256,"context_line":"            op.rename_table(frozen_models.renamed_tables[table], table)"},{"line_number":257,"context_line":"            create \u003d True"},{"line_number":258,"context_line":"    return create"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"def _get_fk_info_db(fk):"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_086e572f","line":258,"in_reply_to":"baada198_9f72bbe1","updated":"2014-07-11 07:34:52.000000000","message":"will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    if isinstance(meta_type, BOOLEAN_METADATA):"},{"line_number":288,"context_line":"        return not isinstance(insp_type, BOOLEAN_SQL)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    return None  # tells alembic to use the default comparison method"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"def _compare_server_default(ctxt, ins_col, meta_col, insp_def, meta_def,"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_7c72557d","line":290,"updated":"2014-07-10 15:32:48.000000000","message":"This line is not needed.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":287,"context_line":"    if isinstance(meta_type, BOOLEAN_METADATA):"},{"line_number":288,"context_line":"        return not isinstance(insp_type, BOOLEAN_SQL)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    return None  # tells alembic to use the default comparison method"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"def _compare_server_default(ctxt, ins_col, meta_col, insp_def, meta_def,"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_6866f3bc","line":290,"in_reply_to":"baada198_7c72557d","updated":"2014-07-11 07:34:52.000000000","message":"This line is needed as I redefine method only in one case.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":317,"context_line":"            isinstance(meta_def.arg, expr.False_) and insp_def \u003d\u003d \"\u00270\u0027\""},{"line_number":318,"context_line":"        )"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    return None  # tells alembic to use the default comparison method"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_bc1a2d15","line":320,"updated":"2014-07-10 15:32:48.000000000","message":"Not needed.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":317,"context_line":"            isinstance(meta_def.arg, expr.False_) and insp_def \u003d\u003d \"\u00270\u0027\""},{"line_number":318,"context_line":"        )"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    return None  # tells alembic to use the default comparison method"}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_a80babd4","line":320,"in_reply_to":"baada198_bc1a2d15","updated":"2014-07-11 07:34:52.000000000","message":"The same. Here is redefined only for mysql dialect.","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e8ba2cc46e694031ee3600ce612a0d385ef60961","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        execute_command(el)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def execute_command(command):"},{"line_number":80,"context_line":"    # Commands like add_table, remove_table, add_index, add_column, etc is a"},{"line_number":81,"context_line":"    # tuple and can be handle after running special functions from alembic for"},{"line_number":82,"context_line":"    # them."}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_a64bbdaf","line":79,"updated":"2014-07-11 21:07:56.000000000","message":"Nit: For clarity, rename to \u0027execute_alembic_command()\u0027?","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"478f51eb3763b485fa6e00777aa3b5efe5b63e57","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        execute_command(el)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"def execute_command(command):"},{"line_number":80,"context_line":"    # Commands like add_table, remove_table, add_index, add_column, etc is a"},{"line_number":81,"context_line":"    # tuple and can be handle after running special functions from alembic for"},{"line_number":82,"context_line":"    # them."}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_b1283934","line":79,"in_reply_to":"baada198_a64bbdaf","updated":"2014-07-14 11:40:41.000000000","message":"done","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e8ba2cc46e694031ee3600ce612a0d385ef60961","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        parse_modify_command(command)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def amethod(f):"},{"line_number":95,"context_line":"    METHODS[f.__name__] \u003d f"},{"line_number":96,"context_line":"    return f"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_0667094e","line":94,"updated":"2014-07-11 21:07:56.000000000","message":"Name this decorator \u0027alembic_command_method\u0027 for clarity? Also, can you move it down below parse_modify_command?","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"478f51eb3763b485fa6e00777aa3b5efe5b63e57","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        parse_modify_command(command)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def amethod(f):"},{"line_number":95,"context_line":"    METHODS[f.__name__] \u003d f"},{"line_number":96,"context_line":"    return f"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_f11d5110","line":94,"in_reply_to":"baada198_0667094e","updated":"2014-07-14 11:40:41.000000000","message":"done","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"16776af69cd4f8b84bd037c10ffd253aaac6c6ee","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from alembic import autogenerate as autogen"},{"line_number":18,"context_line":"from alembic import context"},{"line_number":19,"context_line":"from alembic import op"},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import schema as sa_schema"},{"line_number":23,"context_line":"import sqlalchemy.sql.expression as expr"}],"source_content_type":"text/x-python","patch_set":40,"id":"baada198_9e45cf70","line":20,"updated":"2014-07-15 11:15:18.000000000","message":"Nit: This should be alone on line 14","commit_id":"b47ccc8fe2a01dfd73cd8e9710a24eda33384ce2"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"8f6c2395c5e89ffb13074e51629e30327bb62dba","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from alembic import autogenerate as autogen"},{"line_number":18,"context_line":"from alembic import context"},{"line_number":19,"context_line":"from alembic import op"},{"line_number":20,"context_line":"import logging"},{"line_number":21,"context_line":"import sqlalchemy"},{"line_number":22,"context_line":"from sqlalchemy import schema as sa_schema"},{"line_number":23,"context_line":"import sqlalchemy.sql.expression as expr"}],"source_content_type":"text/x-python","patch_set":40,"id":"baada198_447608a5","line":20,"in_reply_to":"baada198_9e45cf70","updated":"2014-07-15 11:22:17.000000000","message":"done","commit_id":"b47ccc8fe2a01dfd73cd8e9710a24eda33384ce2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"16776af69cd4f8b84bd037c10ffd253aaac6c6ee","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            new \u003d text(new)"},{"line_number":115,"context_line":"        kwargs \u003d {modified: new, \u0027schema\u0027: schema}"},{"line_number":116,"context_line":"        default \u003d existing.get(\u0027existing_server_default\u0027)"},{"line_number":117,"context_line":"        if default:"},{"line_number":118,"context_line":"            if isinstance(default, sa_schema.DefaultClause):"},{"line_number":119,"context_line":"                if isinstance(default.arg, basestring):"},{"line_number":120,"context_line":"                    existing[\u0027existing_server_default\u0027] \u003d default.arg"}],"source_content_type":"text/x-python","patch_set":40,"id":"baada198_7e39dbf0","line":117,"updated":"2014-07-15 11:15:18.000000000","message":"L117 and L118 could be together:\n\n if default and isinstance():","commit_id":"b47ccc8fe2a01dfd73cd8e9710a24eda33384ce2"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"8f6c2395c5e89ffb13074e51629e30327bb62dba","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            new \u003d text(new)"},{"line_number":115,"context_line":"        kwargs \u003d {modified: new, \u0027schema\u0027: schema}"},{"line_number":116,"context_line":"        default \u003d existing.get(\u0027existing_server_default\u0027)"},{"line_number":117,"context_line":"        if default:"},{"line_number":118,"context_line":"            if isinstance(default, sa_schema.DefaultClause):"},{"line_number":119,"context_line":"                if isinstance(default.arg, basestring):"},{"line_number":120,"context_line":"                    existing[\u0027existing_server_default\u0027] \u003d default.arg"}],"source_content_type":"text/x-python","patch_set":40,"id":"baada198_64794c92","line":117,"in_reply_to":"baada198_7e39dbf0","updated":"2014-07-15 11:22:17.000000000","message":"done","commit_id":"b47ccc8fe2a01dfd73cd8e9710a24eda33384ce2"}],"neutron/db/migration/alembic_migrations/versions/1d6ee1ae5da5_add_all_tables.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"add_all_tables_before_icehouse"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 1d6ee1ae5da5"},{"line_number":19,"context_line":"Revises: 10cd28e692e9"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_fc593c8f","line":16,"updated":"2014-06-09 11:22:01.000000000","message":"Do we need to mention icehouse?","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"add_all_tables_before_icehouse"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: 1d6ee1ae5da5"},{"line_number":19,"context_line":"Revises: 10cd28e692e9"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_f234054c","line":16,"in_reply_to":"1ae5cdf2_fc593c8f","updated":"2014-06-09 12:09:00.000000000","message":"I\u0027m not sure. May be it is good as there some migrations after icehouse already.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# revision identifiers, used by Alembic."},{"line_number":25,"context_line":"revision \u003d \u00271d6ee1ae5da5\u0027"},{"line_number":26,"context_line":"down_revision \u003d \u002710cd28e692e9\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import alembic as op"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_9ce1189d","line":25,"updated":"2014-06-09 11:22:01.000000000","message":"We should give it a special name. In the spec I suggested \"all_tables\".","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# revision identifiers, used by Alembic."},{"line_number":25,"context_line":"revision \u003d \u00271d6ee1ae5da5\u0027"},{"line_number":26,"context_line":"down_revision \u003d \u002710cd28e692e9\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import alembic as op"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_523bf937","line":25,"in_reply_to":"1ae5cdf2_9ce1189d","updated":"2014-06-09 12:09:00.000000000","message":"Ok","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# revision identifiers, used by Alembic."},{"line_number":25,"context_line":"revision \u003d \u00271d6ee1ae5da5\u0027"},{"line_number":26,"context_line":"down_revision \u003d \u002710cd28e692e9\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import alembic as op"},{"line_number":29,"context_line":"from neutron.db.migration.alembic_migrations import heal_script"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_bcbb3474","line":26,"updated":"2014-06-09 11:22:01.000000000","message":"Down revision should be \"icehouse_release\". This requires patching existing post-icehouse scripts, so I am OK with deferring for a few more patch sets until the script is mature.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e6ed6419d200390b6d9332619755490bb85c9286","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":33,"context_line":"    heal_script.heal()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_9ca67852","line":33,"updated":"2014-06-09 11:22:01.000000000","message":"Do we need to have this in a separate module? Why can\u0027t it be done here?","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"bdbc1502bc7abaf2d71673f27869eb1467ed5171","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":33,"context_line":"    heal_script.heal()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_72e475ac","line":33,"in_reply_to":"1ae5cdf2_9ca67852","updated":"2014-06-09 12:09:00.000000000","message":"In my first patch set I do all of this in migration then I move all logic into separate file. I think it is better as all migrations will look the same just upgrade and downgrade without a lot of exta methods.","commit_id":"21d3e9705f368118624551edf9a9ddbcf76c0a82"}],"neutron/db/migration/alembic_migrations/versions/1d6ee1ae5da5_db_healing.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"601939717ca77fddda42fc8dd8f62da1cff75bbb","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"make migrations unconditional"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: all_tables"},{"line_number":19,"context_line":"Revises: 10cd28e692e9"},{"line_number":20,"context_line":"Create Date: 2014-05-29 10:52:43.898980"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_a2c5a63e","line":18,"updated":"2014-07-10 15:32:48.000000000","message":"Nit: this needs to be modified :)","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"d9878c78689c6a500deb9399b701aec5f658a0bc","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"make migrations unconditional"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Revision ID: all_tables"},{"line_number":19,"context_line":"Revises: 10cd28e692e9"},{"line_number":20,"context_line":"Create Date: 2014-05-29 10:52:43.898980"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"baada198_8861873b","line":18,"in_reply_to":"baada198_a2c5a63e","updated":"2014-07-11 07:34:52.000000000","message":"Thanks, will do","commit_id":"0a9a8307000677cc03d72a2db8038d147210bff5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"757734e2a601db7c6c487955faba3dc3fdb86132","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":37,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_44b4a181","line":37,"updated":"2014-07-11 18:13:32.000000000","message":"wouldn\u0027t it be better to raise here? To warn the user there\u0027s no going back?","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e8ba2cc46e694031ee3600ce612a0d385ef60961","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":37,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_e63855a2","line":37,"in_reply_to":"baada198_44b4a181","updated":"2014-07-11 21:07:56.000000000","message":"Actually, going back is supposed to be OK according the the spec at http://git.openstack.org/cgit/openstack/neutron-specs/tree/specs/juno/db-migration-refactoring.rst\n\nHowever, I am wondering if the renamed_tables is causing an irreversible situation? I need to test this.","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"b56a608cb79522d22f9a3ca2f007220fa4844ed8","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def downgrade(active_plugins\u003dNone, options\u003dNone):"},{"line_number":37,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_4a64a3b8","line":37,"in_reply_to":"baada198_e63855a2","updated":"2014-07-11 22:23:46.000000000","message":"This does not seem to be a problem. In my test I do not have a table that needs to be renamed when the healing is run. The only situation where that can happen (as far as I can see) is if the table was created with the old name and then the legacy migration that changes its name is not run for some reason (due to change in config?) before the healing. If a downgrade from healing is done then the table will have the new name, and either it will not be used, or its legacy migration will run to rename it to the old name.\n\nI hope I got that right.","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"}],"neutron/db/migration/models/frozen.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"757734e2a601db7c6c487955faba3dc3fdb86132","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from neutron.openstack.common import uuidutils"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"renamed_tables \u003d {"},{"line_number":38,"context_line":"    \u0027subnetroutes\u0027: \u0027routes\u0027,"},{"line_number":39,"context_line":"    \u0027cisco_credentials\u0027: \u0027credentials\u0027,"},{"line_number":40,"context_line":"    \u0027cisco_nexusport_bindings\u0027: \u0027nexusport_bindings\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_643e05dc","line":37,"updated":"2014-07-11 18:13:32.000000000","message":"maybe add a comment that distinguish right from left? i.e.\n\n# new_tablename: old_tablename","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"478f51eb3763b485fa6e00777aa3b5efe5b63e57","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from neutron.openstack.common import uuidutils"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"renamed_tables \u003d {"},{"line_number":38,"context_line":"    \u0027subnetroutes\u0027: \u0027routes\u0027,"},{"line_number":39,"context_line":"    \u0027cisco_credentials\u0027: \u0027credentials\u0027,"},{"line_number":40,"context_line":"    \u0027cisco_nexusport_bindings\u0027: \u0027nexusport_bindings\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"baada198_e4974aea","line":37,"in_reply_to":"baada198_643e05dc","updated":"2014-07-14 11:40:41.000000000","message":"done","commit_id":"69e3048d6a7fdf9112d241d8d573d6330550a077"}]}
