)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4a686ed8643199d440fbfb8f09a39e84a143c77d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin_Zheng \u003czhengzhenyu@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-11-21 14:28:48 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Support regex manner filtering port with IP address"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Neutron currently supports filtering ports by matching the exact"},{"line_number":10,"context_line":"IP address. This patch adds support for regex matching using \"LIKE\""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ff82abbf_90f5b2ef","line":7,"range":{"start_line":7,"start_character":14,"end_line":7,"end_character":19},"updated":"2017-11-27 22:00:31.000000000","message":"nit: is it really regex? regex filtering in postgresql uses the ~ operator, and mysql uses REGEXP. What we\u0027re really allowing here is substring pattern matching on IPs when listing ports using LIKE which is the same between PG and MySQL.","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"647c7265040e40392b5ba91dc73d4e32d3dc2345","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kevin_Zheng \u003czhengzhenyu@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-11-21 14:28:48 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Support regex manner filtering port with IP address"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Neutron currently supports filtering ports by matching the exact"},{"line_number":10,"context_line":"IP address. This patch adds support for regex matching using \"LIKE\""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ff82abbf_ecc1a955","line":7,"range":{"start_line":7,"start_character":14,"end_line":7,"end_character":19},"in_reply_to":"ff82abbf_90f5b2ef","updated":"2017-11-28 22:47:14.000000000","message":"Done. The commit message was re-written.","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4a686ed8643199d440fbfb8f09a39e84a143c77d","unresolved":false,"context_lines":[{"line_number":11,"context_line":"SQL operator. If users want to match the exact IP address, they can"},{"line_number":12,"context_line":"continue to use the exact IP address (e.g. \u002710.0.0.3\u0027) as before."},{"line_number":13,"context_line":"For whom wants to use regex matching, they can use wildcards in"},{"line_number":14,"context_line":"\"LIKE\" operator (e.g. \u002710.0.0.%\u0027)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch also  added a new API extension for ``port`` resource"},{"line_number":17,"context_line":"to show whether or not the regex matching capability is available."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ff82abbf_25dfc6d6","line":14,"range":{"start_line":14,"start_character":23,"end_line":14,"end_character":31},"updated":"2017-11-27 22:00:31.000000000","message":"Is this what the user would actually specify in the REST API query string? That seems like it leaks too much detail out of the REST API about how this regex filtering works in the backend. Why don\u0027t we just accept \"10.0.0\" and treat it as a substring always, so even if you specify 10.0.0.3 we treat it as a substring, which could mean you only get back 10.0.0.3 but you could also get ports with IP 10.0.0.30. Maybe that\u0027s undesirable because of the change in API behavior? Since Neutron doesn\u0027t use microversions, maybe this means client side code would have to detect if a new API extension is available, but that would break any existing applications if they were written a year ago and hit a cloud which now has this code and doesn\u0027t default to the old behavior.\n\nAre there any other APIs in Neutron that take a regex/like style filter query parameter that we can base this on?\n\nFWIW this is what Nova uses:\n\nhttps://github.com/openstack/nova/blob/916795e0fd16b2e0e5e4d0a692766431c7c505ba/nova/db/sqlalchemy/api.py#L2408\n\nThe main thing I worry about here is different API behavior depending on the backend RDBMS being used. The good news is that it looks like both postgresql and mysql have the same default escape characeter (\u0027\\\u0027) and both treat \u0027%\u0027 and \u0027_\u0027 the same way.","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"647c7265040e40392b5ba91dc73d4e32d3dc2345","unresolved":false,"context_lines":[{"line_number":11,"context_line":"SQL operator. If users want to match the exact IP address, they can"},{"line_number":12,"context_line":"continue to use the exact IP address (e.g. \u002710.0.0.3\u0027) as before."},{"line_number":13,"context_line":"For whom wants to use regex matching, they can use wildcards in"},{"line_number":14,"context_line":"\"LIKE\" operator (e.g. \u002710.0.0.%\u0027)."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch also  added a new API extension for ``port`` resource"},{"line_number":17,"context_line":"to show whether or not the regex matching capability is available."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ff82abbf_ac364150","line":14,"range":{"start_line":14,"start_character":23,"end_line":14,"end_character":31},"in_reply_to":"ff82abbf_25dfc6d6","updated":"2017-11-28 22:47:14.000000000","message":"Done. It treats IP address as substring now. To maintain the backward-compatibility, we disabled this feature by default. Operators need to explicitly enable this feature via config, and they should expect change in API behavior if they do that.","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"17f5cb3abd8724cd3781e96e028b67772fa2b224","unresolved":false,"context_lines":[{"line_number":10,"context_line":"IP address. This patch adds support for substring matching using"},{"line_number":11,"context_line":"\"LIKE\" SQL operator."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch also added a new API extension for ``port`` resource"},{"line_number":14,"context_line":"to show whether or not the regex matching capability is available."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Zhenyu Zheng \u003czhengzhenyu@huawei.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"df87a7cf_aef7d0f5","line":13,"range":{"start_line":13,"start_character":16,"end_line":13,"end_character":63},"updated":"2017-12-03 04:30:42.000000000","message":"Not see the work for this, please correct me if I\u0027m wrong.","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"786a0a641328f71bab5b2839190d9aea01e74858","unresolved":false,"context_lines":[{"line_number":10,"context_line":"IP address. This patch adds support for substring matching using"},{"line_number":11,"context_line":"\"LIKE\" SQL operator."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch also added a new API extension for ``port`` resource"},{"line_number":14,"context_line":"to show whether or not the regex matching capability is available."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Zhenyu Zheng \u003czhengzhenyu@huawei.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"df87a7cf_2a9b8cc9","line":13,"range":{"start_line":13,"start_character":16,"end_line":13,"end_character":63},"in_reply_to":"df87a7cf_aef7d0f5","updated":"2017-12-04 21:05:13.000000000","message":"The commit message is re-written. Hope it is clear now.","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2d0f45f13d5470998d66a622b46489369cc341af","unresolved":false,"context_lines":[{"line_number":14,"context_line":"the substring matching capability is available."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Zhenyu Zheng \u003czhengzhenyu@huawei.com\u003e"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I9549b2ba676e1bad0812682c3f3f3c97de15f5f6"},{"line_number":19,"context_line":"Closes-Bug: #1718605"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"9f91af0f_b7d30a60","line":17,"updated":"2018-01-09 13:30:10.000000000","message":"This has API impact and doc impact.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"493ad94d1098f47a03c1948aaf729579767fcfde","unresolved":false,"context_lines":[{"line_number":14,"context_line":"the substring matching capability is available."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Zhenyu Zheng \u003czhengzhenyu@huawei.com\u003e"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I9549b2ba676e1bad0812682c3f3f3c97de15f5f6"},{"line_number":19,"context_line":"Closes-Bug: #1718605"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"9f91af0f_f7a8b220","line":17,"in_reply_to":"9f91af0f_b7d30a60","updated":"2018-01-09 13:59:40.000000000","message":"We are not doing doc impact any more [1]. If this patch has doc impacts, then the doc updates should be included here in the patch itself.\n\n\nFor the API impact, I think that\u0027s addressed with [2]. Perhaps [2] could be referenced in the commit message for clarity.\n\n\n[1] I6aa3753772321733920481ac57549a648f92c6de\n[2] I97259b85a2dce5a54bb6ea2cb9d9779ec0a25504","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"d0e2ce6b48e02b7ddef97f77351398560db0a583","unresolved":false,"context_lines":[{"line_number":14,"context_line":"the substring matching capability is available."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Zhenyu Zheng \u003czhengzhenyu@huawei.com\u003e"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I9549b2ba676e1bad0812682c3f3f3c97de15f5f6"},{"line_number":19,"context_line":"Closes-Bug: #1718605"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"9f91af0f_0d317da3","line":17,"in_reply_to":"9f91af0f_f7a8b220","updated":"2018-01-09 20:51:19.000000000","message":"Reference the neutron-lib patch in the commit message. I couldn\u0027t find any doc impact for this patch. If there are some, please provide a pointer.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"}],"neutron/conf/common.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"cb83bfba4fdbccb3ff8dc39319210bca161612ae","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(\u0027ip_substring_filtering\u0027, default\u003dFalse,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow port filtering by using \u0027"},{"line_number":122,"context_line":"                       \u0027substring of IP address.\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":4,"id":"ff82abbf_98acd4ed","line":122,"range":{"start_line":120,"start_character":0,"end_line":122,"end_character":52},"updated":"2017-11-29 03:16:00.000000000","message":"This seems to be a configure option controlled API behavior, I don\u0027t know what is the policy in Neutron, in Nova we don\u0027t allow this kind of conf.","commit_id":"e103a132532bdbdef87e35356c30ee6da8aa1702"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"13b8765f8f2c53b3ad54d6292b323ccaf2f98591","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(\u0027ip_substring_filtering\u0027, default\u003dFalse,"},{"line_number":121,"context_line":"                help\u003d_(\u0027If True, then allow port filtering by using \u0027"},{"line_number":122,"context_line":"                       \u0027substring of IP address.\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":4,"id":"df87a7cf_193bb6d1","line":122,"range":{"start_line":120,"start_character":0,"end_line":122,"end_character":52},"in_reply_to":"ff82abbf_98acd4ed","updated":"2017-12-01 22:24:37.000000000","message":"Removed this option at the latest patchset. To maintain backward-compatibility, I have to introduce a new key \u0027ip-address-substr\u0027 for substring matching. The original key \u0027ip-address\u0027 should be left untouched to avoid any breakage.","commit_id":"e103a132532bdbdef87e35356c30ee6da8aa1702"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"99e662261d106ac2e64e7f98cd45460489352f0c","unresolved":false,"context_lines":[{"line_number":1372,"context_line":"        query \u003d model_query.get_collection_query(context, Port,"},{"line_number":1373,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1374,"context_line":"                                                 *args, **kwargs)"},{"line_number":1375,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1376,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_af73014d","line":1376,"range":{"start_line":1375,"start_character":5,"end_line":1376,"end_character":59},"updated":"2017-12-06 08:15:52.000000000","message":"What is the consideration adding a new param \"ip_address_substr\" specially for substr kind matching instead of make the original ip_address also useable for substr kind matching?","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"45062af69f18cd1e48b43aee5f16c9a0b42705c1","unresolved":false,"context_lines":[{"line_number":1372,"context_line":"        query \u003d model_query.get_collection_query(context, Port,"},{"line_number":1373,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1374,"context_line":"                                                 *args, **kwargs)"},{"line_number":1375,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1376,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_ef7269e3","line":1376,"range":{"start_line":1375,"start_character":5,"end_line":1376,"end_character":59},"in_reply_to":"df87a7cf_af73014d","updated":"2017-12-06 08:24:33.000000000","message":"I think I got your point here, if we change the \"ip_address\" param, the default behavior will be substr matching. Could there be any other walk-around?","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"a9c4d3c0a3ad294ccd93d699f486b651758e48fe","unresolved":false,"context_lines":[{"line_number":1372,"context_line":"        query \u003d model_query.get_collection_query(context, Port,"},{"line_number":1373,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1374,"context_line":"                                                 *args, **kwargs)"},{"line_number":1375,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1376,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_6fdde66e","line":1376,"range":{"start_line":1375,"start_character":5,"end_line":1376,"end_character":59},"in_reply_to":"df87a7cf_ef7269e3","updated":"2017-12-06 19:10:03.000000000","message":"I couldn\u0027t think of any better alternative. Feel free to propose one if you have.","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"86a5b6b00ada5d7536c304c21f9eaf776432957e","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df87a7cf_6a7306b3","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":53},"updated":"2017-12-13 02:28:34.000000000","message":"+Ann Taraday, an SQL expert, to decide whether if this is fine.","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"c44c8e2a449ad9e180c2ee25cb9e04072b159ab8","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df87a7cf_ebbf9d5e","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":52},"updated":"2017-12-07 08:00:08.000000000","message":"I\u0027m not a sql expert, don\u0027t know why we need so much \"%\". And also, I think the design was to support right hand substring match, like 10.0.0 matches 10.0.0.1 and 10.0.0.2 but not 110.0.0.1, so I think the first two \"%%\" can be removed. But correct me if I\u0027m wrong.","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3f656b57bc9884b5b89e13cd356105dd91daf9b3","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f91af0f_e054e0cc","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":52},"in_reply_to":"df87a7cf_5a30d4e8","updated":"2018-01-03 16:34:50.000000000","message":"I lean to @Zhenyu\u0027s suggestion for supporting right hand substring matching since I couldn\u0027t think of any use case for supporting full substring. For example, it seems there is no use case for using \"10.0.0.1\" to match \"110.0.0.1\".","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0cd45175e67dbcc3257138a8671b06b7c115a683","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df87a7cf_e13e66b8","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":52},"in_reply_to":"df87a7cf_5a30d4e8","updated":"2017-12-12 20:15:07.000000000","message":"Will this also work for filtering on an IPv6 address?","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3f656b57bc9884b5b89e13cd356105dd91daf9b3","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f91af0f_00fea4ad","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":52},"in_reply_to":"df87a7cf_e13e66b8","updated":"2018-01-03 16:34:50.000000000","message":"I think IPv6 address should work the same as IPv4 since substring matching is not specific to a particular IP version. However, please do let me know if there is something we should do for IPv6.","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"33a7e96e224bc4acc567654b3808c8b9460281ae","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"df87a7cf_5a30d4e8","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":52},"in_reply_to":"df87a7cf_ebbf9d5e","updated":"2017-12-07 08:59:39.000000000","message":"About first question it looks that it will result with proper string with single \"%\" on both sides:\n\n    \u003e\u003e\u003e ip \u003d \"192.168.1.1\"\n    \u003e\u003e\u003e \"%%%s%%\" % ip\n    \u0027%192.168.1.1%\u0027\n\nAbout Your second question I don\u0027t see a point why there should be such limitation. There is no info about that in related bug description or in thread on ML:  http://lists.openstack.org/pipermail/openstack-operators/2017-October/014459.html","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3f656b57bc9884b5b89e13cd356105dd91daf9b3","unresolved":false,"context_lines":[{"line_number":1377,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1378,"context_line":"        if ip_addresses_s:"},{"line_number":1379,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("},{"line_number":1380,"context_line":"                IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1381,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1382,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1383,"context_line":"        elif ip_addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f91af0f_805ab427","line":1380,"range":{"start_line":1380,"start_character":45,"end_line":1380,"end_character":52},"in_reply_to":"df87a7cf_ebbf9d5e","updated":"2018-01-03 16:34:50.000000000","message":"Done","commit_id":"01587e043f5fc79647893858c47ea78c170f32c6"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"62136186f07e65c1ff55b009354566889da7e14f","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1377,"context_line":"                                                 *args, **kwargs)"},{"line_number":1378,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1379,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1380,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1381,"context_line":"        if ip_addresses_s:"},{"line_number":1382,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_6503d410","line":1379,"range":{"start_line":1379,"start_character":40,"end_line":1379,"end_character":57},"updated":"2018-01-05 13:33:39.000000000","message":"Maybe this should be a constant in the API def??","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3421d9cd718baae8f615611bb43d763d5e85c94e","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1377,"context_line":"                                                 *args, **kwargs)"},{"line_number":1378,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1379,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1380,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1381,"context_line":"        if ip_addresses_s:"},{"line_number":1382,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_078e832d","line":1379,"range":{"start_line":1379,"start_character":40,"end_line":1379,"end_character":57},"in_reply_to":"9f91af0f_6503d410","updated":"2018-01-05 21:06:18.000000000","message":"Other constants (e.g. \u0027fixed_ips\u0027, \u0027ip_address\u0027) are not from API def, so I feel this is optional.","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"65b0a27aef95a4a8de385fabaecf30f667d12ff0","unresolved":false,"context_lines":[{"line_number":1383,"context_line":"                IPAllocation.ip_address.like(\u0027%s%%\u0027 % ip))"},{"line_number":1384,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1385,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1386,"context_line":"        elif ip_addresses:"},{"line_number":1387,"context_line":"            query \u003d query.filter("},{"line_number":1388,"context_line":"                Port.fixed_ips.any(IPAllocation.ip_address.in_(ip_addresses)))"},{"line_number":1389,"context_line":"        if subnet_ids:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_55ad2386","line":1386,"updated":"2018-01-05 08:58:30.000000000","message":"can it be that user will provide both: \"ip_address and ip_address_substr\"? From above code it looks that it is possible. Why substr have higher priority over exactly specified IP then?","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3421d9cd718baae8f615611bb43d763d5e85c94e","unresolved":false,"context_lines":[{"line_number":1383,"context_line":"                IPAllocation.ip_address.like(\u0027%s%%\u0027 % ip))"},{"line_number":1384,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1385,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1386,"context_line":"        elif ip_addresses:"},{"line_number":1387,"context_line":"            query \u003d query.filter("},{"line_number":1388,"context_line":"                Port.fixed_ips.any(IPAllocation.ip_address.in_(ip_addresses)))"},{"line_number":1389,"context_line":"        if subnet_ids:"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_d4e04cfd","line":1386,"in_reply_to":"9f91af0f_55ad2386","updated":"2018-01-05 21:06:18.000000000","message":"Done. User can provide both \"ip_address\" and \"ip_address_substr\" now.","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f7ba6bfb570cfabbd101b53f27d88f13698e94e1","unresolved":false,"context_lines":[{"line_number":1384,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1385,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1386,"context_line":"        if ip_addresses:"},{"line_number":1387,"context_line":"            query \u003d query.filter("},{"line_number":1388,"context_line":"                Port.fixed_ips.any(IPAllocation.ip_address.in_(ip_addresses)))"},{"line_number":1389,"context_line":"        if subnet_ids:"},{"line_number":1390,"context_line":"            query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_324adeab","line":1387,"updated":"2018-01-06 10:10:11.000000000","message":"but what will be the result now if I will give e.g. something like:\n\nip_addresses \u003d 10.0.0.10\nip_addresses_s \u003d 192.168.*.*\n\n?\n\nMaybe You can add some UT to cover such case?","commit_id":"4e2d9b9e7f96752995dde12d85772e48fe799031"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"5f860d6b582e30164d1cec477cc9d0691bdb2dff","unresolved":false,"context_lines":[{"line_number":1384,"context_line":"                for ip in ip_addresses_s])"},{"line_number":1385,"context_line":"            query \u003d query.filter(substr_filter)"},{"line_number":1386,"context_line":"        if ip_addresses:"},{"line_number":1387,"context_line":"            query \u003d query.filter("},{"line_number":1388,"context_line":"                Port.fixed_ips.any(IPAllocation.ip_address.in_(ip_addresses)))"},{"line_number":1389,"context_line":"        if subnet_ids:"},{"line_number":1390,"context_line":"            query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":16,"id":"9f91af0f_34970fef","line":1387,"in_reply_to":"9f91af0f_324adeab","updated":"2018-01-08 17:58:01.000000000","message":"The result is an empty match. Added the test case \u0027test_list_ports_filtered_by_fixed_ip_substring_dual_stack\u0027 for verifying this.","commit_id":"4e2d9b9e7f96752995dde12d85772e48fe799031"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2d0f45f13d5470998d66a622b46489369cc341af","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1377,"context_line":"                                                 *args, **kwargs)"},{"line_number":1378,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1379,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1380,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1381,"context_line":"        if ip_addresses_s:"},{"line_number":1382,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_374cda40","line":1379,"updated":"2018-01-09 13:30:10.000000000","message":"this will do this irrespective of whether or not the extension is invoked.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"d0e2ce6b48e02b7ddef97f77351398560db0a583","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"                                                 filters\u003dfilters,"},{"line_number":1377,"context_line":"                                                 *args, **kwargs)"},{"line_number":1378,"context_line":"        ip_addresses \u003d fixed_ips.get(\u0027ip_address\u0027)"},{"line_number":1379,"context_line":"        ip_addresses_s \u003d fixed_ips.get(\u0027ip_address_substr\u0027)"},{"line_number":1380,"context_line":"        subnet_ids \u003d fixed_ips.get(\u0027subnet_id\u0027)"},{"line_number":1381,"context_line":"        if ip_addresses_s:"},{"line_number":1382,"context_line":"            substr_filter \u003d or_(*[Port.fixed_ips.any("}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_ed29b936","line":1379,"in_reply_to":"9f91af0f_374cda40","updated":"2018-01-09 20:51:19.000000000","message":"Done","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"}],"neutron/extensions/ip_regex_port_filtering.py":[{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"cb15de0310562247ab9e354cc5f3e944d080d8a8","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.api import converters"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":"from neutron_lib.api import validators"},{"line_number":18,"context_line":"from neutron_lib import constants"},{"line_number":19,"context_line":"from neutron_lib import exceptions"},{"line_number":20,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_7e21754d","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":38},"updated":"2017-11-21 04:00:14.000000000","message":"please fix pep8 issue: imported but unused","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"a4653b9f09491ad7ede6363b3a7333cca005738e","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.api import converters"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":"from neutron_lib.api import validators"},{"line_number":18,"context_line":"from neutron_lib import constants"},{"line_number":19,"context_line":"from neutron_lib import exceptions"},{"line_number":20,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_c4cb0ea3","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":38},"in_reply_to":"ff82abbf_7e21754d","updated":"2017-11-21 06:29:22.000000000","message":"Done","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"cb15de0310562247ab9e354cc5f3e944d080d8a8","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":"from neutron_lib.api import validators"},{"line_number":18,"context_line":"from neutron_lib import constants"},{"line_number":19,"context_line":"from neutron_lib import exceptions"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_9e1eb90a","line":19,"range":{"start_line":19,"start_character":24,"end_line":19,"end_character":34},"updated":"2017-11-21 04:00:14.000000000","message":"ditto","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"a4653b9f09491ad7ede6363b3a7333cca005738e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":"from neutron_lib.api import validators"},{"line_number":18,"context_line":"from neutron_lib import constants"},{"line_number":19,"context_line":"from neutron_lib import exceptions"},{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_e4d09253","line":19,"range":{"start_line":19,"start_character":24,"end_line":19,"end_character":34},"in_reply_to":"ff82abbf_9e1eb90a","updated":"2017-11-21 06:29:22.000000000","message":"Done","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"cb15de0310562247ab9e354cc5f3e944d080d8a8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron._i18n import _"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_3e1bed1b","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":27},"updated":"2017-11-21 04:00:14.000000000","message":"ditto","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"a4653b9f09491ad7ede6363b3a7333cca005738e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from oslo_config import cfg"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron._i18n import _"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_84c50691","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":27},"in_reply_to":"ff82abbf_3e1bed1b","updated":"2017-11-21 06:29:22.000000000","message":"Done","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"cb15de0310562247ab9e354cc5f3e944d080d8a8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"IPREGEXPORTFILTERING \u003d \u0027ip_regex_port_filtering\u0027"},{"line_number":29,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":30,"context_line":"    \u0027networks\u0027: {"},{"line_number":31,"context_line":"        VLANTRANSPARENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_boolean,"},{"line_number":33,"context_line":"                          \u0027default\u0027: constants.ATTR_NOT_SPECIFIED,"},{"line_number":34,"context_line":"                          \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_1ed86951","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":23},"updated":"2017-11-21 04:00:14.000000000","message":"undefined name \u0027VLANTRANSPARENT\u0027","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"a4653b9f09491ad7ede6363b3a7333cca005738e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"IPREGEXPORTFILTERING \u003d \u0027ip_regex_port_filtering\u0027"},{"line_number":29,"context_line":"EXTENDED_ATTRIBUTES_2_0 \u003d {"},{"line_number":30,"context_line":"    \u0027networks\u0027: {"},{"line_number":31,"context_line":"        VLANTRANSPARENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"                          \u0027convert_to\u0027: converters.convert_to_boolean,"},{"line_number":33,"context_line":"                          \u0027default\u0027: constants.ATTR_NOT_SPECIFIED,"},{"line_number":34,"context_line":"                          \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff82abbf_a4c28a84","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":23},"in_reply_to":"ff82abbf_1ed86951","updated":"2017-11-21 06:29:22.000000000","message":"Done","commit_id":"388f02b9ec99722444b9be7004503d2a817a72a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4a686ed8643199d440fbfb8f09a39e84a143c77d","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IpRegexPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":43,"context_line":"    \"\"\"Extension class supporting vlan transparent networks.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_d0a1faf9","line":43,"range":{"start_line":43,"start_character":34,"end_line":43,"end_character":59},"updated":"2017-11-27 22:00:31.000000000","message":"copy/paste error","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"647c7265040e40392b5ba91dc73d4e32d3dc2345","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class IpRegexPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":43,"context_line":"    \"\"\"Extension class supporting vlan transparent networks.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_ec7e89e2","line":43,"range":{"start_line":43,"start_character":34,"end_line":43,"end_character":59},"in_reply_to":"ff82abbf_d0a1faf9","updated":"2017-11-28 22:47:14.000000000","message":"Done","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4a686ed8643199d440fbfb8f09a39e84a143c77d","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @classmethod"},{"line_number":54,"context_line":"    def get_description(cls):"},{"line_number":55,"context_line":"        return \"Provides Regex manner IP filtering when list ports\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_d08a5a68","line":55,"range":{"start_line":55,"start_character":25,"end_line":55,"end_character":30},"updated":"2017-11-27 22:00:31.000000000","message":"regex","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"647c7265040e40392b5ba91dc73d4e32d3dc2345","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    @classmethod"},{"line_number":54,"context_line":"    def get_description(cls):"},{"line_number":55,"context_line":"        return \"Provides Regex manner IP filtering when list ports\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_6c6a791a","line":55,"range":{"start_line":55,"start_character":25,"end_line":55,"end_character":30},"in_reply_to":"ff82abbf_d08a5a68","updated":"2017-11-28 22:47:14.000000000","message":"Done","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4a686ed8643199d440fbfb8f09a39e84a143c77d","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_updated(cls):"},{"line_number":59,"context_line":"        return \"2015-03-23T09:00:00-00:00\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_extended_resources(self, version):"},{"line_number":62,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_f0b51e33","line":59,"updated":"2017-11-27 22:00:31.000000000","message":"I assume you need to change this.","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"647c7265040e40392b5ba91dc73d4e32d3dc2345","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_updated(cls):"},{"line_number":59,"context_line":"        return \"2015-03-23T09:00:00-00:00\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_extended_resources(self, version):"},{"line_number":62,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff82abbf_0c75edf9","line":59,"in_reply_to":"ff82abbf_f0b51e33","updated":"2017-11-28 22:47:14.000000000","message":"Done","commit_id":"856e5eacd3c943dd7390e90361d2626e480a06b6"}],"neutron/extensions/ip_substring_port_filtering.py":[{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"17f5cb3abd8724cd3781e96e028b67772fa2b224","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.api import extensions"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_4e6964bc","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":33},"updated":"2017-12-03 04:30:42.000000000","message":"Please remove unused constant here.","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"786a0a641328f71bab5b2839190d9aea01e74858","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.api import extensions"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_4aa050f5","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":33},"in_reply_to":"df87a7cf_4e6964bc","updated":"2017-12-04 21:05:13.000000000","message":"Done","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"973bf2a76b4840795f5c52e951d16572efdc6f65","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib.api import extensions"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":19,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_96abd587","line":18,"updated":"2017-12-05 11:41:00.000000000","message":"I think we should put this directly into neutron_lib.api.defintions. Otherwise it\u0027ll just have to be moved there soon anyway.","commit_id":"e1f2bb8c8a7a9fa5f17bdecff3d2d54a16c435a6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ef1a874a2ba393514440ae5abaad0acc4600d702","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib.api import extensions"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":19,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_fc5a374e","line":18,"in_reply_to":"df87a7cf_96abd587","updated":"2017-12-05 18:17:34.000000000","message":"Done","commit_id":"e1f2bb8c8a7a9fa5f17bdecff3d2d54a16c435a6"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"fc6868d5cf0e33b02cdaf9d1a9e100ad28c39527","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from neutron_lib.api import extensions"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":19,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"df87a7cf_44358545","line":18,"in_reply_to":"df87a7cf_96abd587","updated":"2017-12-05 21:42:58.000000000","message":"It looks I cannot do it right now. The pep8 job is complaining.","commit_id":"e1f2bb8c8a7a9fa5f17bdecff3d2d54a16c435a6"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f553fe8e1f1ea6f7e382e17bf38fcbadbc688924","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.api.definitions import ip_substring_filtering as apidef"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_3ff3ac0c","line":15,"range":{"start_line":15,"start_character":40,"end_line":15,"end_character":63},"updated":"2017-12-05 22:12:07.000000000","message":"The way I am working around a similar problem with another patch is that I added the lib definition to me patch: https://review.openstack.org/#/c/414251/34/neutron/extensions/portbindings_extended_lib.py. That way I can continue working while the definition merges in neutro-lib and gets released","commit_id":"85edd0e5261269d586584567a31832ffcdc99a98"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"cf844c0eed73b844576f09c25c2310884baf5cc8","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron_lib.api.definitions import ip_substring_filtering as apidef"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df87a7cf_5e7a2d88","line":15,"range":{"start_line":15,"start_character":40,"end_line":15,"end_character":63},"in_reply_to":"df87a7cf_3ff3ac0c","updated":"2017-12-06 04:51:33.000000000","message":"Thanks for the tips @Miguel.","commit_id":"85edd0e5261269d586584567a31832ffcdc99a98"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"65b0a27aef95a4a8de385fabaecf30f667d12ff0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_d59ff300","line":19,"updated":"2018-01-05 08:58:30.000000000","message":"Is this class name proper? In py27 UT logs there is a lot of messages like:\n\n    Did not find expected name \"Ip_substring_port_filtering\"\n\nFor example: http://logs.openstack.org/83/521683/15/check/openstack-tox-py27/292e601/job-output.txt.gz#_2018-01-04_22_12_17_067684","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"62136186f07e65c1ff55b009354566889da7e14f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_6555141d","line":19,"range":{"start_line":19,"start_character":42,"end_line":19,"end_character":61},"updated":"2018-01-05 13:33:39.000000000","message":"Should extend APIExtensionDescriptor if you want to use api_definition","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3421d9cd718baae8f615611bb43d763d5e85c94e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_74e70014","line":19,"range":{"start_line":19,"start_character":42,"end_line":19,"end_character":61},"in_reply_to":"9f91af0f_6555141d","updated":"2018-01-05 21:06:18.000000000","message":"Done","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3421d9cd718baae8f615611bb43d763d5e85c94e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class IpSubstringPortFiltering(extensions.ExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_0793e350","line":19,"in_reply_to":"9f91af0f_d59ff300","updated":"2018-01-05 21:06:18.000000000","message":"Fixed it. This message disappear: http://logs.openstack.org/83/521683/16/check/openstack-tox-py27/30fef7e/job-output.txt.gz","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2d0f45f13d5470998d66a622b46489369cc341af","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.extensions import ip_substring_port_filtering_lib as apidef"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Ip_substring_port_filtering(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_d7532e16","line":16,"updated":"2018-01-09 13:30:10.000000000","message":"this should be in a separate section","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"493ad94d1098f47a03c1948aaf729579767fcfde","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.extensions import ip_substring_port_filtering_lib as apidef"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Ip_substring_port_filtering(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_17543620","line":16,"in_reply_to":"9f91af0f_d7532e16","updated":"2018-01-09 13:59:40.000000000","message":"+1","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"d0e2ce6b48e02b7ddef97f77351398560db0a583","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from neutron.extensions import ip_substring_port_filtering_lib as apidef"},{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Ip_substring_port_filtering(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_0dd65d29","line":16,"in_reply_to":"9f91af0f_d7532e16","updated":"2018-01-09 20:51:19.000000000","message":"Done","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2d0f45f13d5470998d66a622b46489369cc341af","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Ip_substring_port_filtering(extensions.APIExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_d77c8e84","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":33},"updated":"2018-01-09 13:30:10.000000000","message":"I would prefer a classname like: IpSubstringPortFiltering but \nSeems like there is no consistency with the name of extensions","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"d0e2ce6b48e02b7ddef97f77351398560db0a583","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Ip_substring_port_filtering(extensions.APIExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_2dd9e155","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":33},"in_reply_to":"9f91af0f_575e3e44","updated":"2018-01-09 20:51:19.000000000","message":"Exactly.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"493ad94d1098f47a03c1948aaf729579767fcfde","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron_lib.api import extensions"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class Ip_substring_port_filtering(extensions.APIExtensionDescriptor):"},{"line_number":20,"context_line":"    \"\"\"Extension class supporting IP substring port filtering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    api_definition \u003d apidef"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_575e3e44","line":19,"range":{"start_line":19,"start_character":6,"end_line":19,"end_character":33},"in_reply_to":"9f91af0f_d77c8e84","updated":"2018-01-09 13:59:40.000000000","message":"I believe the class name has to match the file name; it\u0027s expected in the auto-loading of the extensions.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"}],"neutron/extensions/ip_substring_port_filtering_lib.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"df1c003a0fcfec3f72aa445ffeba3489db577c24","unresolved":false,"context_lines":[{"line_number":31,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The name of the extension."},{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering extension\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering when list ports\""}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_2ae11fff","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":40},"updated":"2017-12-06 08:44:53.000000000","message":"maybe delete this \"extension\"?","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"18e86f0d7f280a830a7ac7f52dfee923a85bf6a0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The name of the extension."},{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering extension\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering when list ports\""}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_ca04334d","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":40},"in_reply_to":"df87a7cf_2ae11fff","updated":"2017-12-06 09:03:48.000000000","message":"+1","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"2b359203046cbf09e48720abbe3f2cb5796a88e0","unresolved":false,"context_lines":[{"line_number":31,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The name of the extension."},{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering extension\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering when list ports\""}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_12e1e8d0","line":34,"range":{"start_line":34,"start_character":30,"end_line":34,"end_character":40},"in_reply_to":"df87a7cf_2ae11fff","updated":"2017-12-06 16:54:44.000000000","message":"Done","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"18e86f0d7f280a830a7ac7f52dfee923a85bf6a0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering extension\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering when list ports\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# A timestamp of when the extension was introduced."},{"line_number":40,"context_line":"UPDATED_TIMESTAMP \u003d \"2017-11-28T09:00:00-00:00\""}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_aaa76f4f","line":37,"updated":"2017-12-06 09:03:48.000000000","message":"Maybe something like \"Provides substring IP filtering for port listing\" (but I\u0027m not native speaker so... :))","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"2b359203046cbf09e48720abbe3f2cb5796a88e0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering extension\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering when list ports\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# A timestamp of when the extension was introduced."},{"line_number":40,"context_line":"UPDATED_TIMESTAMP \u003d \"2017-11-28T09:00:00-00:00\""}],"source_content_type":"text/x-python","patch_set":12,"id":"df87a7cf_72d154fb","line":37,"in_reply_to":"df87a7cf_aaa76f4f","updated":"2017-12-06 16:54:44.000000000","message":"Done","commit_id":"908982e0ed02184f0747b3513d5224e2e06b2a10"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"640b6f25245c2366e789f84056e3fb11748d183d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The name of the extension."},{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering for port listing\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_81f05f69","line":34,"updated":"2018-01-04 17:50:47.000000000","message":"This and description should match the neutron-lib change:\n\nhttps://review.openstack.org/#/c/525284/6/neutron_lib/api/definitions/ip_substring_filtering.py","commit_id":"bad77581a44320091d0a5866d8455f849d96ed4b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"a772a26d38a192c71058bc29171497cf27dd7438","unresolved":false,"context_lines":[{"line_number":31,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The name of the extension."},{"line_number":34,"context_line":"NAME \u003d \u0027IP Substring Filtering\u0027"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# The description of the extension."},{"line_number":37,"context_line":"DESCRIPTION \u003d \"Provides substring IP filtering for port listing\""}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_3ca5f604","line":34,"in_reply_to":"9f91af0f_81f05f69","updated":"2018-01-04 18:05:37.000000000","message":"Done","commit_id":"bad77581a44320091d0a5866d8455f849d96ed4b"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"62136186f07e65c1ff55b009354566889da7e14f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\""},{"line_number":14,"context_line":"This module should be deleted once neutron-lib containing"},{"line_number":15,"context_line":"https://review.openstack.org/#/c/525284/ change is released."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_251e2c70","line":14,"updated":"2018-01-05 13:33:39.000000000","message":"Should we add a TODO here so it\u0027s easier to find (e.g. just grep for \"TODO\")?","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"3421d9cd718baae8f615611bb43d763d5e85c94e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\""},{"line_number":14,"context_line":"This module should be deleted once neutron-lib containing"},{"line_number":15,"context_line":"https://review.openstack.org/#/c/525284/ change is released."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9f91af0f_94e2c400","line":14,"in_reply_to":"9f91af0f_251e2c70","updated":"2018-01-05 21:06:18.000000000","message":"Done","commit_id":"88bf3d0b4573c33211475f8e5d52c9b5378e5e10"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"f33c8f57380dcaca541757b9f828ce81b77409ae","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                    \"network_availability_zone\","},{"line_number":155,"context_line":"                                    \"default-subnetpools\","},{"line_number":156,"context_line":"                                    \"subnet-service-types\","},{"line_number":157,"context_line":"                                    \"ip-substring-filtering\"]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @property"},{"line_number":160,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_0c298d99","line":157,"range":{"start_line":157,"start_character":37,"end_line":157,"end_character":59},"updated":"2018-01-09 13:20:01.000000000","message":"Nit: use the ALIAS of the api definition/extension.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"d0e2ce6b48e02b7ddef97f77351398560db0a583","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                                    \"network_availability_zone\","},{"line_number":155,"context_line":"                                    \"default-subnetpools\","},{"line_number":156,"context_line":"                                    \"subnet-service-types\","},{"line_number":157,"context_line":"                                    \"ip-substring-filtering\"]"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @property"},{"line_number":160,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_6dc36958","line":157,"range":{"start_line":157,"start_character":37,"end_line":157,"end_character":59},"in_reply_to":"9f91af0f_0c298d99","updated":"2018-01-09 20:51:19.000000000","message":"I am not sure. The rest of the extensions are not using ALIAS. If this needs to be done for all extensions, I can propose a follow-up patch for that.","commit_id":"9961a445a7d75dcefa7c9d1870d5d2076345759b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"09c2e17269a558be6d4177e9c6bf15f5043e8798","unresolved":false,"context_lines":[{"line_number":1860,"context_line":"        if ip_addresses_s:"},{"line_number":1861,"context_line":"            if \u0027ip-substring-filtering\u0027 in self.supported_extension_aliases:"},{"line_number":1862,"context_line":"                substr_filter \u003d or_(*[models_v2.Port.fixed_ips.any("},{"line_number":1863,"context_line":"                    models_v2.IPAllocation.ip_address.like(\u0027%s%%\u0027 % ip))"},{"line_number":1864,"context_line":"                    for ip in ip_addresses_s])"},{"line_number":1865,"context_line":"                query \u003d query.filter(substr_filter)"},{"line_number":1866,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_7b3678b7","line":1863,"range":{"start_line":1863,"start_character":59,"end_line":1863,"end_character":65},"updated":"2018-01-10 22:19:07.000000000","message":"Any specific reason why this is only allowing a substring prefix and not the substring anywhere in the IP address, like \u0027%%%s%%\u0027?","commit_id":"221690c118d8fc19c8ef6cb14ffd62ffe4497b86"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"322685e6c954a72197a8005b6aa566d2bda34368","unresolved":false,"context_lines":[{"line_number":1860,"context_line":"        if ip_addresses_s:"},{"line_number":1861,"context_line":"            if \u0027ip-substring-filtering\u0027 in self.supported_extension_aliases:"},{"line_number":1862,"context_line":"                substr_filter \u003d or_(*[models_v2.Port.fixed_ips.any("},{"line_number":1863,"context_line":"                    models_v2.IPAllocation.ip_address.like(\u0027%s%%\u0027 % ip))"},{"line_number":1864,"context_line":"                    for ip in ip_addresses_s])"},{"line_number":1865,"context_line":"                query \u003d query.filter(substr_filter)"},{"line_number":1866,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_fbf7e8d3","line":1863,"range":{"start_line":1863,"start_character":59,"end_line":1863,"end_character":65},"in_reply_to":"7f96bb07_7b3678b7","updated":"2018-01-10 22:20:56.000000000","message":"Cinder example:\n\nhttp://git.openstack.org/cgit/openstack/cinder/tree/cinder/db/sqlalchemy/api.py#n1886\n\nNova example:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/db/sqlalchemy/api.py#n709\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/db/sqlalchemy/api.py#n2416","commit_id":"221690c118d8fc19c8ef6cb14ffd62ffe4497b86"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"651dc842fc917afeb130479616d5477e76e054d4","unresolved":false,"context_lines":[{"line_number":1860,"context_line":"        if ip_addresses_s:"},{"line_number":1861,"context_line":"            if \u0027ip-substring-filtering\u0027 in self.supported_extension_aliases:"},{"line_number":1862,"context_line":"                substr_filter \u003d or_(*[models_v2.Port.fixed_ips.any("},{"line_number":1863,"context_line":"                    models_v2.IPAllocation.ip_address.like(\u0027%s%%\u0027 % ip))"},{"line_number":1864,"context_line":"                    for ip in ip_addresses_s])"},{"line_number":1865,"context_line":"                query \u003d query.filter(substr_filter)"},{"line_number":1866,"context_line":"        return query"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f96bb07_bdb702d9","line":1863,"range":{"start_line":1863,"start_character":59,"end_line":1863,"end_character":65},"in_reply_to":"7f96bb07_7b3678b7","updated":"2018-01-11 15:44:05.000000000","message":"Done","commit_id":"221690c118d8fc19c8ef6cb14ffd62ffe4497b86"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"31d4b74759ceb238fa590cee438631290a39fea2","unresolved":false,"context_lines":[{"line_number":1858,"context_line":"        query \u003d super(Ml2Plugin, self)._get_ports_query(context, filters,"},{"line_number":1859,"context_line":"                                                        *args, **kwargs)"},{"line_number":1860,"context_line":"        if ip_addresses_s:"},{"line_number":1861,"context_line":"            if \u0027ip-substring-filtering\u0027 in self.supported_extension_aliases:"},{"line_number":1862,"context_line":"                substr_filter \u003d or_(*[models_v2.Port.fixed_ips.any("},{"line_number":1863,"context_line":"                    models_v2.IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1864,"context_line":"                    for ip in ip_addresses_s])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_1fa4d556","line":1861,"updated":"2018-01-12 08:30:42.000000000","message":"I\u0027m not sure if this check is necessary here. It would be required IMHO if this method would be defined in some db class but here it is always true as You add this extension to list in L158","commit_id":"90e23d6f2c6324f405c488319a7e50c7672efe69"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"7761a7d1df666dd448de7f60be0c120a798c66d1","unresolved":false,"context_lines":[{"line_number":1858,"context_line":"        query \u003d super(Ml2Plugin, self)._get_ports_query(context, filters,"},{"line_number":1859,"context_line":"                                                        *args, **kwargs)"},{"line_number":1860,"context_line":"        if ip_addresses_s:"},{"line_number":1861,"context_line":"            if \u0027ip-substring-filtering\u0027 in self.supported_extension_aliases:"},{"line_number":1862,"context_line":"                substr_filter \u003d or_(*[models_v2.Port.fixed_ips.any("},{"line_number":1863,"context_line":"                    models_v2.IPAllocation.ip_address.like(\u0027%%%s%%\u0027 % ip))"},{"line_number":1864,"context_line":"                    for ip in ip_addresses_s])"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_6babc988","line":1861,"in_reply_to":"7f96bb07_1fa4d556","updated":"2018-01-12 19:43:08.000000000","message":"Done","commit_id":"90e23d6f2c6324f405c488319a7e50c7672efe69"}],"neutron/tests/unit/db/test_db_base_plugin_v2.py":[{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"17f5cb3abd8724cd3781e96e028b67772fa2b224","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"    def test_list_ports_filtered_by_fixed_ip_substring(self):"},{"line_number":1159,"context_line":"        # for this test we need to enable overlapping ips"},{"line_number":1160,"context_line":"        cfg.CONF.set_default(\u0027allow_overlapping_ips\u0027, True)"},{"line_number":1161,"context_line":"        with self.port() as port1, self.port():"},{"line_number":1162,"context_line":"            fixed_ips \u003d port1[\u0027port\u0027][\u0027fixed_ips\u0027][0]"},{"line_number":1163,"context_line":"            query_params \u003d \"\"\""},{"line_number":1164,"context_line":"fixed_ips\u003dip_address_substr%%3D%s\u0026fixed_ips\u003dsubnet_id%%3D%s"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_6e66a8f0","line":1161,"range":{"start_line":1161,"start_character":35,"end_line":1161,"end_character":46},"updated":"2017-12-03 04:30:42.000000000","message":"Not see the purpose of this.","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"786a0a641328f71bab5b2839190d9aea01e74858","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"    def test_list_ports_filtered_by_fixed_ip_substring(self):"},{"line_number":1159,"context_line":"        # for this test we need to enable overlapping ips"},{"line_number":1160,"context_line":"        cfg.CONF.set_default(\u0027allow_overlapping_ips\u0027, True)"},{"line_number":1161,"context_line":"        with self.port() as port1, self.port():"},{"line_number":1162,"context_line":"            fixed_ips \u003d port1[\u0027port\u0027][\u0027fixed_ips\u0027][0]"},{"line_number":1163,"context_line":"            query_params \u003d \"\"\""},{"line_number":1164,"context_line":"fixed_ips\u003dip_address_substr%%3D%s\u0026fixed_ips\u003dsubnet_id%%3D%s"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_caf540cd","line":1161,"range":{"start_line":1161,"start_character":35,"end_line":1161,"end_character":46},"in_reply_to":"df87a7cf_6e66a8f0","updated":"2017-12-04 21:05:13.000000000","message":"Done","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"17f5cb3abd8724cd3781e96e028b67772fa2b224","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    def test_list_ports_filtered_by_fixed_ip_no_match(self):"},{"line_number":1171,"context_line":"        # for this test we need to enable overlapping ips"},{"line_number":1172,"context_line":"        cfg.CONF.set_default(\u0027allow_overlapping_ips\u0027, True)"},{"line_number":1173,"context_line":"        with self.port() as port1, self.port():"},{"line_number":1174,"context_line":"            fixed_ips \u003d port1[\u0027port\u0027][\u0027fixed_ips\u0027][0]"},{"line_number":1175,"context_line":"            query_params \u003d \"\"\""},{"line_number":1176,"context_line":"fixed_ips\u003dip_address_substr%%3D%s\u0026fixed_ips\u003dsubnet_id%%3D%s"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_0e635cde","line":1173,"range":{"start_line":1173,"start_character":35,"end_line":1173,"end_character":46},"updated":"2017-12-03 04:30:42.000000000","message":"ditto","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"786a0a641328f71bab5b2839190d9aea01e74858","unresolved":false,"context_lines":[{"line_number":1170,"context_line":"    def test_list_ports_filtered_by_fixed_ip_no_match(self):"},{"line_number":1171,"context_line":"        # for this test we need to enable overlapping ips"},{"line_number":1172,"context_line":"        cfg.CONF.set_default(\u0027allow_overlapping_ips\u0027, True)"},{"line_number":1173,"context_line":"        with self.port() as port1, self.port():"},{"line_number":1174,"context_line":"            fixed_ips \u003d port1[\u0027port\u0027][\u0027fixed_ips\u0027][0]"},{"line_number":1175,"context_line":"            query_params \u003d \"\"\""},{"line_number":1176,"context_line":"fixed_ips\u003dip_address_substr%%3D%s\u0026fixed_ips\u003dsubnet_id%%3D%s"}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_8aff38a9","line":1173,"range":{"start_line":1173,"start_character":35,"end_line":1173,"end_character":46},"in_reply_to":"df87a7cf_0e635cde","updated":"2017-12-04 21:05:13.000000000","message":"Done","commit_id":"4ba7d5e00bc924fcb495824d62f60ddf4195bbbb"}],"neutron/tests/unit/plugins/ml2/test_plugin.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"31d4b74759ceb238fa590cee438631290a39fea2","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"                tenant_id\u003dtenant_id,"},{"line_number":1245,"context_line":"                net_id\u003dnet_id,"},{"line_number":1246,"context_line":"                cidr\u003d\u00272607:f0d0:1002:51::/124\u0027,"},{"line_number":1247,"context_line":"                ip_version\u003d6,"},{"line_number":1248,"context_line":"                gateway_ip\u003dconstants.ATTR_NOT_SPECIFIED)"},{"line_number":1249,"context_line":"            subnet2 \u003d self.deserialize(self.fmt, res)"},{"line_number":1250,"context_line":"            kwargs \u003d {\"fixed_ips\":"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_8ac98179","line":1247,"range":{"start_line":1247,"start_character":27,"end_line":1247,"end_character":28},"updated":"2018-01-12 08:30:42.000000000","message":"nit: there is constant for that in neutron-lib https://github.com/openstack/neutron-lib/blob/master/neutron_lib/constants.py","commit_id":"90e23d6f2c6324f405c488319a7e50c7672efe69"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"7761a7d1df666dd448de7f60be0c120a798c66d1","unresolved":false,"context_lines":[{"line_number":1244,"context_line":"                tenant_id\u003dtenant_id,"},{"line_number":1245,"context_line":"                net_id\u003dnet_id,"},{"line_number":1246,"context_line":"                cidr\u003d\u00272607:f0d0:1002:51::/124\u0027,"},{"line_number":1247,"context_line":"                ip_version\u003d6,"},{"line_number":1248,"context_line":"                gateway_ip\u003dconstants.ATTR_NOT_SPECIFIED)"},{"line_number":1249,"context_line":"            subnet2 \u003d self.deserialize(self.fmt, res)"},{"line_number":1250,"context_line":"            kwargs \u003d {\"fixed_ips\":"}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_8bae5596","line":1247,"range":{"start_line":1247,"start_character":27,"end_line":1247,"end_character":28},"in_reply_to":"7f96bb07_8ac98179","updated":"2018-01-12 19:43:08.000000000","message":"Addressed in a separated patch: https://review.openstack.org/#/c/533284/","commit_id":"90e23d6f2c6324f405c488319a7e50c7672efe69"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"31d4b74759ceb238fa590cee438631290a39fea2","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"                                      query_params\u003dquery_params)"},{"line_number":1271,"context_line":"            self._delete(\u0027ports\u0027, port1[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1272,"context_line":"            self._delete(\u0027ports\u0027, port2[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1273,"context_line":""},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":"class TestMl2PortsV2WithRevisionPlugin(Ml2PluginV2TestCase):"},{"line_number":1276,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_0ab6d1fb","line":1273,"updated":"2018-01-12 08:30:42.000000000","message":"Please also add UT for case when You want to filter e.g. \".0.0.1\" or something like that","commit_id":"90e23d6f2c6324f405c488319a7e50c7672efe69"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"7761a7d1df666dd448de7f60be0c120a798c66d1","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"                                      query_params\u003dquery_params)"},{"line_number":1271,"context_line":"            self._delete(\u0027ports\u0027, port1[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1272,"context_line":"            self._delete(\u0027ports\u0027, port2[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1273,"context_line":""},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":"class TestMl2PortsV2WithRevisionPlugin(Ml2PluginV2TestCase):"},{"line_number":1276,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7f96bb07_2b95c140","line":1273,"in_reply_to":"7f96bb07_0ab6d1fb","updated":"2018-01-12 19:43:08.000000000","message":"Done","commit_id":"90e23d6f2c6324f405c488319a7e50c7672efe69"}],"releasenotes/notes/ip-substring-port-filtering-f5c3d89c4a91e867.yaml":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c823f13a27a522d6a31f66b5b3524d38e39b4f3b","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":"    Support substring matching when filtering ports by IP address."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"7f96bb07_9bcb441d","line":4,"updated":"2018-01-10 22:31:08.000000000","message":"If it tuns out that we should focus on right hand substring, we should probably indicate it here","commit_id":"221690c118d8fc19c8ef6cb14ffd62ffe4497b86"}]}
