)]}'
{"ironic/db/sqlalchemy/alembic.ini":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# the \u0027revision\u0027 command, regardless of autogenerate"},{"line_number":16,"context_line":"# revision_environment \u003d false"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"sqlalchemy.url \u003d driver://user:pass@localhost/dbname"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":3,"id":"AAAAUH%2F%2FGRE%3D","line":18,"updated":"2014-01-17 14:00:26.000000000","message":"I\u0027d rather DB url was obtained from cfg.CONF at runtime (so that DB url could be put to  ironic.conf file)","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"931454a429c4eda9c11e5ef3e86106c73dca124a","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# the \u0027revision\u0027 command, regardless of autogenerate"},{"line_number":16,"context_line":"# revision_environment \u003d false"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"sqlalchemy.url \u003d driver://user:pass@localhost/dbname"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Logging configuration"}],"source_content_type":"text/x-properties","patch_set":3,"id":"AAAAUH%2F%2FGFw%3D","line":18,"in_reply_to":"AAAAUH%2F%2FGRE%3D","updated":"2014-01-17 14:17:28.000000000","message":"this is config file, I can comment this out\nBut it makes no difference","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"}],"ironic/db/sqlalchemy/alembic/README":[{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ab05b5794cc06e103ce25c24449fe810e31ff8d7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Generic single-database configuration."}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAUH%2F%2B%2BoQ%3D","line":1,"updated":"2014-01-20 06:58:12.000000000","message":"It is better we port the alembic README from other project, such as Ceilometer [1], to make sure we have guideline about how to create new alembic revision scripts by alembic command.\n\n[1] https://github.com/openstack/ceilometer/blob/master/ceilometer/storage/sqlalchemy/alembic/README","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":3,"context_line":"To create alembic migrations use:"},{"line_number":4,"context_line":"$ ironic-dbsync revision --message --autogenerate"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Stamp db with most recent migraion version, without running actulal migrations"},{"line_number":7,"context_line":"$ ironic-dbsync stamp head"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Upgrade can be performed by:"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAUH%2F%2B8d4%3D","line":6,"updated":"2014-01-20 15:02:03.000000000","message":"nit: migration\n\nnit: without actually running migrations","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":4,"context_line":"$ ironic-dbsync revision --message --autogenerate"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Stamp db with most recent migraion version, without running actulal migrations"},{"line_number":7,"context_line":"$ ironic-dbsync stamp head"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Upgrade can be performed by:"},{"line_number":10,"context_line":"$ ironic-dbsync - for backward compatibility"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAUH%2F%2B8b4%3D","line":7,"updated":"2014-01-20 15:02:03.000000000","message":"this fails for me:\n\n(py27)rpodolyaka@rpodolyaka-pc:~/src/ironic$ ironic-dbsync --config-file etc/ironic/ironic.conf.sample stamp head\nusage: ironic-dbsync [-h] [--config-dir DIR] [--config-file PATH] [--debug]\n                     [--log-config-append PATH]\n                     [--log-date-format DATE_FORMAT] [--log-dir LOG_DIR]\n                     [--log-file PATH] [--log-format FORMAT] [--nodebug]\n                     [--nouse-syslog] [--noverbose]\n                     [--syslog-log-facility SYSLOG_LOG_FACILITY]\n                     [--use-syslog] [--verbose] [--version]\n                     {upgrade,downgrade,stamp,revision,version} ...\nironic-dbsync: error: unrecognized arguments: head","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"3e329d781318355a5c26f6bee4a5842d1f2f3e06","unresolved":false,"context_lines":[{"line_number":4,"context_line":"$ ironic-dbsync revision --message --autogenerate"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Stamp db with most recent migraion version, without running actulal migrations"},{"line_number":7,"context_line":"$ ironic-dbsync stamp head"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Upgrade can be performed by:"},{"line_number":10,"context_line":"$ ironic-dbsync - for backward compatibility"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAUH%2F%2B8Qc%3D","line":7,"in_reply_to":"AAAAUH%2F%2B8b4%3D","updated":"2014-01-20 15:20:19.000000000","message":"oh, i forgot about --version arg","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Upgrade can be performed by:"},{"line_number":10,"context_line":"$ ironic-dbsync - for backward compatibility"},{"line_number":11,"context_line":"$ ironic-dbsync upgrade"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Downgrading db:"},{"line_number":14,"context_line":"$ ironic-dbsync downgrade"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAUH%2F%2B8dQ%3D","line":11,"updated":"2014-01-20 15:02:03.000000000","message":"nit: add an example passing version  value here?","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Downgrading db:"},{"line_number":14,"context_line":"$ ironic-dbsync downgrade"},{"line_number":15,"context_line":"$ ironic-dbsync dograde base"}],"source_content_type":"application/octet-stream","patch_set":6,"id":"AAAAUH%2F%2B8dc%3D","line":15,"updated":"2014-01-20 15:02:03.000000000","message":"fails ditto\n\nnit: downgrade","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":3,"context_line":"To create alembic migrations use:"},{"line_number":4,"context_line":"$ ironic-dbsync revision --message --autogenerate"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"Stamp db with most recent migraion version, without actually running migrations"},{"line_number":7,"context_line":"$ ironic-dbsync stamp --revision head"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Upgrade can be performed by:"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"AAAAUH%2F%2Bp14%3D","line":6,"updated":"2014-01-23 14:35:51.000000000","message":"nit: migration","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"}],"ironic/db/sqlalchemy/alembic/env.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    script output."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    url \u003d config.get_main_option(\"url\")"},{"line_number":52,"context_line":"    context.configure(url\u003durl)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    with context.begin_transaction():"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGQs%3D","line":51,"updated":"2014-01-17 14:00:26.000000000","message":"cfg.CONF ditto","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"931454a429c4eda9c11e5ef3e86106c73dca124a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    script output."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    url \u003d config.get_main_option(\"url\")"},{"line_number":52,"context_line":"    context.configure(url\u003durl)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    with context.begin_transaction():"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGEI%3D","line":51,"in_reply_to":"AAAAUH%2F%2FGQs%3D","updated":"2014-01-17 14:17:28.000000000","message":"test_migrations.py should be performed with different engines","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    and associate a connection with the context."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    \"\"\""},{"line_number":65,"context_line":"    url \u003d config.get_main_option(\u0027url\u0027)"},{"line_number":66,"context_line":"    if url:"},{"line_number":67,"context_line":"        engine \u003d sqlalchemy_session.create_engine(url)"},{"line_number":68,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGPw%3D","line":65,"updated":"2014-01-17 14:00:26.000000000","message":"ditto (we could simplify this to obtain engine instance by just calling sqlalchemy_session.get_engine())","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"931454a429c4eda9c11e5ef3e86106c73dca124a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    and associate a connection with the context."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    \"\"\""},{"line_number":65,"context_line":"    url \u003d config.get_main_option(\u0027url\u0027)"},{"line_number":66,"context_line":"    if url:"},{"line_number":67,"context_line":"        engine \u003d sqlalchemy_session.create_engine(url)"},{"line_number":68,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGFQ%3D","line":65,"in_reply_to":"AAAAUH%2F%2FGPw%3D","updated":"2014-01-17 14:17:28.000000000","message":"there is reason for this hack.\n test_migrations.py, that should be performed with separate engine","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# ... etc."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def run_migrations_offline():"},{"line_number":40,"context_line":"    \"\"\"Run migrations in \u0027offline\u0027 mode."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    This configures the context with just a URL"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8bE%3D","line":39,"updated":"2014-01-20 15:02:03.000000000","message":"is there a way to run migrations offline? (not critical now, but could be useful)","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"58659a73b59eab4f7c041e30e5122f5ed0979c03","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# ... etc."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def run_migrations_offline():"},{"line_number":40,"context_line":"    \"\"\"Run migrations in \u0027offline\u0027 mode."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    This configures the context with just a URL"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8OY%3D","line":39,"in_reply_to":"AAAAUH%2F%2B8bE%3D","updated":"2014-01-20 15:25:26.000000000","message":"It is not posible now, it requires some alembic api tuning.\nCan you provide examples, where it can be useful?\nI am thinking about deleting this part of script..","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# ... etc."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def run_migrations_offline():"},{"line_number":40,"context_line":"    \"\"\"Run migrations in \u0027offline\u0027 mode."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    This configures the context with just a URL"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bp1Q%3D","line":39,"updated":"2014-01-23 14:35:51.000000000","message":"I tend to agree with you here: if we don\u0027t allow users to run migrations in offline mode, then there is little sense to provide its support. Maybe we should just drop it?","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"}],"ironic/db/sqlalchemy/alembic/versions/2581ebaf0cb2_initial_migration.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":75,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027node_uuid_ux\u0027)"},{"line_number":76,"context_line":"    )"},{"line_number":77,"context_line":"    op.create_index(\u0027node_instance_uuid\u0027, \u0027nodes\u0027, [\u0027instance_uuid\u0027],"},{"line_number":78,"context_line":"                    unique\u003dFalse)"},{"line_number":79,"context_line":"    op.create_table("},{"line_number":80,"context_line":"        \u0027ports\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGPA%3D","line":77,"updated":"2014-01-17 14:00:26.000000000","message":"could we put this directly to create_table()?","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"def downgrade():"},{"line_number":97,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":98,"context_line":"    op.drop_table(\u0027ports\u0027)"},{"line_number":99,"context_line":"    op.drop_index(\u0027node_instance_uuid\u0027, \u0027nodes\u0027)"},{"line_number":100,"context_line":"    op.drop_table(\u0027nodes\u0027)"},{"line_number":101,"context_line":"    op.drop_table(\u0027chassis\u0027)"},{"line_number":102,"context_line":"    op.drop_table(\u0027conductors\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGPM%3D","line":99,"updated":"2014-01-17 14:00:26.000000000","message":"hmm, is this really needed?","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"cb4358785a814852e7686d97906c121d0ea05375","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sa.Column(\u0027hostname\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":38,"context_line":"        sa.Column(\u0027drivers\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":39,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":40,"context_line":"        sa.UniqueConstraint(\u0027hostname\u0027, name\u003d\u0027uniq_conductors0hostname\u0027)"},{"line_number":41,"context_line":"    )"},{"line_number":42,"context_line":"    op.create_table("},{"line_number":43,"context_line":"        \u0027chassis\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2Br4%3D","line":40,"updated":"2014-01-20 06:43:22.000000000","message":"We can not assume the default engine is \u0027InnoDB\u0027 and the default charset is \u0027UTF-8\u0027, so suggest add these default settings for each table:\n\n    mysql_ENGINE\u003d\u0027InnoDB\u0027,\n    mysql_DEFAULT_CHARSET\u003d\u0027\u0027UTF8\u0027)","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"cb4358785a814852e7686d97906c121d0ea05375","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":49,"context_line":"        sa.Column(\u0027description\u0027, sa.String(length\u003d255), nullable\u003dTrue),"},{"line_number":50,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":51,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027uniq_chassis0uuid\u0027)"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":"    op.create_table("},{"line_number":54,"context_line":"        \u0027nodes\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2Bro%3D","line":51,"updated":"2014-01-20 06:43:22.000000000","message":"ditto with L40","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"cb4358785a814852e7686d97906c121d0ea05375","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":73,"context_line":"        sa.ForeignKeyConstraint([\u0027chassis_id\u0027], [\u0027chassis.id\u0027], ),"},{"line_number":74,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":75,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027node_uuid_ux\u0027)"},{"line_number":76,"context_line":"    )"},{"line_number":77,"context_line":"    op.create_index(\u0027node_instance_uuid\u0027, \u0027nodes\u0027, [\u0027instance_uuid\u0027],"},{"line_number":78,"context_line":"                    unique\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2Brk%3D","line":75,"updated":"2014-01-20 06:43:22.000000000","message":"ditto with L40","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"cb4358785a814852e7686d97906c121d0ea05375","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":88,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":89,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":90,"context_line":"        sa.UniqueConstraint(\u0027address\u0027, name\u003d\u0027iface_address_ux\u0027),"},{"line_number":91,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027port_uuid_ux\u0027)"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    ### end Alembic commands ###"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2Bqg%3D","line":90,"updated":"2014-01-20 06:43:22.000000000","message":"This ports.address column unique constraint is involved by [1], it supports \u0027sqlite\u0027 database only, so please ensure we can pass all testcase with MySQL database with alembic migration scripts.\n\nhttps://github.com/openstack/ironic/blob/master/ironic/db/sqlalchemy/migrate_repo/versions/014_add_address_uc_sqlite.py#L21","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"6b0194d2d176ac4a86ce38e66a7589a7fd716492","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":88,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":89,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":90,"context_line":"        sa.UniqueConstraint(\u0027address\u0027, name\u003d\u0027iface_address_ux\u0027),"},{"line_number":91,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027port_uuid_ux\u0027)"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    ### end Alembic commands ###"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2BKM%3D","line":90,"in_reply_to":"AAAAUH%2F%2B%2BOg%3D","updated":"2014-01-20 08:55:50.000000000","message":"Hi Dmitry Shulyak\n\nYes, we should be unique for MySQL only, I am not sure why our existing code [1] support  \u0027sqlite\u0027 database only for this ports.address column unique constraint, so we have to take care if all the test case pass the unittest code with MySQL now.\n\n[1] https://github.com/openstack/ironic/blob/master/ironic/db/sqlalchemy/migrate_repo/versions/014_add_address_uc_sqlite.py#L21 \n\nPlease ping me in IRC if you have more concern, thanks.\n\n\nHaomeng","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"3613fdbdd6df1290ecf8384b6b515848e4fb8f39","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":88,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":89,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":90,"context_line":"        sa.UniqueConstraint(\u0027address\u0027, name\u003d\u0027iface_address_ux\u0027),"},{"line_number":91,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027port_uuid_ux\u0027)"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    ### end Alembic commands ###"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2BOg%3D","line":90,"in_reply_to":"AAAAUH%2F%2B%2Bqg%3D","updated":"2014-01-20 08:39:27.000000000","message":"Why address should be unique only with sqlite backend?","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"cb4358785a814852e7686d97906c121d0ea05375","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":89,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":90,"context_line":"        sa.UniqueConstraint(\u0027address\u0027, name\u003d\u0027iface_address_ux\u0027),"},{"line_number":91,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027port_uuid_ux\u0027)"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    ### end Alembic commands ###"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2B%2Brg%3D","line":91,"updated":"2014-01-20 06:43:22.000000000","message":"ditto with L40","commit_id":"df41d49f0fbaed1a46445c8a6751654bc2084525"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":77,"context_line":"        sa.ForeignKeyConstraint([\u0027chassis_id\u0027], [\u0027chassis.id\u0027], ),"},{"line_number":78,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":79,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027node_uuid_ux\u0027),"},{"line_number":80,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":81,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"},{"line_number":82,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8fc%3D","line":79,"updated":"2014-01-20 15:02:03.000000000","message":"we could use this chance to rename this unqiue constraint to match our naming convention (uniq_tablename0col_a0col_b),\n\ni.e. uniq_nodes0uuid","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        sa.Column(\u0027extra\u0027, sa.Text(), nullable\u003dTrue),"},{"line_number":94,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":95,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":96,"context_line":"        sa.UniqueConstraint(\u0027address\u0027, name\u003d\u0027iface_address_ux\u0027),"},{"line_number":97,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027port_uuid_ux\u0027),"},{"line_number":98,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":99,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8fY%3D","line":96,"updated":"2014-01-20 15:02:03.000000000","message":"ditto","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027], ),"},{"line_number":95,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":96,"context_line":"        sa.UniqueConstraint(\u0027address\u0027, name\u003d\u0027iface_address_ux\u0027),"},{"line_number":97,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027, name\u003d\u0027port_uuid_ux\u0027),"},{"line_number":98,"context_line":"        mysql_ENGINE\u003d\u0027InnoDB\u0027,"},{"line_number":99,"context_line":"        mysql_DEFAULT_CHARSET\u003d\u0027UTF8\u0027"},{"line_number":100,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8fU%3D","line":97,"updated":"2014-01-20 15:02:03.000000000","message":"ditto","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"37d21202f737d9035832ce993f41872c83ca55af","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    ### end Alembic commands ###"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def downgrade():"},{"line_number":105,"context_line":"    ### commands auto generated by Alembic - please adjust! ###"},{"line_number":106,"context_line":"    op.drop_table(\u0027ports\u0027)"},{"line_number":107,"context_line":"    op.drop_table(\u0027nodes\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Bkfc%3D","line":104,"updated":"2014-01-24 10:41:15.000000000","message":"I think downgrade from initial migration should not be supported.","commit_id":"c49a833458dd87573d542ab90e6ae5df3e9aa9c7"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        port.update(values)"},{"line_number":417,"context_line":"        try:"},{"line_number":418,"context_line":"            port.save()"},{"line_number":419,"context_line":"        except (db_exc.DBDuplicateEntry, exc.IntegrityError):"},{"line_number":420,"context_line":"            raise exception.MACAlreadyExists(mac\u003dvalues[\u0027address\u0027])"},{"line_number":421,"context_line":"        return port"},{"line_number":422,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8a8%3D","line":419,"updated":"2014-01-20 15:02:03.000000000","message":"hmm, this shouldn\u0027t be needed. We should always get db_exc.DBDuplicateEntry here","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                ref.update(values)"},{"line_number":433,"context_line":"        except NoResultFound:"},{"line_number":434,"context_line":"            raise exception.PortNotFound(port\u003dport_id)"},{"line_number":435,"context_line":"        except (db_exc.DBDuplicateEntry, exc.IntegrityError):"},{"line_number":436,"context_line":"            raise exception.MACAlreadyExists(mac\u003dvalues[\u0027address\u0027])"},{"line_number":437,"context_line":"        return ref"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8a4%3D","line":435,"updated":"2014-01-20 15:02:03.000000000","message":"ditto","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"}],"ironic/db/sqlalchemy/migration.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    return config"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def version(engine\u003dNone):"},{"line_number":36,"context_line":"    \"\"\"Current database version."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    :returns: Databse version"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGM0%3D","line":35,"updated":"2014-01-17 14:00:26.000000000","message":"I\u0027m a bit worried about interface inconsistency here as all other function accept optional config argument.","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"def version(engine\u003dNone):"},{"line_number":36,"context_line":"    \"\"\"Current database version."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    :returns: Databse version"},{"line_number":39,"context_line":"    :rtype: string"},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    engine \u003d engine or db_session.get_engine()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGNo%3D","line":38,"updated":"2014-01-17 14:00:26.000000000","message":"nit: Database","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"}],"ironic/openstack/common/db/sqlalchemy/session.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":260,"context_line":"from ironic.openstack.common import log as logging"},{"line_number":261,"context_line":"from ironic.openstack.common import timeutils"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"sqlite_db_opts \u003d ["},{"line_number":265,"context_line":"    cfg.StrOpt(\u0027sqlite_db\u0027,"},{"line_number":266,"context_line":"               default\u003d\u0027ironic.sqlite\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGMU%3D","line":263,"updated":"2014-01-17 14:00:26.000000000","message":"nit: unrelated change","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":483,"context_line":"    # SQLAlchemy can differ when using unicode() and accessing .message."},{"line_number":484,"context_line":"    # An audit across all three supported engines will be necessary to"},{"line_number":485,"context_line":"    # ensure there are no regressions."},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"    m \u003d _DUP_KEY_RE_DB[engine_name].match(integrity_error.message)"},{"line_number":488,"context_line":"    if not m:"},{"line_number":489,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bpx0%3D","line":486,"updated":"2014-01-23 14:35:51.000000000","message":"nit: unrelated change","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"}],"ironic/tests/base.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.engine \u003d db_session.get_engine()"},{"line_number":78,"context_line":"        self.engine.dispose()"},{"line_number":79,"context_line":"        conn \u003d self.engine.connect()"},{"line_number":80,"context_line":"        if sql_connection \u003d\u003d \"sqlite://\":"},{"line_number":81,"context_line":"            if db_migrate.version() \u003e None:"},{"line_number":82,"context_line":"                return"},{"line_number":83,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGLo%3D","line":80,"updated":"2014-01-17 14:00:26.000000000","message":"This is where things become more complex.\n\nSo the problem with SQLite is that it doesn\u0027t support ALTER. And unlike sqlalchemy-migrate, alembic doesn\u0027t provide any workarounds for SQLite inability to ALTER things. This means that we actually must generate the DB schema from metadata definition when using SQLite and then stamp the DB schema version to head.","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            testdb \u003d paths.state_path_rel(sqlite_db)"},{"line_number":88,"context_line":"            if os.path.exists(testdb):"},{"line_number":89,"context_line":"                return"},{"line_number":90,"context_line":"            db_migrate.upgrade(\u0027head\u0027)"},{"line_number":91,"context_line":"        self.post_migrations()"},{"line_number":92,"context_line":"        if sql_connection \u003d\u003d \"sqlite://\":"},{"line_number":93,"context_line":"            conn \u003d self.engine.connect()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BpxQ%3D","line":90,"updated":"2014-01-23 14:35:51.000000000","message":"for sqlite in-file database we should also do:\n\n   models.Base.metadata.create_all(self.engine)\n   db_migrate.stamp(\u0027head\u0027)","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"37d21202f737d9035832ce993f41872c83ca55af","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            shutil.copyfile(testdb, cleandb)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def setup_sqlite(self, db_migrate):"},{"line_number":100,"context_line":"        if db_migrate.version() \u003e None:"},{"line_number":101,"context_line":"            return"},{"line_number":102,"context_line":"        models.Base.metadata.create_all(self.engine)"},{"line_number":103,"context_line":"        db_migrate.stamp(\u0027head\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2BkQM%3D","line":100,"updated":"2014-01-24 10:41:15.000000000","message":"I think \"if db_migrate.version():\" will be better here.","commit_id":"c49a833458dd87573d542ab90e6ae5df3e9aa9c7"}],"ironic/tests/db/sqlalchemy/test_migrations.conf":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# Set up any number of migration data stores you want, one"},{"line_number":3,"context_line":"# The \"name\" used in the test is the config variable key."},{"line_number":4,"context_line":"#sqlite\u003dsqlite:///test_migrations.db"},{"line_number":5,"context_line":"sqlite\u003dsqlite:///test_migrations.db"},{"line_number":6,"context_line":"#mysql\u003dmysql://root:@localhost/test_migrations"},{"line_number":7,"context_line":"#postgresql\u003dpostgresql://user:pass@localhost/test_migrations"}],"source_content_type":"text/plain","patch_set":3,"id":"AAAAUH%2F%2FGLQ%3D","line":5,"updated":"2014-01-17 14:00:26.000000000","message":"hmm, why is this needed?","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"931454a429c4eda9c11e5ef3e86106c73dca124a","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# Set up any number of migration data stores you want, one"},{"line_number":3,"context_line":"# The \"name\" used in the test is the config variable key."},{"line_number":4,"context_line":"#sqlite\u003dsqlite:///test_migrations.db"},{"line_number":5,"context_line":"sqlite\u003dsqlite:///test_migrations.db"},{"line_number":6,"context_line":"#mysql\u003dmysql://root:@localhost/test_migrations"},{"line_number":7,"context_line":"#postgresql\u003dpostgresql://user:pass@localhost/test_migrations"}],"source_content_type":"text/plain","patch_set":3,"id":"AAAAUH%2F%2FGCQ%3D","line":5,"in_reply_to":"AAAAUH%2F%2FGLQ%3D","updated":"2014-01-17 14:17:28.000000000","message":"I cant access same sqlite with different engine.\nAnd I prefer to pass url to alembic env, instead of engine,\nso I thought that it is ok","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"37d21202f737d9035832ce993f41872c83ca55af","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# Set up any number of migration data stores you want, one"},{"line_number":3,"context_line":"# The \"name\" used in the test is the config variable key."},{"line_number":4,"context_line":"#sqlite\u003dsqlite:///test_migrations.db"},{"line_number":5,"context_line":"#(dshulyak) Removed sqlite. No sense in running migrations for sqlite on alembic"},{"line_number":6,"context_line":"#mysql\u003dmysql://root:@localhost/test_migrations"},{"line_number":7,"context_line":"#postgresql\u003dpostgresql://user:pass@localhost/test_migrations"}],"source_content_type":"text/plain","patch_set":12,"id":"AAAAUH%2F%2BkOs%3D","line":5,"updated":"2014-01-24 10:41:15.000000000","message":"AFAIK sqlite not supported in alembic at all.","commit_id":"c49a833458dd87573d542ab90e6ae5df3e9aa9c7"}],"ironic/tests/db/sqlalchemy/test_migrations.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        for version in versions:"},{"line_number":255,"context_line":"            # upgrade -\u003e downgrade -\u003e upgrade"},{"line_number":256,"context_line":"            self._migrate_up(engine, version, with_data\u003dTrue)"},{"line_number":257,"context_line":"            if snake_walk:"},{"line_number":258,"context_line":"                downgraded \u003d self._migrate_down("},{"line_number":259,"context_line":"                    engine, version - 1, with_data\u003dTrue)"},{"line_number":260,"context_line":"                if downgraded:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGH8%3D","side":"PARENT","line":257,"updated":"2014-01-17 14:00:26.000000000","message":"I\u0027m not a big fan of snake_walk, but if we decide to drop snake_walk support we should probably drop snake_walk methods arguments here too.","commit_id":"dad43cb763d9dc110c320285a2da1f0c44907e95"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        # upgrades successfully."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        # Place the database under version control"},{"line_number":244,"context_line":"        self.assertEqual(None, self.migration_api.version(engine))"},{"line_number":245,"context_line":"        alembic_cfg.set_main_option(\"url\", str(engine.url))"},{"line_number":246,"context_line":"        script_directory \u003d script.ScriptDirectory.from_config(alembic_cfg)"},{"line_number":247,"context_line":"        for version in script_directory.walk_revisions():"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGJw%3D","line":244,"updated":"2014-01-17 14:00:26.000000000","message":"self.assertIsNone(self.migration_api.version(engine))","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"31f79996de090aa3b3c20a87e77e55b5bb55e8c0","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    yield"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    patch_migration.stop()"},{"line_number":139,"context_line":"    patch_migration.stop()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"class BaseMigrationTestCase(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2B8aA%3D","line":139,"updated":"2014-01-20 15:02:03.000000000","message":"patch_env?","commit_id":"cfe959f61f27b95f3b397309074015a5480f320d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Load test databases from the config file. Only do this"},{"line_number":144,"context_line":"        # once. No need to re-run this on each test..."},{"line_number":145,"context_line":"        LOG.debug(_(\u0027config_path is %s\u0027) % self.CONFIG_FILE_PATH)"},{"line_number":146,"context_line":"        if os.path.exists(self.CONFIG_FILE_PATH):"},{"line_number":147,"context_line":"            cp \u003d ConfigParser.RawConfigParser()"},{"line_number":148,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bpv8%3D","side":"PARENT","line":145,"updated":"2014-01-23 14:35:51.000000000","message":"nit: unrelated change","commit_id":"25c8d4faa618a7d8000ac058ae82704f4359b92a"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class WalkVersionsMixin(object):"},{"line_number":249,"context_line":"    def _walk_versions(self, engine\u003dNone, alembic_cfg\u003dNone,"},{"line_number":250,"context_line":"                       snake_walk\u003dFalse, downgrade\u003dTrue):"},{"line_number":251,"context_line":"        # Determine latest version script from the repo, then"},{"line_number":252,"context_line":"        # upgrade from 1 through to the latest, with no data"},{"line_number":253,"context_line":"        # in the databases. This just checks that the schema itself"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bpws%3D","line":250,"updated":"2014-01-23 14:35:51.000000000","message":"Looks like snake_walk isn\u0027t used anymore. I\u0027m ok with dropping it, but we should also remove it from method arguments then.","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            self.assertIsNone(self.migration_api.version(alembic_cfg))"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"            for version in script_directory.walk_revisions():"},{"line_number":264,"context_line":"                # upgrade -\u003e downgrade -\u003e upgrade"},{"line_number":265,"context_line":"                self._migrate_up(engine, alembic_cfg,"},{"line_number":266,"context_line":"                                 version.revision, with_data\u003dTrue)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bpwo%3D","line":264,"updated":"2014-01-23 14:35:51.000000000","message":"nit: comment is outdated","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                                 version.revision, with_data\u003dTrue)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            if downgrade:"},{"line_number":269,"context_line":"                # Now walk it back down to 0 from the latest, testing"},{"line_number":270,"context_line":"                # the downgrade paths."},{"line_number":271,"context_line":"                for version in reversed(script_directory.walk_revisions()):"},{"line_number":272,"context_line":"                    # downgrade -\u003e upgrade -\u003e downgrade"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bpwk%3D","line":269,"updated":"2014-01-23 14:35:51.000000000","message":"nit: ditto","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"40114a1dec9c3d77453360bffdf4b98d5cb8cab2","unresolved":false,"context_lines":[{"line_number":269,"context_line":"                # Now walk it back down to 0 from the latest, testing"},{"line_number":270,"context_line":"                # the downgrade paths."},{"line_number":271,"context_line":"                for version in reversed(script_directory.walk_revisions()):"},{"line_number":272,"context_line":"                    # downgrade -\u003e upgrade -\u003e downgrade"},{"line_number":273,"context_line":"                    self._migrate_down(engine, alembic_cfg, version.revision)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def _migrate_down(self, engine, config, version, with_data\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2Bpwg%3D","line":272,"updated":"2014-01-23 14:35:51.000000000","message":"ditto","commit_id":"c4cd2556fcf833fc9ee9a8be298f34c03b8d1387"}],"ironic/tests/test_dbsync.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"4d87849507730ab800d194fc1fee02d19a36b9a3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def test_upgrade_and_version(self):"},{"line_number":30,"context_line":"        migration.upgrade(\u0027head\u0027)"},{"line_number":31,"context_line":"        v \u003d migration.version()"},{"line_number":32,"context_line":"        self.assertTrue(v \u003e None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FGKc%3D","line":32,"updated":"2014-01-17 14:00:26.000000000","message":"I\u0027d rather we use:\n\n   self.assertTrue(v)\n\nor:\n\n   self.assertIsNotNone(v)\n\nhere","commit_id":"741f8e8206586e1eab816c047f6090e1d1d73cac"}],"requirements.txt":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"04abcec61f570eb6c0eed3c6406a5ca44805662b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"lxml\u003e\u003d2.3"},{"line_number":10,"context_line":"WebOb\u003e\u003d1.2.3,\u003c1.3"},{"line_number":11,"context_line":"greenlet\u003e\u003d0.3.2"},{"line_number":12,"context_line":"sqlalchemy-migrate\u003e\u003d0.8.2"},{"line_number":13,"context_line":"netaddr\u003e\u003d0.7.6"},{"line_number":14,"context_line":"paramiko\u003e\u003d1.8.0"},{"line_number":15,"context_line":"iso8601\u003e\u003d0.1.8"}],"source_content_type":"text/plain","patch_set":12,"id":"AAAAUH%2F%2BkII%3D","line":12,"updated":"2014-01-24 10:57:57.000000000","message":"Forgot to remove this.","commit_id":"c49a833458dd87573d542ab90e6ae5df3e9aa9c7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f6c43558717b0abe40acd154cee48a3ee9e5b070","unresolved":false,"context_lines":[{"line_number":1,"context_line":"pbr\u003e\u003d0.5.21,\u003c1.0"},{"line_number":2,"context_line":"SQLAlchemy\u003e\u003d0.7.8,\u003c\u003d0.7.99"},{"line_number":3,"context_line":"alembic\u003e\u003d0.4.1"},{"line_number":4,"context_line":"amqplib\u003e\u003d0.6.1"},{"line_number":5,"context_line":"anyjson\u003e\u003d0.3.3"}],"source_content_type":"text/plain","patch_set":14,"id":"AAAAUH%2F%2BZo0%3D","line":2,"updated":"2014-01-27 10:32:57.000000000","message":"Please rebase your patch on \u0027master\u0027 branch.","commit_id":"40c3a77048ece791a26ec7280b3de02ac929071e"}]}
