)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c97d401057b4a1694057c0485dbcad3821768518","unresolved":false,"context_lines":[{"line_number":19,"context_line":"plugin need to indicate if it supports the validation by setting"},{"line_number":20,"context_line":"``__filter_validation_support`` to True. If this field is not set,"},{"line_number":21,"context_line":"the default is False and validation is turned off for that plugin."},{"line_number":22,"context_line":"Right now, all neutron in-tree plugins support filter validation."},{"line_number":23,"context_line":"Out-of-tree plugins will have filter validation disabled by default."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"An API extension is introduced to allow API users to discover this"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_97ecdbbc","line":22,"range":{"start_line":22,"start_character":11,"end_line":22,"end_character":38},"updated":"2018-07-05 23:09:03.000000000","message":"I found this confusing. Consider re-phrasing it as:\n\nthe ML2 plugin and all the in-tree service plugins","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"15c12d8c9ae3c5bff477854101dfea93a27feafe","unresolved":false,"context_lines":[{"line_number":19,"context_line":"plugin need to indicate if it supports the validation by setting"},{"line_number":20,"context_line":"``__filter_validation_support`` to True. If this field is not set,"},{"line_number":21,"context_line":"the default is False and validation is turned off for that plugin."},{"line_number":22,"context_line":"Right now, all neutron in-tree plugins support filter validation."},{"line_number":23,"context_line":"Out-of-tree plugins will have filter validation disabled by default."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"An API extension is introduced to allow API users to discover this"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_057ba328","line":22,"range":{"start_line":22,"start_character":11,"end_line":22,"end_character":38},"in_reply_to":"5f7c97a3_97ecdbbc","updated":"2018-07-06 16:09:04.000000000","message":"Done","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"012a0adb9a3177e1c1f92979cd25b4eb8c37699a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"Depends-On: I3f2e6e861adaeef81a1a5819a57b28f5c6281d80"},{"line_number":34,"context_line":"Depends-On: I1189bc9a50308df5c7e18c329f3a1262c90b9e12"},{"line_number":35,"context_line":"Depends-On: I057cd917628c77dd20c0ff7747936c3fec7b4844"},{"line_number":36,"context_line":"Depends-On: Iad1c82bf85167498deaf731f048e29060558a95c"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Change-Id: I21bf8a752813802822fd9966dda6ab3b6c4abfdc"},{"line_number":39,"context_line":"Partial-Bug: #1749820"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"5f7c97a3_52b5fe7b","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":53},"updated":"2018-07-18 03:03:58.000000000","message":"this needs to be removed as per discussion on Tempest patch.\n\nQA has process to handle such bug fix which fail the tempest tests.[1]\n\n- I have pushed the patch to skip the Tempest test which is failing due to this patch. - https://review.openstack.org/#/c/583441/\n- Tempest team will merge that Tempest skip test patch immediately once one neutron core is +2 on this neutron change. \n- Once neutron changes are merged, Tempest test can be modified to verify both behaviour supported by neutron.\n\n \nPlease note, any of the above steps does not cause any delay in neutron change to merge. Let me know for any kind of support from QA team. \n\n\n[1] https://docs.openstack.org/tempest/latest/HACKING.html#bug-fix-on-core-project-needing-tempest-changes","commit_id":"6d9036b4baeb61b338d969944c3205540ea396ec"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"9cc746ff23712323692bb67e54457fe85bf5c246","unresolved":false,"context_lines":[{"line_number":33,"context_line":"Depends-On: I3f2e6e861adaeef81a1a5819a57b28f5c6281d80"},{"line_number":34,"context_line":"Depends-On: I1189bc9a50308df5c7e18c329f3a1262c90b9e12"},{"line_number":35,"context_line":"Depends-On: I057cd917628c77dd20c0ff7747936c3fec7b4844"},{"line_number":36,"context_line":"Depends-On: Iad1c82bf85167498deaf731f048e29060558a95c"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Change-Id: I21bf8a752813802822fd9966dda6ab3b6c4abfdc"},{"line_number":39,"context_line":"Partial-Bug: #1749820"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"5f7c97a3_5d250f5a","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":53},"in_reply_to":"5f7c97a3_52b5fe7b","updated":"2018-07-18 03:34:31.000000000","message":"Done","commit_id":"6d9036b4baeb61b338d969944c3205540ea396ec"}],"lower-constraints.txt":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3b82834003856b8eb8ac8fd5e41ca18a9d1c0844","unresolved":false,"context_lines":[{"line_number":56,"context_line":"munch\u003d\u003d2.1.0"},{"line_number":57,"context_line":"netaddr\u003d\u003d0.7.18"},{"line_number":58,"context_line":"netifaces\u003d\u003d0.10.4"},{"line_number":59,"context_line":"neutron-lib\u003d\u003d1.17.0"},{"line_number":60,"context_line":"openstackdocstheme\u003d\u003d1.18.1"},{"line_number":61,"context_line":"openstacksdk\u003d\u003d0.11.2"},{"line_number":62,"context_line":"os-client-config\u003d\u003d1.28.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_8f2b447a","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":19},"updated":"2018-07-08 07:58:10.000000000","message":"this should be done in a separate unlreated patch","commit_id":"1ba1d235c8413c7f0014e4bc0f85b35136a3cd77"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"b583ede2fa0f13d9683524a3b60b2c350aea2fe7","unresolved":false,"context_lines":[{"line_number":56,"context_line":"munch\u003d\u003d2.1.0"},{"line_number":57,"context_line":"netaddr\u003d\u003d0.7.18"},{"line_number":58,"context_line":"netifaces\u003d\u003d0.10.4"},{"line_number":59,"context_line":"neutron-lib\u003d\u003d1.17.0"},{"line_number":60,"context_line":"openstackdocstheme\u003d\u003d1.18.1"},{"line_number":61,"context_line":"openstacksdk\u003d\u003d0.11.2"},{"line_number":62,"context_line":"os-client-config\u003d\u003d1.28.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_216f12c5","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":19},"in_reply_to":"5f7c97a3_8f2b447a","updated":"2018-07-15 04:14:16.000000000","message":"Done","commit_id":"1ba1d235c8413c7f0014e4bc0f85b35136a3cd77"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"13612ded47c69a5636e47fcb7ecdcb16ae9a0f13","unresolved":false,"context_lines":[{"line_number":56,"context_line":"munch\u003d\u003d2.1.0"},{"line_number":57,"context_line":"netaddr\u003d\u003d0.7.18"},{"line_number":58,"context_line":"netifaces\u003d\u003d0.10.4"},{"line_number":59,"context_line":"neutron-lib\u003d\u003d1.17.0"},{"line_number":60,"context_line":"openstackdocstheme\u003d\u003d1.18.1"},{"line_number":61,"context_line":"openstacksdk\u003d\u003d0.11.2"},{"line_number":62,"context_line":"os-client-config\u003d\u003d1.28.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_9a6376dd","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":19},"in_reply_to":"5f7c97a3_8f2b447a","updated":"2018-07-09 14:02:09.000000000","message":"Yes, it is done in https://review.openstack.org/#/c/577245/ . I will rebase once that patch is merged","commit_id":"1ba1d235c8413c7f0014e4bc0f85b35136a3cd77"}],"neutron/api/api_common.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9255757c99e0fa4778d80191c52eddcc5c14558","unresolved":false,"context_lines":[{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_f0ebeb0d","line":272,"updated":"2018-07-17 19:45:55.000000000","message":"what in case if core plugin supports validation but one of service plugins not? will it be supported or not at all?","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"053b3bf549fca95e4879f19942c779230c875df6","unresolved":false,"context_lines":[{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_ab016bb7","line":272,"in_reply_to":"5f7c97a3_3e336914","updated":"2018-07-18 15:23:44.000000000","message":"I think Slawek is raising a very good point. The whole rationale behind this patch is to deliver consistent API behavior. That purpose is completely defeated if some parts of the API don\u0027t perform the same validations. It shouldn\u0027t be that difficult to check across all the plugins. In this function, call neutron_lib.plugins.directory.get_plugins() to get all the plugins. Then iterate over them and perform the check. To avoid doing this for every request, a global variable can be created to memoize whether filter validation is supported or not. This way, we only iterate over the plugins once","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b4d08acfb55a078000a67a3d43d0ddc294707ee2","unresolved":false,"context_lines":[{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_3e336914","line":272,"in_reply_to":"5f7c97a3_90a1573d","updated":"2018-07-18 07:36:13.000000000","message":"Yes, but then it might be really confusing if operator will enable one service plugin which doesn\u0027t support it - because validation will work for most of resources and for resources provided by this one service plugin - not.\n\nMaybe better idea would be to check here if it\u0027s supported by all service plugins and core plugin and if one of them don\u0027t support this, disable it globally with some warning message in logs, something like:\n\"Service plugin XXX doesn\u0027t support filter validation. This feature will be disabled now.\"\n\nOr if that is not acceptable, maybe at least check all service plugins and display warnings like:\n\"Service plugin XXX doesn\u0027t support filter validation. Resources provided by this plugin will not have this feature enabled.\"\nJust to inform operator about what happens and why API behavior can be different for different resources.","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"34c6e0d0d3fc13b2bc2518094180d2066e479a21","unresolved":false,"context_lines":[{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_d196daef","line":272,"in_reply_to":"5f7c97a3_ab016bb7","updated":"2018-07-18 17:16:29.000000000","message":"+1 on the idea of consistency across API resources. I addressed it in a slightly different approach. Please check out the latest patchset.","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"1062957723b3b1196dd94e1903f834b34e0db9f6","unresolved":false,"context_lines":[{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_d01b4f19","line":272,"in_reply_to":"5f7c97a3_f0ebeb0d","updated":"2018-07-17 20:02:54.000000000","message":"* The support of validation is claimed by individual plugin (i.e. service plugin).\n* If the API resource belongs to the core plugin (i.e. network), then the core plugin determines the validation support.\n* If the API resource belongs to the service plugin (i.e. flavor), then the service plugin determines the validation support.\n\nHope I explained everything clearly.","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"07feaa64260fab8aca285cb1ec3867b157bfde92","unresolved":false,"context_lines":[{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_90a1573d","line":272,"in_reply_to":"5f7c97a3_f0ebeb0d","updated":"2018-07-17 21:01:38.000000000","message":"The way I see it core plugin might support it and a service plugin might not support it.","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"9515d2f753f5e0c9ac9e04d5cf108a3df3f3329e","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    return getattr(plugin, native_sorting_attr_name, False)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_cb1b877d","line":272,"range":{"start_line":269,"start_character":0,"end_line":272,"end_character":62},"updated":"2018-07-18 15:52:38.000000000","message":"A possible alternative is:\n\n_IS_FILTER_VALIDATION_SUPPORTED \u003d None\ndef is_filter_validation_supported():\n    global _IS_FILTER_VALIDATION_SUPPORTED\n    if _IS_FILTER_VALIDATION_SUPPORTED is None:\n        for plugin in directory.get_plugins():\n            _IS_FILTER_VALIDATION_SUPPORTED \u003d getattr(plugin, filter_validation_attr_name, False)\n            if not _IS_FILTER_VALIDATION_SUPPORTED:\n                break\n    return _IS_FILTER_VALIDATION_SUPPORTED","commit_id":"3f660dce8e908fe42c5a38f7d0dee582a2480a87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"1b2a61757fdd78b9064bfba075315448add12a97","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    return getattr(plugin, native_sorting_attr_name, False)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_160f632f","line":272,"range":{"start_line":269,"start_character":0,"end_line":272,"end_character":62},"in_reply_to":"5f7c97a3_9143826b","updated":"2018-07-18 19:50:31.000000000","message":"That\u0027s ok, I was only suggesting an alternative","commit_id":"3f660dce8e908fe42c5a38f7d0dee582a2480a87"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"99c3c4aa8aae00b1ccc30e85f6b54e6872142274","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    return getattr(plugin, native_sorting_attr_name, False)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"def is_filter_validation_supported(plugin):"},{"line_number":270,"context_line":"    filter_validation_attr_name \u003d (\"_%s__filter_validation_support\""},{"line_number":271,"context_line":"                                   % plugin.__class__.__name__)"},{"line_number":272,"context_line":"    return getattr(plugin, filter_validation_attr_name, False)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"class PaginationHelper(object):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_9143826b","line":272,"range":{"start_line":269,"start_character":0,"end_line":272,"end_character":62},"in_reply_to":"5f7c97a3_cb1b877d","updated":"2018-07-18 17:18:39.000000000","message":"Since I haven\u0027t checked out this comment in before, I addressed it in a slightly different way, but just let me know if you prefer to solve it this way.","commit_id":"3f660dce8e908fe42c5a38f7d0dee582a2480a87"}],"neutron/conf/common.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9255757c99e0fa4778d80191c52eddcc5c14558","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    cfg.BoolOpt(\u0027vlan_transparent\u0027, default\u003dFalse,"},{"line_number":118,"context_line":"                help\u003d_(\u0027If True, then allow plugins that support it to \u0027"},{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027filter_validation\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to perform validations \u0027"},{"line_number":122,"context_line":"                       \u0027on filter parameters.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_d0358fdc","line":120,"updated":"2018-07-17 19:45:55.000000000","message":"how it will work if option will be set to True but there will be used plugin which doesn\u0027t support it? Wouldn\u0027t it be confusing for user then?","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f5d9e3a3a1ae779c799cdbcea7d8d922cd601076","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    cfg.BoolOpt(\u0027vlan_transparent\u0027, default\u003dFalse,"},{"line_number":118,"context_line":"                help\u003d_(\u0027If True, then allow plugins that support it to \u0027"},{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027filter_validation\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to perform validations \u0027"},{"line_number":122,"context_line":"                       \u0027on filter parameters.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_6b704a42","line":120,"in_reply_to":"5f7c97a3_70befbaf","updated":"2018-07-17 20:47:48.000000000","message":"Done","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"07feaa64260fab8aca285cb1ec3867b157bfde92","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    cfg.BoolOpt(\u0027vlan_transparent\u0027, default\u003dFalse,"},{"line_number":118,"context_line":"                help\u003d_(\u0027If True, then allow plugins that support it to \u0027"},{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027filter_validation\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to perform validations \u0027"},{"line_number":122,"context_line":"                       \u0027on filter parameters.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_eb01ba04","line":120,"in_reply_to":"5f7c97a3_70befbaf","updated":"2018-07-17 21:01:38.000000000","message":"Yes, I think this approach is correct:\n\n1) On one hand, we want to enable plugin developers to decide whether they want to support filter validation or not\n\n2) On the other hand, we want to let the deployer to decide independently if they want the new behavior or want to continue with the previous behavior. In fact, we discussed this validation with the API SIG and they recommended that there should be a config option to let deployers to keep the old behavior","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"1062957723b3b1196dd94e1903f834b34e0db9f6","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    cfg.BoolOpt(\u0027vlan_transparent\u0027, default\u003dFalse,"},{"line_number":118,"context_line":"                help\u003d_(\u0027If True, then allow plugins that support it to \u0027"},{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027filter_validation\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to perform validations \u0027"},{"line_number":122,"context_line":"                       \u0027on filter parameters.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_70befbaf","line":120,"in_reply_to":"5f7c97a3_d0358fdc","updated":"2018-07-17 20:02:54.000000000","message":"Yes, it might be confusing, but I have to do it this way so that we won\u0027t break the out-of-tree plugins.\n\nAnother option is that if this option is set to True, all the plugins perform validation. Then, it might break some out-of-tree plugins who are not ready to perform validation yet. Therefore, the safest approach is to let individual plugin to turn on/off validation based on their preference.\n\nI can add more explanation in the \u0027help\u0027 text to clarify this point.","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b4d08acfb55a078000a67a3d43d0ddc294707ee2","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    cfg.BoolOpt(\u0027vlan_transparent\u0027, default\u003dFalse,"},{"line_number":118,"context_line":"                help\u003d_(\u0027If True, then allow plugins that support it to \u0027"},{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027filter_validation\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to perform validations \u0027"},{"line_number":122,"context_line":"                       \u0027on filter parameters.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f7c97a3_9e963def","line":120,"in_reply_to":"5f7c97a3_eb01ba04","updated":"2018-07-18 07:36:13.000000000","message":"Ok, thx. I\u0027m ok with that :)","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"3f6b487313f3306ac02f437ca6071a9ad45bec48","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to decide \u0027"},{"line_number":122,"context_line":"                       \u0027whether to perform validations on filter parameters. \u0027"},{"line_number":123,"context_line":"                       \u0027Filter validation is enabled if this config\u0027"},{"line_number":124,"context_line":"                       \u0027is turned on and it is supported by all plugins\u0027)),"},{"line_number":125,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"},{"line_number":126,"context_line":"               deprecated_name\u003d\u0027segment_mtu\u0027, deprecated_group\u003d\u0027ml2\u0027,"},{"line_number":127,"context_line":"               help\u003d_(\u0027MTU of the underlying physical network. Neutron uses \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_e29e94b5","line":124,"range":{"start_line":124,"start_character":60,"end_line":124,"end_character":71},"updated":"2018-07-19 07:42:49.000000000","message":"nit: all loaded plugins","commit_id":"2b1d8ea4a202f24c1b485ccebdbf831c505a4e6a"}],"neutron/manager.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f7ef1c884f40cb7e73f65beb114dd2b9cde31e30","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                plugin.agent_notifiers.update(plugin_inst.agent_notifiers)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"            # search for extensions that need to be disabled by service plugin"},{"line_number":225,"context_line":"            if (hasattr(plugin, \u0027disable_extension_by_service_plugin\u0027)):"},{"line_number":226,"context_line":"                plugin.disable_extension_by_service_plugin(plugin_inst)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"            LOG.debug(\"Successfully loaded %(type)s plugin. \""}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_96861316","line":225,"updated":"2018-07-18 20:12:50.000000000","message":"what about other than ML2 core plugin? Each of them now have to implement \"disable_extension_by_service_plugin\" method to provide this feature.\nI think that solution proposed by Miguel in one of his recent comments might be better than that.","commit_id":"6cda1e6ef115ebc85374befd2bf5e74e7ca89e45"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"3794708d40269d15ad8431e73384108898f22f3e","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                plugin.agent_notifiers.update(plugin_inst.agent_notifiers)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"            # search for extensions that need to be disabled by service plugin"},{"line_number":225,"context_line":"            if (hasattr(plugin, \u0027disable_extension_by_service_plugin\u0027)):"},{"line_number":226,"context_line":"                plugin.disable_extension_by_service_plugin(plugin_inst)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"            LOG.debug(\"Successfully loaded %(type)s plugin. \""}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_efbe86cc","line":225,"in_reply_to":"5f7c97a3_96861316","updated":"2018-07-18 22:30:40.000000000","message":"I tested Miguel\u0027s solution and ran into the complications of removing extension at runtime, which is infeasible because the dependency graph of all extensions is already setup.\n\nI addressed your comment in a different way. I moved the method to a common utils so that we don\u0027t have to go through ML2 plugin to do the work.","commit_id":"6cda1e6ef115ebc85374befd2bf5e74e7ca89e45"}],"neutron/tests/unit/_test_extension_portbindings.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"4bbe9501618415bcfc73738324602e0276d53f3a","unresolved":false,"context_lines":[{"line_number":346,"context_line":"            for non_admin_port in ports:"},{"line_number":347,"context_line":"                self._check_response_portbindings_vnic_type(non_admin_port)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def test_ports_vnic_type_list(self):"},{"line_number":350,"context_line":"        cfg.CONF.set_default(\u0027allow_overlapping_ips\u0027, True)"},{"line_number":351,"context_line":"        vnic_arg \u003d {portbindings.VNIC_TYPE: self.vnic_type}"},{"line_number":352,"context_line":"        with self.port(name\u003d\u0027name1\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_f1b8f1e8","side":"PARENT","line":349,"range":{"start_line":349,"start_character":8,"end_line":349,"end_character":33},"updated":"2018-07-03 15:55:23.000000000","message":"Is the removal of this just an artifact of needing a rebase?","commit_id":"878ac9b4633849cafa28d6e2df538d3df5b4ba88"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"dca4da4af6793856474b876d2baa960266e5ddeb","unresolved":false,"context_lines":[{"line_number":346,"context_line":"            for non_admin_port in ports:"},{"line_number":347,"context_line":"                self._check_response_portbindings_vnic_type(non_admin_port)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def test_ports_vnic_type_list(self):"},{"line_number":350,"context_line":"        cfg.CONF.set_default(\u0027allow_overlapping_ips\u0027, True)"},{"line_number":351,"context_line":"        vnic_arg \u003d {portbindings.VNIC_TYPE: self.vnic_type}"},{"line_number":352,"context_line":"        with self.port(name\u003d\u0027name1\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a5b0eedd","side":"PARENT","line":349,"range":{"start_line":349,"start_character":8,"end_line":349,"end_character":33},"in_reply_to":"5f7c97a3_f1b8f1e8","updated":"2018-07-03 20:18:34.000000000","message":"Added it back","commit_id":"878ac9b4633849cafa28d6e2df538d3df5b4ba88"}],"releasenotes/notes/support-filter-validation-fee2cdeedbe8ad76.yaml":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c97d401057b4a1694057c0485dbcad3821768518","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    behavior. This extension can be disabled by operators via a config option."},{"line_number":11,"context_line":"upgrade:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    In before, if a request contains an unknown or unsupported parameter,"},{"line_number":14,"context_line":"    the server will silently ignore the invalid input. After the upgrade,"},{"line_number":15,"context_line":"    the server will return a 400 Bad Request response instead."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_170d2b3f","line":13,"range":{"start_line":13,"start_character":4,"end_line":13,"end_character":13},"updated":"2018-07-05 23:09:03.000000000","message":"Prior to the upgrade","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"15c12d8c9ae3c5bff477854101dfea93a27feafe","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    behavior. This extension can be disabled by operators via a config option."},{"line_number":11,"context_line":"upgrade:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    In before, if a request contains an unknown or unsupported parameter,"},{"line_number":14,"context_line":"    the server will silently ignore the invalid input. After the upgrade,"},{"line_number":15,"context_line":"    the server will return a 400 Bad Request response instead."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_25781f29","line":13,"range":{"start_line":13,"start_character":4,"end_line":13,"end_character":13},"in_reply_to":"5f7c97a3_170d2b3f","updated":"2018-07-06 16:09:04.000000000","message":"Done","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c97d401057b4a1694057c0485dbcad3821768518","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    Operators can disable this feature if they want to maintain"},{"line_number":23,"context_line":"    backward-compatibility. If they choose to do that, the API extension"},{"line_number":24,"context_line":"    ``filter-validation`` will not present and the API behavior is unchanged."},{"line_number":25,"context_line":"other:"},{"line_number":26,"context_line":"  - |"},{"line_number":27,"context_line":"    Each plugin can decide if it wants to support filter validation by"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_d70a5325","line":24,"range":{"start_line":24,"start_character":35,"end_line":24,"end_character":42},"updated":"2018-07-05 23:09:03.000000000","message":"be present","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"15c12d8c9ae3c5bff477854101dfea93a27feafe","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    Operators can disable this feature if they want to maintain"},{"line_number":23,"context_line":"    backward-compatibility. If they choose to do that, the API extension"},{"line_number":24,"context_line":"    ``filter-validation`` will not present and the API behavior is unchanged."},{"line_number":25,"context_line":"other:"},{"line_number":26,"context_line":"  - |"},{"line_number":27,"context_line":"    Each plugin can decide if it wants to support filter validation by"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_e56d4767","line":24,"range":{"start_line":24,"start_character":35,"end_line":24,"end_character":42},"in_reply_to":"5f7c97a3_d70a5325","updated":"2018-07-06 16:09:04.000000000","message":"Done","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c97d401057b4a1694057c0485dbcad3821768518","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    Each plugin can decide if it wants to support filter validation by"},{"line_number":28,"context_line":"    setting ``__filter_validation_support`` to True or False. If this field is"},{"line_number":29,"context_line":"    not set, the default value is False."},{"line_number":30,"context_line":"    Right now, all neutron in-tree plugins support filter validation."},{"line_number":31,"context_line":"    Out-of-tree plugins will have filter validation disabled by default but"},{"line_number":32,"context_line":"    they can turn it on if they feel like."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_b7fc760c","line":30,"range":{"start_line":30,"start_character":14,"end_line":30,"end_character":34},"updated":"2018-07-05 23:09:03.000000000","message":"the ML2 plugin and all the Neutron in-tree service","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"15c12d8c9ae3c5bff477854101dfea93a27feafe","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    Each plugin can decide if it wants to support filter validation by"},{"line_number":28,"context_line":"    setting ``__filter_validation_support`` to True or False. If this field is"},{"line_number":29,"context_line":"    not set, the default value is False."},{"line_number":30,"context_line":"    Right now, all neutron in-tree plugins support filter validation."},{"line_number":31,"context_line":"    Out-of-tree plugins will have filter validation disabled by default but"},{"line_number":32,"context_line":"    they can turn it on if they feel like."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_a5918f48","line":30,"range":{"start_line":30,"start_character":14,"end_line":30,"end_character":34},"in_reply_to":"5f7c97a3_b7fc760c","updated":"2018-07-06 16:09:04.000000000","message":"Done","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c97d401057b4a1694057c0485dbcad3821768518","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    not set, the default value is False."},{"line_number":30,"context_line":"    Right now, all neutron in-tree plugins support filter validation."},{"line_number":31,"context_line":"    Out-of-tree plugins will have filter validation disabled by default but"},{"line_number":32,"context_line":"    they can turn it on if they feel like."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_3710664f","line":32,"range":{"start_line":32,"start_character":32,"end_line":32,"end_character":41},"updated":"2018-07-05 23:09:03.000000000","message":"choose to","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"15c12d8c9ae3c5bff477854101dfea93a27feafe","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    not set, the default value is False."},{"line_number":30,"context_line":"    Right now, all neutron in-tree plugins support filter validation."},{"line_number":31,"context_line":"    Out-of-tree plugins will have filter validation disabled by default but"},{"line_number":32,"context_line":"    they can turn it on if they feel like."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"5f7c97a3_4592fb4b","line":32,"range":{"start_line":32,"start_character":32,"end_line":32,"end_character":41},"in_reply_to":"5f7c97a3_3710664f","updated":"2018-07-06 16:09:04.000000000","message":"Done","commit_id":"6666cc2dee3b21bc2f1c8bd714a6e3d7d98bf981"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a9255757c99e0fa4778d80191c52eddcc5c14558","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Starting from this release, neutron server will perform validation on"},{"line_number":5,"context_line":"    filter parameters on list requests. Neutron will return a 400 response"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5f7c97a3_f09d2bba","line":2,"updated":"2018-07-17 19:45:55.000000000","message":"maybe \"prelude\" section would be useful for such big change?","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f5d9e3a3a1ae779c799cdbcea7d8d922cd601076","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Starting from this release, neutron server will perform validation on"},{"line_number":5,"context_line":"    filter parameters on list requests. Neutron will return a 400 response"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5f7c97a3_8b6da668","line":2,"in_reply_to":"5f7c97a3_f09d2bba","updated":"2018-07-17 20:47:48.000000000","message":"Done","commit_id":"765d947ff7fca5e8f4a327c89e5dcc5bf4d0f842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"68f6f826e2c1e09b98607b93e30f6922b2f95cd5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    not set, the default value is False."},{"line_number":34,"context_line":"    Right now, the ML2 plugin and all the in-tree service plugins support"},{"line_number":35,"context_line":"    filter validation. Out-of-tree plugins will have filter validation"},{"line_number":36,"context_line":"    disabled by default but they can turn it on if they choose to."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"5f7c97a3_74548ffd","line":36,"updated":"2018-07-18 21:31:05.000000000","message":"I would at here that for filter validation to be supported, the core plugin and all the services plugins in a deployment must support it","commit_id":"6cda1e6ef115ebc85374befd2bf5e74e7ca89e45"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"3794708d40269d15ad8431e73384108898f22f3e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    not set, the default value is False."},{"line_number":34,"context_line":"    Right now, the ML2 plugin and all the in-tree service plugins support"},{"line_number":35,"context_line":"    filter validation. Out-of-tree plugins will have filter validation"},{"line_number":36,"context_line":"    disabled by default but they can turn it on if they choose to."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"5f7c97a3_8f9d926d","line":36,"in_reply_to":"5f7c97a3_74548ffd","updated":"2018-07-18 22:30:40.000000000","message":"Done","commit_id":"6cda1e6ef115ebc85374befd2bf5e74e7ca89e45"}],"requirements.txt":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3b82834003856b8eb8ac8fd5e41ca18a9d1c0844","unresolved":false,"context_lines":[{"line_number":14,"context_line":"keystonemiddleware\u003e\u003d4.17.0 # Apache-2.0"},{"line_number":15,"context_line":"netaddr\u003e\u003d0.7.18 # BSD"},{"line_number":16,"context_line":"netifaces\u003e\u003d0.10.4 # MIT"},{"line_number":17,"context_line":"neutron-lib\u003e\u003d1.17.0 # Apache-2.0"},{"line_number":18,"context_line":"python-neutronclient\u003e\u003d6.7.0 # Apache-2.0"},{"line_number":19,"context_line":"tenacity\u003e\u003d3.2.1 # Apache-2.0"},{"line_number":20,"context_line":"ryu\u003e\u003d4.24 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_2f4c7074","line":17,"updated":"2018-07-08 07:58:10.000000000","message":"this should be done in a separate unrelated patch","commit_id":"1ba1d235c8413c7f0014e4bc0f85b35136a3cd77"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"b583ede2fa0f13d9683524a3b60b2c350aea2fe7","unresolved":false,"context_lines":[{"line_number":14,"context_line":"keystonemiddleware\u003e\u003d4.17.0 # Apache-2.0"},{"line_number":15,"context_line":"netaddr\u003e\u003d0.7.18 # BSD"},{"line_number":16,"context_line":"netifaces\u003e\u003d0.10.4 # MIT"},{"line_number":17,"context_line":"neutron-lib\u003e\u003d1.17.0 # Apache-2.0"},{"line_number":18,"context_line":"python-neutronclient\u003e\u003d6.7.0 # Apache-2.0"},{"line_number":19,"context_line":"tenacity\u003e\u003d3.2.1 # Apache-2.0"},{"line_number":20,"context_line":"ryu\u003e\u003d4.24 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_c165fee3","line":17,"in_reply_to":"5f7c97a3_2f4c7074","updated":"2018-07-15 04:14:16.000000000","message":"Done","commit_id":"1ba1d235c8413c7f0014e4bc0f85b35136a3cd77"}]}
