)]}'
{"neutron/db/migration/__init__.py":[{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"1e1e82479a4ed3c892ff045d943e9a9e38bd6512","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        _check_plugin_dependency(\u0027brocade\u0027, \u0027lbr\u0027, migrate_plugins)"},{"line_number":53,"context_line":"        _check_plugin_dependency(\u0027cisco\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":54,"context_line":"        _check_plugin_dependency(\u0027embrane\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":55,"context_line":"        _check_plugin_dependency(\u0027meta\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":56,"context_line":"        return set(active_plugins) \u0026 set(migrate_plugins)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9gKo%3D","line":55,"updated":"2014-04-04 04:12:16.000000000","message":"remove this line.\n\nmetaplugin depends on plugins which are specified by plugin_list configuration parameter in metaplugin.ini. not fixed with ovs.\n\nAs discussed on IRC, metaplugin migration problem will be fixed by another patch.","commit_id":"40497e608cad38caafb86c643af0f174d82a17c4"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"6cde50f595a7158a67980530833508b75aaa1ee7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        _check_plugin_dependency(\u0027brocade\u0027, \u0027lbr\u0027, migrate_plugins)"},{"line_number":53,"context_line":"        _check_plugin_dependency(\u0027cisco\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":54,"context_line":"        _check_plugin_dependency(\u0027embrane\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":55,"context_line":"        _check_plugin_dependency(\u0027meta\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":56,"context_line":"        return set(active_plugins) \u0026 set(migrate_plugins)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9gDc%3D","line":55,"in_reply_to":"AAAAWH%2F9gKo%3D","updated":"2014-04-04 04:22:05.000000000","message":"Done","commit_id":"40497e608cad38caafb86c643af0f174d82a17c4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8fc77d3ef415f02937c23737c2ea7a87ffc730c8","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    else:"},{"line_number":52,"context_line":"        _check_plugin_dependency(\u0027brocade\u0027, \u0027lbr\u0027, migrate_plugins)"},{"line_number":53,"context_line":"        _check_plugin_dependency(\u0027cisco\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":54,"context_line":"        _check_plugin_dependency(\u0027embrane\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":55,"context_line":"        return set(active_plugins) \u0026 set(migrate_plugins)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9cfs%3D","line":54,"updated":"2014-04-04 13:37:20.000000000","message":"How about defining a dependency list?\n\n  PLUGIN_DEPENDENCIES \u003d {\n      \u0027brocade\u0027: [\u0027lbr\u0027],\n      \u0027cisco\u0027: [\u0027ovs\u0027],\n      \u0027embrane\u0027: [\u0027ovs\u0027],\n  }","commit_id":"2c10e204b956476876b4deb037f2ce4d4b95af81"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"890d9ba9fff187f6486597d538fca4d40809e0f2","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    else:"},{"line_number":52,"context_line":"        _check_plugin_dependency(\u0027brocade\u0027, \u0027lbr\u0027, migrate_plugins)"},{"line_number":53,"context_line":"        _check_plugin_dependency(\u0027cisco\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":54,"context_line":"        _check_plugin_dependency(\u0027embrane\u0027, \u0027ovs\u0027, migrate_plugins)"},{"line_number":55,"context_line":"        return set(active_plugins) \u0026 set(migrate_plugins)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F9bTA%3D","line":54,"in_reply_to":"AAAAWH%2F9cfs%3D","updated":"2014-04-04 15:42:32.000000000","message":"Good idea. Will do.","commit_id":"2c10e204b956476876b4deb037f2ce4d4b95af81"},{"author":{"_account_id":7987,"name":"Ivar Lazzaro","email":"ivarlazzaro@gmail.com","username":"Ivar"},"change_message_id":"ef44a8cf1bec7d0301bd5a80685535eeef9d916c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            for dependency in dependencies:"},{"line_number":53,"context_line":"                if dependency in migrate_plugins:"},{"line_number":54,"context_line":"                    migrate_plugins.append(plugin)"},{"line_number":55,"context_line":"                    return"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def should_run(active_plugins, migrate_plugins):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9Xps%3D","line":55,"updated":"2014-04-05 05:42:09.000000000","message":"having return here means that only one plugin dependency will be satisfied.\nSo for instance, if \u0027ovs\u0027 is in migrate_plugins, only \u0027cisco\u0027 will be appended but \u0027embrane\u0027 won\u0027t, because the function will return without checking any further. \nShould it be a break for the inner loop instead? (to avoid appending a plugin multiple times)","commit_id":"272b8275ff67ec981b325d83e665b21bda766e1d"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"83c0f6ebfd8b2e04b37c02413848c4544d460e18","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            for dependency in dependencies:"},{"line_number":53,"context_line":"                if dependency in migrate_plugins:"},{"line_number":54,"context_line":"                    migrate_plugins.append(plugin)"},{"line_number":55,"context_line":"                    return"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def should_run(active_plugins, migrate_plugins):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9Xog%3D","line":55,"in_reply_to":"AAAAWH%2F9Xps%3D","updated":"2014-04-05 05:58:48.000000000","message":"Yes, you are right. Sorry about that and thanks for catching this!","commit_id":"272b8275ff67ec981b325d83e665b21bda766e1d"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8ab226cb645636152225905c0d2385417abefc4a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def _check_plugin_dependencies(migrate_plugins):"},{"line_number":49,"context_line":"    \"\"\"Ensure plugin is included if dependency is in plugins to migrate.\"\"\""},{"line_number":50,"context_line":"    for plugin, dependencies in PLUGIN_DEPENDENCIES.items():"},{"line_number":51,"context_line":"        if PLUGINS[plugin] not in migrate_plugins:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9VV4%3D","line":48,"updated":"2014-04-06 21:47:52.000000000","message":"This method changes migrate_plugins list, so the method name \"check\" is not appropriate.  \"update_migrate_plugins_by_dependencies()\" or similar name looks better to me.","commit_id":"2c1970a7f1a4bca974c32e8fb7f238c65504c015"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"8e17457ab7d846d026ca62041022b82aa368cd9a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def _check_plugin_dependencies(migrate_plugins):"},{"line_number":49,"context_line":"    \"\"\"Ensure plugin is included if dependency is in plugins to migrate.\"\"\""},{"line_number":50,"context_line":"    for plugin, dependencies in PLUGIN_DEPENDENCIES.items():"},{"line_number":51,"context_line":"        if PLUGINS[plugin] not in migrate_plugins:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9U%2BQ%3D","line":48,"in_reply_to":"AAAAWH%2F9VV4%3D","updated":"2014-04-07 01:19:18.000000000","message":"Done","commit_id":"2c1970a7f1a4bca974c32e8fb7f238c65504c015"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8ab226cb645636152225905c0d2385417abefc4a","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def _check_plugin_dependencies(migrate_plugins):"},{"line_number":49,"context_line":"    \"\"\"Ensure plugin is included if dependency is in plugins to migrate.\"\"\""},{"line_number":50,"context_line":"    for plugin, dependencies in PLUGIN_DEPENDENCIES.items():"},{"line_number":51,"context_line":"        if PLUGINS[plugin] not in migrate_plugins:"},{"line_number":52,"context_line":"            for dependency in dependencies:"},{"line_number":53,"context_line":"                if PLUGINS[dependency] in migrate_plugins:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9VVs%3D","line":50,"updated":"2014-04-06 21:47:52.000000000","message":"I think it is enough if we do this for active plugins. If Cisco plugin is the target plugin,  what we need to do is to add cisco to migrate_plugins if dependencies are included in migrate_plugins. We can write this as follows too:\n\n  for plugin in active_plugins:\n      if plugin not in PLUGIN_DEPENDECIES:\n          continue\n      dependencies \u003d PLUGIN_DEPENDENCIES[plugin]\n      if set(dependencies) \u0026 set(migrate_plugins):\n          migrate_plugins.append(PLUGINS[plugin])","commit_id":"2c1970a7f1a4bca974c32e8fb7f238c65504c015"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"8e17457ab7d846d026ca62041022b82aa368cd9a","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def _check_plugin_dependencies(migrate_plugins):"},{"line_number":49,"context_line":"    \"\"\"Ensure plugin is included if dependency is in plugins to migrate.\"\"\""},{"line_number":50,"context_line":"    for plugin, dependencies in PLUGIN_DEPENDENCIES.items():"},{"line_number":51,"context_line":"        if PLUGINS[plugin] not in migrate_plugins:"},{"line_number":52,"context_line":"            for dependency in dependencies:"},{"line_number":53,"context_line":"                if PLUGINS[dependency] in migrate_plugins:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAWH%2F9U%2BA%3D","line":50,"in_reply_to":"AAAAWH%2F9VVs%3D","updated":"2014-04-07 01:19:18.000000000","message":"Makes sense. I refactored the PLUGIN_DEPENDECIES dictionary to use the full plugin paths instead of the short names, but in essence I have adopted your suggested logic. I also added unit tests for this.","commit_id":"2c1970a7f1a4bca974c32e8fb7f238c65504c015"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6f115df676f96a03e35517fd52ab6bc796693e2e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                \u0027NeutronPluginPLUMgridV2\u0027,"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \u0027ml2\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PLUGIN_DEPENDENCIES \u003d {"},{"line_number":41,"context_line":"    PLUGINS[\u0027brocade\u0027]: [PLUGINS[\u0027lbr\u0027]],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2Fzlc%3D","line":38,"updated":"2014-04-10 09:44:46.000000000","message":"Any idea about how this could be generated scanning the source code tree?","commit_id":"154bca32cd53fe16e5b544a1a5dce8213a4d4b2f"},{"author":{"_account_id":7170,"name":"Zang MingJie","email":"zealot0630@gmail.com","username":"zealot"},"change_message_id":"a522838bc04a13216172851fc4bb2e0966629fd1","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                \u0027NeutronPluginPLUMgridV2\u0027,"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \u0027ml2\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PLUGIN_DEPENDENCIES \u003d {"},{"line_number":41,"context_line":"    PLUGINS[\u0027brocade\u0027]: [PLUGINS[\u0027lbr\u0027]],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAXH%2F%2Fzyc%3D","line":38,"in_reply_to":"AAAAW3%2F%2FxlM%3D","updated":"2014-04-17 09:25:33.000000000","message":"It is already configured in setup.cfg, you can get it by using\n\npkg_resources.iter_entry_points(\"neutron.core_plugins\")","commit_id":"154bca32cd53fe16e5b544a1a5dce8213a4d4b2f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"cad0bf68dc05f0ce9ad5a4427296a9b56b38d43a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                \u0027NeutronPluginPLUMgridV2\u0027,"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \u0027ml2\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PLUGIN_DEPENDENCIES \u003d {"},{"line_number":41,"context_line":"    PLUGINS[\u0027brocade\u0027]: [PLUGINS[\u0027lbr\u0027]],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FxlM%3D","line":38,"in_reply_to":"AAAAW3%2F%2Fzlc%3D","updated":"2014-04-10 13:59:35.000000000","message":"I have not looked into that. I\u0027ll explore this separately and file an enhancement if I come up with anything. Feel free to drop ideas my way if you have any.","commit_id":"154bca32cd53fe16e5b544a1a5dce8213a4d4b2f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2de50d778c18e6b57d57c15ea3f442b9886b8204","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                \u0027NeutronPluginPLUMgridV2\u0027,"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \u0027ml2\u0027: \u0027neutron.plugins.ml2.plugin.Ml2Plugin\u0027,"},{"line_number":38,"context_line":"}"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"PLUGIN_DEPENDENCIES \u003d {"},{"line_number":41,"context_line":"    PLUGINS[\u0027brocade\u0027]: [PLUGINS[\u0027lbr\u0027]],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAXH%2F%2FtHY%3D","line":38,"in_reply_to":"AAAAXH%2F%2Fzyc%3D","updated":"2014-04-18 03:48:24.000000000","message":"Thanks! Done.","commit_id":"154bca32cd53fe16e5b544a1a5dce8213a4d4b2f"}],"neutron/db/migration/alembic_migrations/versions/2c4af419145b_l3_support.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6f115df676f96a03e35517fd52ab6bc796693e2e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027neutron.plugins.nicira.NeutronServicePlugin.NvpAdvancedPlugin\u0027,"},{"line_number":38,"context_line":"    \u0027neutron.plugins.vmware.plugin.NsxPlugin\u0027,"},{"line_number":39,"context_line":"    \u0027neutron.plugins.vmware.plugin.NsxServicePlugin\u0027,"},{"line_number":40,"context_line":"    \u0027neutron.plugins.embrane.plugins.embrane_ovs_plugin.EmbraneOvsPlugin\u0027,"},{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"from neutron.db import migration"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2Fzgs%3D","side":"PARENT","line":40,"updated":"2014-04-10 09:44:46.000000000","message":"I think embrane needs l3 models. are they now being generated because of the dependency?","commit_id":"69c99d2858daee8cce0d06efc3bf272fcafabd91"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"cad0bf68dc05f0ce9ad5a4427296a9b56b38d43a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027neutron.plugins.nicira.NeutronServicePlugin.NvpAdvancedPlugin\u0027,"},{"line_number":38,"context_line":"    \u0027neutron.plugins.vmware.plugin.NsxPlugin\u0027,"},{"line_number":39,"context_line":"    \u0027neutron.plugins.vmware.plugin.NsxServicePlugin\u0027,"},{"line_number":40,"context_line":"    \u0027neutron.plugins.embrane.plugins.embrane_ovs_plugin.EmbraneOvsPlugin\u0027,"},{"line_number":41,"context_line":"]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"from neutron.db import migration"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2FxkE%3D","side":"PARENT","line":40,"in_reply_to":"AAAAW3%2F%2Fzgs%3D","updated":"2014-04-10 13:59:35.000000000","message":"Correct, plugins with dependencies can\u0027t be in this list.","commit_id":"69c99d2858daee8cce0d06efc3bf272fcafabd91"}],"neutron/db/migration/alembic_migrations/versions/folsom_initial.py":[{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"1e1e82479a4ed3c892ff045d943e9a9e38bd6512","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        # Brocade plugin imports linux bridge models too"},{"line_number":98,"context_line":"        upgrade_linuxbridge()"},{"line_number":99,"context_line":"    elif (PLUGINS[\u0027embrane\u0027] in active_plugins or"},{"line_number":100,"context_line":"            PLUGINS[\u0027meta\u0027] in active_plugins):"},{"line_number":101,"context_line":"        upgrade_ovs()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9gJo%3D","line":100,"updated":"2014-04-04 04:12:16.000000000","message":"remove this. (see comment in __init__.py)","commit_id":"40497e608cad38caafb86c643af0f174d82a17c4"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"6cde50f595a7158a67980530833508b75aaa1ee7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        # Brocade plugin imports linux bridge models too"},{"line_number":98,"context_line":"        upgrade_linuxbridge()"},{"line_number":99,"context_line":"    elif (PLUGINS[\u0027embrane\u0027] in active_plugins or"},{"line_number":100,"context_line":"            PLUGINS[\u0027meta\u0027] in active_plugins):"},{"line_number":101,"context_line":"        upgrade_ovs()"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F9gDY%3D","line":100,"in_reply_to":"AAAAWH%2F9gJo%3D","updated":"2014-04-04 04:22:05.000000000","message":"Done","commit_id":"40497e608cad38caafb86c643af0f174d82a17c4"}],"neutron/tests/unit/db/test_migration.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"fd25e99ca78e86c7f1e261f437a74abb41c8d4f1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                migration.should_run(plugins[\u0027active\u0027],"},{"line_number":61,"context_line":"                                     plugins[\u0027migration_for\u0027]))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # TODO(Henry): more db migration unit tests needed"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2F0Bg%3D","line":63,"updated":"2014-04-10 08:51:07.000000000","message":"I\u0027m working on synchronization of models and migrations in neutron and I use special test for it (https://review.openstack.org/74081), that I would be added to neutron lately(https://review.openstack.org/76520). It has already helped to find a lot of bugs in models and migrations. My question is what kind of unit test are going to be added there?","commit_id":"154bca32cd53fe16e5b544a1a5dce8213a4d4b2f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"cad0bf68dc05f0ce9ad5a4427296a9b56b38d43a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                migration.should_run(plugins[\u0027active\u0027],"},{"line_number":61,"context_line":"                                     plugins[\u0027migration_for\u0027]))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # TODO(Henry): more db migration unit tests needed"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAW3%2F%2Fxfw%3D","line":63,"in_reply_to":"AAAAW3%2F%2F0Bg%3D","updated":"2014-04-10 13:59:35.000000000","message":"That is some great work there, it\u0027s good to see it. When I wrote the TODO comment I did not know about your work. Maybe there is not much needed here now. Maybe neutron-specific stuff. I have not given it much thought.","commit_id":"154bca32cd53fe16e5b544a1a5dce8213a4d4b2f"}]}
