)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"b1985306422abbf45e3c97b3bd055865b6b24d5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d653eb44_64149cf7","updated":"2026-10-20 07:37:58.000000000","message":"check experimental","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"a374c5c0fb828e8941ceee15888dc408772adae0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"25ac4fd0_411f7619","updated":"2026-10-20 09:26:24.000000000","message":"neutron-ovn-evpn-tempest-multinode passes with this patch:\nhttps://zuul.opendev.org/t/openstack/build/9664d04aa8614c2a83f9b2f3584838dc\n\nthe new WNTP test that found LP#2171425 passes with this patch:\nhttps://zuul.opendev.org/t/openstack/build/9841a6e9ef974bc280acd41d1216f754","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"ab71ee72eec4b558a9c13cef464e7cd931f54e69","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"74f687e2_45abeeec","updated":"2026-10-20 16:48:15.000000000","message":"overall, lgtm. Just few questions","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"51d64fb214ff41ae9fbd7a3e7ebd26fd9b5317e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"843eebff_91fd2748","updated":"2026-10-21 01:36:59.000000000","message":"Thanks","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"3a8baea072bd412731461119dae7ec7f0d3c3460","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b65a8849_9383103c","updated":"2026-10-21 06:32:17.000000000","message":"check experimental","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"cb0085efca3ebafa1bb04e2fb7b5bab4dc31726b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"69925a3e_2adc2eac","updated":"2026-10-21 07:39:41.000000000","message":"relevant jobs are green with patchset 5:\nhttps://zuul.opendev.org/t/openstack/build/d767f9a3d7d846aaa6e3616194e5a1da\nhttps://zuul.opendev.org/t/openstack/build/b89de104105c4632a0da7e8a13aff402","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"ab71ee72eec4b558a9c13cef464e7cd931f54e69","unresolved":true,"context_lines":[{"line_number":1672,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":"        # Query all port IDs that have EVPN host advertisement enabled"},{"line_number":1675,"context_line":"        port_ids \u003d evpn_models.EVPNAdvertisedPort.get_all_port_ids(context)"},{"line_number":1676,"context_line":""},{"line_number":1677,"context_line":"        if not port_ids:"},{"line_number":1678,"context_line":"            LOG.debug(\u0027No EVPN advertised ports found, skipping \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f782aa7_cfb1587c","line":1675,"range":{"start_line":1675,"start_character":31,"end_line":1675,"end_character":49},"updated":"2026-10-20 16:48:15.000000000","message":"Just asking. So we want the new `DYNAMIC_ROUTE_TYPE_STATIC` option added to all evpn ports regardless if that port has static routes or not?","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9c18d361f403b0adc7e87554e981ff91d7755fc4","unresolved":true,"context_lines":[{"line_number":1672,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":"        # Query all port IDs that have EVPN host advertisement enabled"},{"line_number":1675,"context_line":"        port_ids \u003d evpn_models.EVPNAdvertisedPort.get_all_port_ids(context)"},{"line_number":1676,"context_line":""},{"line_number":1677,"context_line":"        if not port_ids:"},{"line_number":1678,"context_line":"            LOG.debug(\u0027No EVPN advertised ports found, skipping \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"5b51d101_3b06af13","line":1675,"range":{"start_line":1675,"start_character":31,"end_line":1675,"end_character":49},"in_reply_to":"2bc10e9f_6ff062dd","updated":"2026-10-20 19:16:48.000000000","message":"if those options will always come in pair, then why not just have a constant in constants.py which would have both. I.e\n```DYNAMIC_OPTIONS \u003d f\"{},{}\".(DYNAMIC_ROUTE_TYPE_CONNECTED_AS_HOST,bgp_const.DYNAMIC_ROUTE_TYPE_STATIC)\n```\n\nThis way you dont have to worry about calling `.join` all the time and risking that you might set one option in one part of code and missing it somewhere else","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"c22253204659b712c09d87bda0478d03b523644b","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":"        # Query all port IDs that have EVPN host advertisement enabled"},{"line_number":1675,"context_line":"        port_ids \u003d evpn_models.EVPNAdvertisedPort.get_all_port_ids(context)"},{"line_number":1676,"context_line":""},{"line_number":1677,"context_line":"        if not port_ids:"},{"line_number":1678,"context_line":"            LOG.debug(\u0027No EVPN advertised ports found, skipping \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"2bc10e9f_6ff062dd","line":1675,"range":{"start_line":1675,"start_character":31,"end_line":1675,"end_character":49},"in_reply_to":"4f782aa7_cfb1587c","updated":"2026-10-20 17:14:33.000000000","message":"Yes, we have to add DYANMIC_ROUTE_TYPE_STATIC to all the LRPs for subnets that are being advertised.  These LRPs already have at least one redistribution route type and DYNAMIC_ROUTE_TYPE_STATIC is needed to not overwrite the DYNAMIC_ROUTE_TYPE_STATIC added to the logical router.","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"6943515bf29be20b8547014ef345f6de350a4fdd","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"        context \u003d n_context.get_admin_context()"},{"line_number":1673,"context_line":""},{"line_number":1674,"context_line":"        # Query all port IDs that have EVPN host advertisement enabled"},{"line_number":1675,"context_line":"        port_ids \u003d evpn_models.EVPNAdvertisedPort.get_all_port_ids(context)"},{"line_number":1676,"context_line":""},{"line_number":1677,"context_line":"        if not port_ids:"},{"line_number":1678,"context_line":"            LOG.debug(\u0027No EVPN advertised ports found, skipping \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"07922db4_461eb564","line":1675,"range":{"start_line":1675,"start_character":31,"end_line":1675,"end_character":49},"in_reply_to":"5b51d101_3b06af13","updated":"2026-10-20 20:00:13.000000000","message":"Thanks.  I had already updated to the suggestion here: https://review.opendev.org/c/openstack/neutron/+/1011409/comment/4631e7dc_618a5ce1/.","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"}],"neutron/services/evpn/commands.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"ab71ee72eec4b558a9c13cef464e7cd931f54e69","unresolved":true,"context_lines":[{"line_number":167,"context_line":"        lrp \u003d idlutils.row_by_value("},{"line_number":168,"context_line":"            self.api.idl, \u0027Logical_Router_Port\u0027,"},{"line_number":169,"context_line":"            \u0027name\u0027, self.lrp_name)"},{"line_number":170,"context_line":"        redist \u003d \",\".join([evpn_const.EVPN_LRP_REDISTRIBUTE_OPTION,"},{"line_number":171,"context_line":"                           bgp_const.DYNAMIC_ROUTE_TYPE_CONNECTED_AS_HOST])"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        ovn_utils.setkeys(lrp, \u0027options\u0027, {"}],"source_content_type":"text/x-python","patch_set":1,"id":"58a867aa_ee088586","line":170,"updated":"2026-10-20 16:48:15.000000000","message":"nit: update comment here\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/services/evpn/plugin.py#L246\nto include static? Or make the doc string generic so it does not go stale in the future.","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"c22253204659b712c09d87bda0478d03b523644b","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        lrp \u003d idlutils.row_by_value("},{"line_number":168,"context_line":"            self.api.idl, \u0027Logical_Router_Port\u0027,"},{"line_number":169,"context_line":"            \u0027name\u0027, self.lrp_name)"},{"line_number":170,"context_line":"        redist \u003d \",\".join([evpn_const.EVPN_LRP_REDISTRIBUTE_OPTION,"},{"line_number":171,"context_line":"                           bgp_const.DYNAMIC_ROUTE_TYPE_CONNECTED_AS_HOST])"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        ovn_utils.setkeys(lrp, \u0027options\u0027, {"}],"source_content_type":"text/x-python","patch_set":1,"id":"68ec0f24_cd643d96","line":170,"in_reply_to":"58a867aa_ee088586","updated":"2026-10-20 17:14:33.000000000","message":"Done","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"}],"neutron/services/evpn/constants.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"676306f0dd64430fe9e6f738619a528097b5a77c","unresolved":true,"context_lines":[{"line_number":22,"context_line":"EVPN_LSP_NAME_PATTERN \u003d \u0027evpn-lsp-%(evpn_ls_name)s-to-%(lrp_uuid)s\u0027"},{"line_number":23,"context_line":"EVPN_HCG_NAME_PREFIX \u003d \u0027evpn-hcg-\u0027"},{"line_number":24,"context_line":"EVPN_LR_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"},{"line_number":25,"context_line":"EVPN_LRP_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"}],"source_content_type":"text/x-python","patch_set":1,"id":"4631e7dc_618a5ce1","line":25,"updated":"2026-10-20 16:07:47.000000000","message":"nit: would this be more explicit?\n`EVPN_LRP_REDISTRIBUTE_OPTION \u003d EVPN_LR_REDISTRIBUTE_OPTION`","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"6943515bf29be20b8547014ef345f6de350a4fdd","unresolved":false,"context_lines":[{"line_number":22,"context_line":"EVPN_LSP_NAME_PATTERN \u003d \u0027evpn-lsp-%(evpn_ls_name)s-to-%(lrp_uuid)s\u0027"},{"line_number":23,"context_line":"EVPN_HCG_NAME_PREFIX \u003d \u0027evpn-hcg-\u0027"},{"line_number":24,"context_line":"EVPN_LR_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"},{"line_number":25,"context_line":"EVPN_LRP_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"}],"source_content_type":"text/x-python","patch_set":1,"id":"bd3bfb70_5d79adac","line":25,"in_reply_to":"2094a40e_2d628448","updated":"2026-10-20 20:00:13.000000000","message":"Done","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3f884059fc3e16f97a99d2b179094067df6c5e3b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"EVPN_LSP_NAME_PATTERN \u003d \u0027evpn-lsp-%(evpn_ls_name)s-to-%(lrp_uuid)s\u0027"},{"line_number":23,"context_line":"EVPN_HCG_NAME_PREFIX \u003d \u0027evpn-hcg-\u0027"},{"line_number":24,"context_line":"EVPN_LR_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"},{"line_number":25,"context_line":"EVPN_LRP_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"}],"source_content_type":"text/x-python","patch_set":1,"id":"363cc329_fbf29e9a","line":25,"in_reply_to":"4631e7dc_618a5ce1","updated":"2026-10-20 17:19:46.000000000","message":"Done","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c2d69cac07b6b6e0cc6cdf19e79a7089905eaff2","unresolved":true,"context_lines":[{"line_number":22,"context_line":"EVPN_LSP_NAME_PATTERN \u003d \u0027evpn-lsp-%(evpn_ls_name)s-to-%(lrp_uuid)s\u0027"},{"line_number":23,"context_line":"EVPN_HCG_NAME_PREFIX \u003d \u0027evpn-hcg-\u0027"},{"line_number":24,"context_line":"EVPN_LR_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"},{"line_number":25,"context_line":"EVPN_LRP_REDISTRIBUTE_OPTION \u003d bgp_const.DYNAMIC_ROUTE_TYPE_STATIC"}],"source_content_type":"text/x-python","patch_set":1,"id":"2094a40e_2d628448","line":25,"in_reply_to":"4631e7dc_618a5ce1","updated":"2026-10-20 17:21:48.000000000","message":"I think I commented on one of the original patches to have a constant per resource, each consisting of list of constants where each is the string, to have it generic and extensible. Then whenever we configure LR or LRP, we\u0027d just have the list ready instead of forming the list every time we do the configuration. Something like:\n```\nEVPN_LRP_REDISTRIBUTE_OPTION_STR \u003d \u0027,\u0027.join([\n    bgp_const.DYNAMIC_ROUTE_TYPE_CONNECTED_AS_HOST,\n    bgp_const.DYNAMIC_ROUTE_TYPE_STATIC])\n```\nand then we\u0027d always pass `EVPN_LRP_REDISTRIBUTE_OPTION_STR` to the db_set or other actions as it will be less code-error prone and will be consistent everywhere.","commit_id":"c8e089b1e4e4ee062c2afbb206ac0ec725da630d"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_maintenance.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0fa9652a22cf4c919f319adc03ccd39eeb2a3a99","unresolved":true,"context_lines":[{"line_number":1879,"context_line":"        evpn_helper.advertise_port("},{"line_number":1880,"context_line":"            self.context, port_id, net[\u0027id\u0027], router_id)"},{"line_number":1881,"context_line":""},{"line_number":1882,"context_line":"        if lrp_redistribute:"},{"line_number":1883,"context_line":"            self.nb_api.db_set("},{"line_number":1884,"context_line":"                \u0027Logical_Router_Port\u0027, lrp_name,"},{"line_number":1885,"context_line":"                (\u0027options\u0027, {"}],"source_content_type":"text/x-python","patch_set":5,"id":"6baef69a_f5ad2432","line":1882,"updated":"2026-10-21 13:33:43.000000000","message":"Is this ever used? Or was there supposed to be a test that no option set on the LRP?","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"}],"neutron/tests/functional/services/evpn/test_commands.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d80fd398820946545eed2acd949632b92608d629","unresolved":true,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        lrp \u003d self.nb_api.lrp_get(lrp_name).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"        self.assertEqual("},{"line_number":336,"context_line":"            evpn_const.EVPN_LRP_REDISTRIBUTE_OPTION,"},{"line_number":337,"context_line":"            lrp.options.get("},{"line_number":338,"context_line":"                bgp_const.LR_OPTIONS_DYNAMIC_ROUTING_REDISTRIBUTE))"},{"line_number":339,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":5,"id":"4ae5c9f2_421b99c4","line":336,"range":{"start_line":336,"start_character":12,"end_line":336,"end_character":51},"updated":"2026-10-21 13:56:58.000000000","message":"This makes me (only a little) uncomfortable just that we are treating a comma-joined logical tuple as a hardcoded and ordered string. If there ever were other options added, and they weren\u0027t all-or-nothing, the tests would have to change, etc. I\u0027d be happiest with us coming up with a general solution to all of our string-encoded lists in external_ids/options, but something like a helper function that takes a field and returns a set of values that we could compare w/ in and equality would work.","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"66cfb6d39ac99ede5593d3ab932978fed15a52f1","unresolved":true,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        lrp \u003d self.nb_api.lrp_get(lrp_name).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"        self.assertEqual("},{"line_number":336,"context_line":"            evpn_const.EVPN_LRP_REDISTRIBUTE_OPTION,"},{"line_number":337,"context_line":"            lrp.options.get("},{"line_number":338,"context_line":"                bgp_const.LR_OPTIONS_DYNAMIC_ROUTING_REDISTRIBUTE))"},{"line_number":339,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":5,"id":"61fb8e1a_abecd2e1","line":336,"range":{"start_line":336,"start_character":12,"end_line":336,"end_character":51},"in_reply_to":"4ae5c9f2_421b99c4","updated":"2026-10-21 13:59:35.000000000","message":"would `\u0027,\u0027.join(sorted(\u003cthe_list\u003e))` as a constant solve this?","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d47edf1deb0884a2e14873740bdcfd8f5ca7bbd7","unresolved":true,"context_lines":[{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        lrp \u003d self.nb_api.lrp_get(lrp_name).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"        self.assertEqual("},{"line_number":336,"context_line":"            evpn_const.EVPN_LRP_REDISTRIBUTE_OPTION,"},{"line_number":337,"context_line":"            lrp.options.get("},{"line_number":338,"context_line":"                bgp_const.LR_OPTIONS_DYNAMIC_ROUTING_REDISTRIBUTE))"},{"line_number":339,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":5,"id":"5a162d59_ca636bec","line":336,"range":{"start_line":336,"start_character":12,"end_line":336,"end_character":51},"in_reply_to":"61fb8e1a_abecd2e1","updated":"2026-10-21 14:20:38.000000000","message":"For that, since the constant is already a specific order, and we are just testing equality, I don\u0027t think sorting would make much difference. It was more that there might be more options in the future and different combinations of options could be represented in code and doing equality across the whole option string wouldn\u0027t always make sense, etc. Being able to treat the options as individual options in a set with \"in\" and \"subset\" comparisons seemed like it would make sense.\n\nIt also doesn\u0027t really matter at all with the current code as-is.","commit_id":"4bc05568fd671900fac10d8f2a2f38c7809df576"}]}
