)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e7b9b1a08aced423a79ddb85e056543617db9f06","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"43957d76_8ecccebb","updated":"2025-08-14 13:27:37.000000000","message":"recheck","commit_id":"f5ed033b6e71a91b5f9ab83fe73cbf779dcf39d7"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1cf1236620247e4a306c6277a726724a6d49a82b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9ffbcc6f_ec81134a","updated":"2025-08-26 15:37:15.000000000","message":"recheck","commit_id":"f5ed033b6e71a91b5f9ab83fe73cbf779dcf39d7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86b553c31e293b049647e2bd7825391df4dd0e69","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"432f88bd_c99df1d0","updated":"2025-08-27 07:50:22.000000000","message":"I\u0027ve manually tested this patch and is working.\n\nSome automated testing is needed.","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c6be3e66c446b963046d777e937196e4da75513c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"63f9e712_5e35ee49","in_reply_to":"22dbfe8a_a15b6bde","updated":"2025-10-24 14:39:39.000000000","message":"Done","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"fa44232303931cc2e02f47ececd18ac3895c9006","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"89612492_e1cf6bb3","in_reply_to":"432f88bd_c99df1d0","updated":"2025-08-27 22:38:59.000000000","message":"Do you mean specifically adding testing for the case where there is \"stale\" port in the OVN DB (since there is existing AAP testing)? Should be pretty easy to do. I\u0027ll look into that next along with probably moving the code out of ovn_client since it doesn\u0027t have anything to do with ovn anymore.","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"16f8e587116799396fc0b6a5ab8aa06d7afaf82b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"22dbfe8a_a15b6bde","in_reply_to":"89612492_e1cf6bb3","updated":"2025-08-29 15:30:58.000000000","message":"I\u0027m looking more for a DB test using these new filters. Something that could be implemented in the ``objects`` directory. You should be able to create a port with AAP and be able to retrieve using the filter.","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a69f3c98bc6f2d605ef26cc65e34d750076c523","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b5a20a2d_53f92e8f","updated":"2025-10-24 14:39:32.000000000","message":"Manually tested and working fine. Thanks!","commit_id":"5b811fcef52e1d6fe5828389c0bfa5c0c59f1ae3"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8e68f0243dbe753eb9925f3948ee36fdeafe6562","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0a68c1fa_a1f11d13","updated":"2025-10-29 09:31:29.000000000","message":"looks ok","commit_id":"5b811fcef52e1d6fe5828389c0bfa5c0c59f1ae3"}],"neutron/common/ovn/utils.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1cf1236620247e4a306c6277a726724a6d49a82b","unresolved":true,"context_lines":[{"line_number":616,"context_line":"    return list(set(addresses + port_security))"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"def get_virtual_port_parents(context, virtual_ip, subnet_id, port_id):"},{"line_number":620,"context_line":"    plugin \u003d directory.get_plugin()"},{"line_number":621,"context_line":"    filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet_id]},"},{"line_number":622,"context_line":"               \u0027allowed_address_pairs\u0027: {\u0027ip_address\u0027: virtual_ip}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"c7ad9b75_b2c7832f","line":619,"updated":"2025-08-26 15:37:15.000000000","message":"This and the methods which call it aren\u0027t really \"ovn\" methods at all anymore and it seems like moving them somewhere else would make more sense.","commit_id":"f5ed033b6e71a91b5f9ab83fe73cbf779dcf39d7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a69f3c98bc6f2d605ef26cc65e34d750076c523","unresolved":false,"context_lines":[{"line_number":616,"context_line":"    return list(set(addresses + port_security))"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"def get_virtual_port_parents(context, virtual_ip, subnet_id, port_id):"},{"line_number":620,"context_line":"    plugin \u003d directory.get_plugin()"},{"line_number":621,"context_line":"    filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet_id]},"},{"line_number":622,"context_line":"               \u0027allowed_address_pairs\u0027: {\u0027ip_address\u0027: virtual_ip}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"b06908eb_d37c7f0f","line":619,"in_reply_to":"7336230a_9e786854","updated":"2025-10-24 14:39:32.000000000","message":"Agree, we can move this method in a follow-up patch.","commit_id":"f5ed033b6e71a91b5f9ab83fe73cbf779dcf39d7"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8c9c2cd86b2aac2a0029556e193b0ebdcf960b1b","unresolved":true,"context_lines":[{"line_number":616,"context_line":"    return list(set(addresses + port_security))"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"def get_virtual_port_parents(context, virtual_ip, subnet_id, port_id):"},{"line_number":620,"context_line":"    plugin \u003d directory.get_plugin()"},{"line_number":621,"context_line":"    filters \u003d {\u0027fixed_ips\u0027: {\u0027subnet_id\u0027: [subnet_id]},"},{"line_number":622,"context_line":"               \u0027allowed_address_pairs\u0027: {\u0027ip_address\u0027: virtual_ip}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7336230a_9e786854","line":619,"in_reply_to":"c7ad9b75_b2c7832f","updated":"2025-10-23 13:12:23.000000000","message":"For now I\u0027ve left them here because it makes reviewing simpler. We can follow up with a more general `ports_with_allowed_address_pair(subnet, ip)` method.","commit_id":"f5ed033b6e71a91b5f9ab83fe73cbf779dcf39d7"}],"neutron/db/allowedaddresspairs_db.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86b553c31e293b049647e2bd7825391df4dd0e69","unresolved":true,"context_lines":[{"line_number":25,"context_line":"from neutron_lib.objects import exceptions"},{"line_number":26,"context_line":"from neutron_lib.utils import net as net_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from neutron.db.models.allowed_address_pair import AllowedAddressPair"},{"line_number":29,"context_line":"from neutron.db import models_v2"},{"line_number":30,"context_line":"from neutron.objects import base as obj_base"},{"line_number":31,"context_line":"from neutron.objects.port.extensions import (allowedaddresspairs"}],"source_content_type":"text/x-python","patch_set":3,"id":"d111490f_45273df3","line":28,"range":{"start_line":28,"start_character":23,"end_line":28,"end_character":43},"updated":"2025-08-27 07:50:22.000000000","message":"nit: we import always the module, not single classes","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"fa44232303931cc2e02f47ececd18ac3895c9006","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron_lib.objects import exceptions"},{"line_number":26,"context_line":"from neutron_lib.utils import net as net_utils"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from neutron.db.models.allowed_address_pair import AllowedAddressPair"},{"line_number":29,"context_line":"from neutron.db import models_v2"},{"line_number":30,"context_line":"from neutron.objects import base as obj_base"},{"line_number":31,"context_line":"from neutron.objects.port.extensions import (allowedaddresspairs"}],"source_content_type":"text/x-python","patch_set":3,"id":"24225d29_6b20b0b6","line":28,"range":{"start_line":28,"start_character":23,"end_line":28,"end_character":43},"in_reply_to":"d111490f_45273df3","updated":"2025-08-27 22:38:59.000000000","message":"Done","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86b553c31e293b049647e2bd7825391df4dd0e69","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    if ip_address:"},{"line_number":45,"context_line":"        query \u003d query.filter("},{"line_number":46,"context_line":"            models_v2.Port.allowed_address_pairs.any("},{"line_number":47,"context_line":"                AllowedAddressPair.ip_address \u003d\u003d ip_address))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    if mac_address:"},{"line_number":50,"context_line":"        query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":3,"id":"0d2b9ddb_532ac1b9","line":47,"range":{"start_line":47,"start_character":49,"end_line":47,"end_character":59},"updated":"2025-08-27 07:50:22.000000000","message":"nit: same as other filters, the ``ip_address`` could be a single value (string) or a list of them. I think we should consider that (same comment for ``mac_address``). Maybe something like:\n```\nfrom collections import abc\n\nip_address \u003d allowed_pairs_filter.get(\u0027ip_address\u0027)\nif ip_address:\n    if not isinstance(ip_address, abc.Iterable):\n        ip_address \u003d [ip_address]\n    _criteria \u003d allowed_address_pair.AllowedAddressPair.ip_address.in_(ip_address)\n    query \u003d query.filter(Port.allowed_address_pairs.any(_criteria))\n```","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"fa44232303931cc2e02f47ececd18ac3895c9006","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    if ip_address:"},{"line_number":45,"context_line":"        query \u003d query.filter("},{"line_number":46,"context_line":"            models_v2.Port.allowed_address_pairs.any("},{"line_number":47,"context_line":"                AllowedAddressPair.ip_address \u003d\u003d ip_address))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    if mac_address:"},{"line_number":50,"context_line":"        query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":3,"id":"f60ad59c_72b8c9fe","line":47,"range":{"start_line":47,"start_character":49,"end_line":47,"end_character":59},"in_reply_to":"0d2b9ddb_532ac1b9","updated":"2025-08-27 22:38:59.000000000","message":"I once again am reminded that I hate that string types are also Iterables. Done","commit_id":"9f1f8d55d7313f1e11930dbb972b2273a679cc18"}]}
