)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":21781,"name":"Hunt Xu","email":"mhuntxu@gmail.com","username":"huntxu"},"change_message_id":"fe33919f66800d8d168cfc59a8ed19f0a3127ec0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  GET \"/ports?device_id\u003d\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"* Enable users to filter list result with attributes"},{"line_number":16,"context_line":"  with value \u0027null\u0027 that will be interpreted as None."},{"line_number":17,"context_line":"  For example, the request below will list all legacy subnets"},{"line_number":18,"context_line":"  (assume the legacy subnets are the ones without subnetpools)."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_7c55ac1c","line":16,"range":{"start_line":16,"start_character":7,"end_line":16,"end_character":52},"updated":"2018-03-12 09:30:30.000000000","message":"This \u0027null\u0027 seems to be a magic string. What if I want to filter something with the value happen to be \u0027null\u0027 itself. For example, if I have several subnets named \u0027null\u0027, I can no longer filter them out by name with this patch?","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"457804dcb70cb94ca6ba32b8c1409dbbeece0fd0","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  GET \"/ports?device_id\u003d\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"* Enable users to filter list result with attributes"},{"line_number":16,"context_line":"  with value \u0027null\u0027 that will be interpreted as None."},{"line_number":17,"context_line":"  For example, the request below will list all legacy subnets"},{"line_number":18,"context_line":"  (assume the legacy subnets are the ones without subnetpools)."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_4537764e","line":16,"range":{"start_line":16,"start_character":7,"end_line":16,"end_character":52},"in_reply_to":"df7087c5_7c55ac1c","updated":"2018-03-13 20:45:21.000000000","message":"Yes but we are not able to filter attribute with value None right now. Both approaches are not perfect. If you have a better solution, please feel free to suggest.","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"263710ecd7175846d355788b11bebd84e436a26b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"  For example, the request below will list all legacy subnets"},{"line_number":18,"context_line":"  (assume the legacy subnets are the ones without subnetpools)."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"  GET \"/subnets?subnetpool_id\u003dnull\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9001214de126eb888c2425b6a6275f59ec8478e7"},{"line_number":23,"context_line":"Closes-Bug: #1749304"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_8973a04d","line":20,"updated":"2018-03-12 08:28:13.000000000","message":"why only \"null\" value can be send in such case and not e.g. none?","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"457804dcb70cb94ca6ba32b8c1409dbbeece0fd0","unresolved":false,"context_lines":[{"line_number":17,"context_line":"  For example, the request below will list all legacy subnets"},{"line_number":18,"context_line":"  (assume the legacy subnets are the ones without subnetpools)."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"  GET \"/subnets?subnetpool_id\u003dnull\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9001214de126eb888c2425b6a6275f59ec8478e7"},{"line_number":23,"context_line":"Closes-Bug: #1749304"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_e5280ae3","line":20,"in_reply_to":"df7087c5_8973a04d","updated":"2018-03-13 20:45:21.000000000","message":"I can pick \"none\" if that is preference of the team.","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"263710ecd7175846d355788b11bebd84e436a26b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"  (assume the legacy subnets are the ones without subnetpools)."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"  GET \"/subnets?subnetpool_id\u003dnull\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9001214de126eb888c2425b6a6275f59ec8478e7"},{"line_number":23,"context_line":"Closes-Bug: #1749304"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_c979982f","line":21,"updated":"2018-03-12 08:28:13.000000000","message":"IMO ApiImact flag is necessary here and some follow up patch for neutron-lib\u0027s api-ref should be proposed for that","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"1904622b0f55ce5911720706fd1488d144745e53","unresolved":false,"context_lines":[{"line_number":18,"context_line":"  (assume the legacy subnets are the ones without subnetpools)."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"  GET \"/subnets?subnetpool_id\u003dnull\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I9001214de126eb888c2425b6a6275f59ec8478e7"},{"line_number":23,"context_line":"Closes-Bug: #1749304"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_e84bff27","line":21,"in_reply_to":"df7087c5_c979982f","updated":"2018-03-13 20:49:05.000000000","message":"Done","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"116128781d93388c51a9403f64a13343693710c3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support filter attribute with empty string"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will enable users to filter list result with attributes"},{"line_number":10,"context_line":"with empty value. For example, the request below will list"},{"line_number":11,"context_line":"all unbound ports (unbound ports have blank device_id)."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9f6a8fd7_4ed2a536","line":9,"range":{"start_line":9,"start_character":33,"end_line":9,"end_character":44},"updated":"2018-04-29 07:44:10.000000000","message":"shouldn\u0027t be \"list of results\"?","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"9c32e55f0359dba6c6700cd61f6df863b665ba2c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support filter attribute with empty string"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will enable users to filter list result with attributes"},{"line_number":10,"context_line":"with empty value. For example, the request below will list"},{"line_number":11,"context_line":"all unbound ports (unbound ports have blank device_id)."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9f6a8fd7_48dcc673","line":9,"range":{"start_line":9,"start_character":33,"end_line":9,"end_character":44},"in_reply_to":"9f6a8fd7_4ed2a536","updated":"2018-04-30 21:56:07.000000000","message":"Done","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"}],"neutron/api/api_common.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"263710ecd7175846d355788b11bebd84e436a26b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    for key, values in data.items():"},{"line_number":81,"context_line":"        if key in skips or hasattr(model_base.BASEV2, key):"},{"line_number":82,"context_line":"            continue"},{"line_number":83,"context_line":"        values \u003d [v if v !\u003d \"null\" else None"},{"line_number":84,"context_line":"                  for v in values if v or v \u003d\u003d \"\"]"},{"line_number":85,"context_line":"        key_attr_info \u003d attr_info.get(key, {})"},{"line_number":86,"context_line":"        if \u0027convert_list_to\u0027 in key_attr_info:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_099d5058","line":83,"range":{"start_line":83,"start_character":29,"end_line":83,"end_character":33},"updated":"2018-03-12 08:28:13.000000000","message":"maybe stupid question but why it has to be lowercase only? Shouldn\u0027t \"Null\" be valid in such case as well?\nAFAIK keys and parameters in query string are case sensitive, no?","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"457804dcb70cb94ca6ba32b8c1409dbbeece0fd0","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    for key, values in data.items():"},{"line_number":81,"context_line":"        if key in skips or hasattr(model_base.BASEV2, key):"},{"line_number":82,"context_line":"            continue"},{"line_number":83,"context_line":"        values \u003d [v if v !\u003d \"null\" else None"},{"line_number":84,"context_line":"                  for v in values if v or v \u003d\u003d \"\"]"},{"line_number":85,"context_line":"        key_attr_info \u003d attr_info.get(key, {})"},{"line_number":86,"context_line":"        if \u0027convert_list_to\u0027 in key_attr_info:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_286d77cb","line":83,"range":{"start_line":83,"start_character":29,"end_line":83,"end_character":33},"in_reply_to":"df7087c5_099d5058","updated":"2018-03-13 20:45:21.000000000","message":"Sure, we can handle the case difference as well.","commit_id":"358604c0376e6c8c33e203875466de9026c59daf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"224cdfeb2ce3c3753e9000d1304d1c59aee886b1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return res"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def is_empty_string_filtering_supported():"},{"line_number":98,"context_line":"    return \u0027empty-string-filtering\u0027 in (extensions.PluginAwareExtensionManager."},{"line_number":99,"context_line":"                                        get_instance().extensions)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9f6a8fd7_a486d964","line":97,"updated":"2018-05-01 21:40:34.000000000","message":"but why You removed this? I think that it\u0027s still necessary to use it in L83 and allow empty values only if plugin supports this extension. You added this shim extension for ML2 plugin but other plugins may not add it to list of supported extensions and then this feature shouldn\u0027t work, right?","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f983afedeeefcc649746c44b4a4e5d46ccf987d5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    return res"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"def is_empty_string_filtering_supported():"},{"line_number":98,"context_line":"    return \u0027empty-string-filtering\u0027 in (extensions.PluginAwareExtensionManager."},{"line_number":99,"context_line":"                                        get_instance().extensions)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9f6a8fd7_5cd53be4","line":97,"in_reply_to":"9f6a8fd7_a486d964","updated":"2018-05-02 20:14:33.000000000","message":"Done","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"}],"neutron/conf/common.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"116128781d93388c51a9403f64a13343693710c3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027empty_string_filtering\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to filter by attributes \u0027"},{"line_number":122,"context_line":"                       \u0027with empty string value.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"},{"line_number":124,"context_line":"               deprecated_name\u003d\u0027segment_mtu\u0027, deprecated_group\u003d\u0027ml2\u0027,"},{"line_number":125,"context_line":"               help\u003d_(\u0027MTU of the underlying physical network. Neutron uses \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f6a8fd7_eee29901","line":122,"updated":"2018-04-29 07:44:10.000000000","message":"maybe this was agreed on drivers meeting so it\u0027s fine but TBH I\u0027m not a fan of such solution. IMO API shouldn\u0027t be changed depending of config option and IMO if this feature is discoverable by API extension and is properly documented that should be enough.\nAlso I think that this might be confusing for user who don\u0027t use ML2 plugin. Then this might be set to True but core plugin might not support it.","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"9c32e55f0359dba6c6700cd61f6df863b665ba2c","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                       \u0027create VLAN transparent networks.\u0027)),"},{"line_number":120,"context_line":"    cfg.BoolOpt(\u0027empty_string_filtering\u0027, default\u003dTrue,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow plugins to filter by attributes \u0027"},{"line_number":122,"context_line":"                       \u0027with empty string value.\u0027)),"},{"line_number":123,"context_line":"    cfg.IntOpt(\u0027global_physnet_mtu\u0027, default\u003dconstants.DEFAULT_NETWORK_MTU,"},{"line_number":124,"context_line":"               deprecated_name\u003d\u0027segment_mtu\u0027, deprecated_group\u003d\u0027ml2\u0027,"},{"line_number":125,"context_line":"               help\u003d_(\u0027MTU of the underlying physical network. Neutron uses \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f6a8fd7_88cbbea3","line":122,"in_reply_to":"9f6a8fd7_eee29901","updated":"2018-04-30 21:56:07.000000000","message":"Done. I removed this config.","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"}],"neutron/extensions/empty_string_filtering.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"116128781d93388c51a9403f64a13343693710c3","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def _disable_extension_by_config(aliases):"},{"line_number":24,"context_line":"    if not cfg.CONF.empty_string_filtering:"},{"line_number":25,"context_line":"        if \u0027empty-string-filtering\u0027 in aliases:"},{"line_number":26,"context_line":"            aliases.remove(\u0027empty-string-filtering\u0027)"},{"line_number":27,"context_line":"        LOG.info(\u0027Disabled empty string filtering extension.\u0027)"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9f6a8fd7_4ebb85e4","line":25,"range":{"start_line":25,"start_character":12,"end_line":25,"end_character":34},"updated":"2018-04-29 07:44:10.000000000","message":"why not use  apidef.ALIAS here?","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"116128781d93388c51a9403f64a13343693710c3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"def _disable_extension_by_config(aliases):"},{"line_number":24,"context_line":"    if not cfg.CONF.empty_string_filtering:"},{"line_number":25,"context_line":"        if \u0027empty-string-filtering\u0027 in aliases:"},{"line_number":26,"context_line":"            aliases.remove(\u0027empty-string-filtering\u0027)"},{"line_number":27,"context_line":"        LOG.info(\u0027Disabled empty string filtering extension.\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9f6a8fd7_6ec0c951","line":26,"range":{"start_line":26,"start_character":27,"end_line":26,"end_character":51},"updated":"2018-04-29 07:44:10.000000000","message":"and here","commit_id":"e50ace2942c9c3cd45e77bcea6f074df994a5e12"}]}
