)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"ffa83bfc7567716d8f6a29ff23c174294399d600","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"1dcaa638_693f0ac2","updated":"2026-08-24 07:43:51.000000000","message":"recheck unrelated failure neutron.tests.functional.agent.linux.evpn_router.frr.test_frr_driver.TestFrrVtyshDriverOperation.test_multiple_routers_then_delete_one","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"11b04357e8526003e1ee52923855ca4dc7c7d58b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"5965837b_adfc13e4","updated":"2026-08-25 15:55:14.000000000","message":"Thanks for the review! I went over the steps and also added another test to ensure community-related ACLs get correctly assigned to promiscuous PG on repair.","commit_id":"b034959352a0453c71ac179b6f37d5d4e7c5c4bd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6507a97ca6121d7942d6e81ffc157e02442129f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"45f9520e_27d56499","updated":"2026-08-26 13:51:21.000000000","message":"recheck - unrelated functional test failure in \"expected update_router_port hasn\u0027t been called\"","commit_id":"b034959352a0453c71ac179b6f37d5d4e7c5c4bd"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"bc2f1b2bbb34e98d460324dc7d0c673c42174b38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"59e1c01d_7ce9c637","updated":"2026-08-26 08:51:46.000000000","message":"recheck unrelated error in neutron-ovn-tempest-ipv6-only-ovs-release\nE: Unable to locate package ksmtuned","commit_id":"b034959352a0453c71ac179b6f37d5d4e7c5c4bd"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b01ef05f63e788aac7f3e2104d0b806899357e77","unresolved":false,"context_lines":[{"line_number":483,"context_line":"                    break"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        # ADD PGs for PVLAN:"},{"line_number":487,"context_line":"        # 1. pvlan_pg_drop. Is it present (later we need to make sure all pvlan ports are added)"},{"line_number":488,"context_line":"        if not ovn_pgs[self.pvlan_driver.DROP_PORT_GROUP_NAME]:"},{"line_number":489,"context_line":"            LOG.warning(\"%s not found in OVN NB DB. Recreating...\","}],"source_content_type":"text/x-python","patch_set":1,"id":"e7cc94f9_9193863f","line":486,"updated":"2026-08-14 17:49:45.000000000","message":"pep8: E501 line too long (96 \u003e 79 characters)","commit_id":"f33c5a44298c95a2aabaae8e604080281ed9abd0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b01ef05f63e788aac7f3e2104d0b806899357e77","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            LOG.warning(\"%s not found in OVN NB DB. Recreating...\","},{"line_number":490,"context_line":"                        self.pvlan_driver.DROP_PORT_GROUP_NAME)"},{"line_number":491,"context_line":"            # Recreate it:"},{"line_number":492,"context_line":"            pvlan_ovn.create_pvlan_pg_drop()"},{"line_number":493,"context_line":"            #TODO: If drop port was deleted, we need to repopulate it, so running create pvlan port"},{"line_number":494,"context_line":"            # will re-add them to the PG. Since we cannot have duplicate ownership, this is safe to do."},{"line_number":495,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ae8d6a80_dbee0a77","line":492,"updated":"2026-08-14 17:49:45.000000000","message":"pep8: E501 line too long (100 \u003e 79 characters)","commit_id":"f33c5a44298c95a2aabaae8e604080281ed9abd0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b01ef05f63e788aac7f3e2104d0b806899357e77","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            LOG.warning(\"%s not found in OVN NB DB. Recreating...\","},{"line_number":490,"context_line":"                        self.pvlan_driver.DROP_PORT_GROUP_NAME)"},{"line_number":491,"context_line":"            # Recreate it:"},{"line_number":492,"context_line":"            pvlan_ovn.create_pvlan_pg_drop()"},{"line_number":493,"context_line":"            #TODO: If drop port was deleted, we need to repopulate it, so running create pvlan port"},{"line_number":494,"context_line":"            # will re-add them to the PG. Since we cannot have duplicate ownership, this is safe to do."},{"line_number":495,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9d95c1e2_6071fc3a","line":492,"updated":"2026-08-14 17:49:45.000000000","message":"pep8: H101: Use TODO(NAME)","commit_id":"f33c5a44298c95a2aabaae8e604080281ed9abd0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b01ef05f63e788aac7f3e2104d0b806899357e77","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                        self.pvlan_driver.DROP_PORT_GROUP_NAME)"},{"line_number":491,"context_line":"            # Recreate it:"},{"line_number":492,"context_line":"            pvlan_ovn.create_pvlan_pg_drop()"},{"line_number":493,"context_line":"            #TODO: If drop port was deleted, we need to repopulate it, so running create pvlan port"},{"line_number":494,"context_line":"            # will re-add them to the PG. Since we cannot have duplicate ownership, this is safe to do."},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"        # Gather ALL existing NetworkPVLAN in neutron"}],"source_content_type":"text/x-python","patch_set":1,"id":"c129ef01_50029054","line":493,"updated":"2026-08-14 17:49:45.000000000","message":"pep8: E501 line too long (103 \u003e 79 characters)","commit_id":"f33c5a44298c95a2aabaae8e604080281ed9abd0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b01ef05f63e788aac7f3e2104d0b806899357e77","unresolved":false,"context_lines":[{"line_number":496,"context_line":"        # Gather ALL existing NetworkPVLAN in neutron"},{"line_number":497,"context_line":"        pvlan_networks \u003d pvlan_obj.NetworkPVLAN.get_objects(ctx, pvlan\u003dTrue)"},{"line_number":498,"context_line":"        pvlan_ports \u003d pvlan_obj.PortPVLAN.get_objects(ctx)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":""},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        add_pgs \u003d neutron_pgs.difference(ovn_pgs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2b8856a8_1663d377","line":499,"updated":"2026-08-14 17:49:45.000000000","message":"pep8: F821 undefined name \u0027neutron_pgs\u0027","commit_id":"f33c5a44298c95a2aabaae8e604080281ed9abd0"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b01ef05f63e788aac7f3e2104d0b806899357e77","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        pvlan_networks \u003d pvlan_obj.NetworkPVLAN.get_objects(ctx, pvlan\u003dTrue)"},{"line_number":498,"context_line":"        pvlan_ports \u003d pvlan_obj.PortPVLAN.get_objects(ctx)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":""},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"        add_pgs \u003d neutron_pgs.difference(ovn_pgs)"},{"line_number":503,"context_line":"        remove_pgs \u003d ovn_pgs.difference(neutron_pgs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"55ac24a2_670e621f","line":500,"updated":"2026-08-14 17:49:45.000000000","message":"pep8: F821 undefined name \u0027neutron_pgs\u0027","commit_id":"f33c5a44298c95a2aabaae8e604080281ed9abd0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4389fb96ef5d8e98ba6f6991871cb4b51bb879a8","unresolved":true,"context_lines":[{"line_number":96,"context_line":"                self.pvlan_driver \u003d pvlan_ovn.PVLANDriver(self.ovn_driver)"},{"line_number":97,"context_line":"                pvlan_plugin.register_driver(self.pvlan_driver)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            self.pvlan_driver \u003d None"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def stop(self):"},{"line_number":102,"context_line":"        if utils.is_ovn_l3(self.l3_plugin):"}],"source_content_type":"text/x-python","patch_set":7,"id":"06c98e4c_d4b58932","line":99,"updated":"2026-08-24 09:56:19.000000000","message":"nit: you can do it like:\n\n    self.pvlan_driver \u003d None\n    if pvlan_plugin:\n        self.pvlan_driver \u003d pvlan_plugin.driver\n        if not self.pvlan_driver:\n            self.pvlan_driver \u003d pvlan_ovn.PVLANDriver(self.ovn_driver)\n            pvlan_plugin.register_driver(self.pvlan_driver)\n            \nThat way you won\u0027t have that \"else\" block","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"11b04357e8526003e1ee52923855ca4dc7c7d58b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                self.pvlan_driver \u003d pvlan_ovn.PVLANDriver(self.ovn_driver)"},{"line_number":97,"context_line":"                pvlan_plugin.register_driver(self.pvlan_driver)"},{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            self.pvlan_driver \u003d None"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def stop(self):"},{"line_number":102,"context_line":"        if utils.is_ovn_l3(self.l3_plugin):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3c7c37a9_75545e13","line":99,"in_reply_to":"06c98e4c_d4b58932","updated":"2026-08-25 15:55:14.000000000","message":"Done","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4389fb96ef5d8e98ba6f6991871cb4b51bb879a8","unresolved":true,"context_lines":[{"line_number":579,"context_line":"        return valid"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def _sanitize_pvlan_network(self, ctx, pvlan_network,"},{"line_number":582,"context_line":"                               ovn_pgs):"},{"line_number":583,"context_line":"        network_id \u003d pvlan_network.network_id"},{"line_number":584,"context_line":"        net_ports \u003d ports_obj.Port.get_objects("},{"line_number":585,"context_line":"            ctx, network_id\u003dnetwork_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"48556a20_c6feb242","line":582,"updated":"2026-08-24 09:56:19.000000000","message":"nitty nit: please fix allignment","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"11b04357e8526003e1ee52923855ca4dc7c7d58b","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        return valid"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def _sanitize_pvlan_network(self, ctx, pvlan_network,"},{"line_number":582,"context_line":"                               ovn_pgs):"},{"line_number":583,"context_line":"        network_id \u003d pvlan_network.network_id"},{"line_number":584,"context_line":"        net_ports \u003d ports_obj.Port.get_objects("},{"line_number":585,"context_line":"            ctx, network_id\u003dnetwork_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"38ffcc59_497c5358","line":582,"in_reply_to":"48556a20_c6feb242","updated":"2026-08-25 15:55:14.000000000","message":"Done","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4389fb96ef5d8e98ba6f6991871cb4b51bb879a8","unresolved":true,"context_lines":[{"line_number":687,"context_line":"            pvlan_ovn.ISOLATED_PORT_GROUP_PREFIX,"},{"line_number":688,"context_line":"            pvlan_ovn.PROMISCUOUS_PORT_GROUP_PREFIX,"},{"line_number":689,"context_line":"            pvlan_ovn.COMMUNITY_PORT_GROUP_PREFIX,"},{"line_number":690,"context_line":"        )"},{"line_number":691,"context_line":"        ovn_pgs \u003d {}"},{"line_number":692,"context_line":"        port_groups \u003d ("},{"line_number":693,"context_line":"            self.ovn_nb_api.db_list_rows("}],"source_content_type":"text/x-python","patch_set":7,"id":"f6204b88_cc6fca7b","line":690,"updated":"2026-08-24 09:56:19.000000000","message":"I think that the same list is also used in the maintenance.py module, maybe You could define it once in pvlan_ovn module and reuse in both places?","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"11b04357e8526003e1ee52923855ca4dc7c7d58b","unresolved":false,"context_lines":[{"line_number":687,"context_line":"            pvlan_ovn.ISOLATED_PORT_GROUP_PREFIX,"},{"line_number":688,"context_line":"            pvlan_ovn.PROMISCUOUS_PORT_GROUP_PREFIX,"},{"line_number":689,"context_line":"            pvlan_ovn.COMMUNITY_PORT_GROUP_PREFIX,"},{"line_number":690,"context_line":"        )"},{"line_number":691,"context_line":"        ovn_pgs \u003d {}"},{"line_number":692,"context_line":"        port_groups \u003d ("},{"line_number":693,"context_line":"            self.ovn_nb_api.db_list_rows("}],"source_content_type":"text/x-python","patch_set":7,"id":"c65b4402_cffbc698","line":690,"in_reply_to":"f6204b88_cc6fca7b","updated":"2026-08-25 15:55:14.000000000","message":"Done","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4389fb96ef5d8e98ba6f6991871cb4b51bb879a8","unresolved":true,"context_lines":[{"line_number":701,"context_line":"        drop_pg \u003d ovn_pgs.get(drop_name)"},{"line_number":702,"context_line":"        if not drop_pg:"},{"line_number":703,"context_line":"            LOG.warning(\"%s not found in OVN NB DB.\","},{"line_number":704,"context_line":"                        drop_name)"},{"line_number":705,"context_line":"            if self.mode \u003d\u003d n_lib_ovn_const.OVN_DB_SYNC_MODE_REPAIR:"},{"line_number":706,"context_line":"                pvlan_ovn.create_pvlan_pg_drop()"},{"line_number":707,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"4999bc8b_51f8f9df","line":704,"updated":"2026-08-24 09:56:19.000000000","message":"nitty nit: I think this can be moved to line above and it still should fit into 79 chars limit, no?","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"11b04357e8526003e1ee52923855ca4dc7c7d58b","unresolved":false,"context_lines":[{"line_number":701,"context_line":"        drop_pg \u003d ovn_pgs.get(drop_name)"},{"line_number":702,"context_line":"        if not drop_pg:"},{"line_number":703,"context_line":"            LOG.warning(\"%s not found in OVN NB DB.\","},{"line_number":704,"context_line":"                        drop_name)"},{"line_number":705,"context_line":"            if self.mode \u003d\u003d n_lib_ovn_const.OVN_DB_SYNC_MODE_REPAIR:"},{"line_number":706,"context_line":"                pvlan_ovn.create_pvlan_pg_drop()"},{"line_number":707,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ead344da_b89d00d0","line":704,"in_reply_to":"4999bc8b_51f8f9df","updated":"2026-08-25 15:55:14.000000000","message":"Done","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d7617c2043451de1854d26037fa1009fec0380d8","unresolved":true,"context_lines":[{"line_number":654,"context_line":"                    if ovn_pgs.get(comm_name):"},{"line_number":655,"context_line":"                        txn.add(self.ovn_nb_api.pg_del("},{"line_number":656,"context_line":"                            comm_name, if_exists\u003dTrue))"},{"line_number":657,"context_line":"                    self.pvlan_driver._create_community("},{"line_number":658,"context_line":"                        comm_name, network_id, txn)"},{"line_number":659,"context_line":"            if self.mode !\u003d n_lib_ovn_const.OVN_DB_SYNC_MODE_REPAIR:"},{"line_number":660,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":10,"id":"b273089c_4802fa48","line":657,"range":{"start_line":657,"start_character":38,"end_line":657,"end_character":55},"updated":"2026-08-27 08:10:19.000000000","message":"What was found by Claude.\n\nThis command will create the community if it doesn\u0027t exit. This command defaults `may_exist\u003dFalse`, that is correct.\n\nBut in this same transaction, we call L669 `pvlan_driver.create_port`, that calls again `self._create_community(pg_name, network_id, txn)`. The transaction will fail in this case.\n\nYou cannot call `_create_community` and `pvlan_driver.create_port` in the same transaction.","commit_id":"b034959352a0453c71ac179b6f37d5d4e7c5c4bd"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"805e94f3cf7d05f70996f601feb932a940e9b9e1","unresolved":true,"context_lines":[{"line_number":654,"context_line":"                    if ovn_pgs.get(comm_name):"},{"line_number":655,"context_line":"                        txn.add(self.ovn_nb_api.pg_del("},{"line_number":656,"context_line":"                            comm_name, if_exists\u003dTrue))"},{"line_number":657,"context_line":"                    self.pvlan_driver._create_community("},{"line_number":658,"context_line":"                        comm_name, network_id, txn)"},{"line_number":659,"context_line":"            if self.mode !\u003d n_lib_ovn_const.OVN_DB_SYNC_MODE_REPAIR:"},{"line_number":660,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":10,"id":"c0588b0c_9274dd6e","line":657,"range":{"start_line":657,"start_character":38,"end_line":657,"end_character":55},"in_reply_to":"b273089c_4802fa48","updated":"2026-08-27 16:20:15.000000000","message":"I fixed this by deleting the first create community and handling everything on the create port. For this to work I had to separate the transactionn in 2 so that the port creation happens once there are no community port groups that don\u0027t get created because the previous one wasn\u0027t deleted yet.","commit_id":"b034959352a0453c71ac179b6f37d5d4e7c5c4bd"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"439126a21498dd5a1db1afb068cd88aa24f81760","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"795c9068_4f2dcfbe","line":59,"updated":"2026-08-31 13:42:10.000000000","message":"Shouldn\u0027t it be its own plugin now since we have the interface for making external DB sync plugins?","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"e1146eb706bb84740c5f50435ae1a1ae52b2d75f","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"a7cf0b8c_016babaa","line":59,"in_reply_to":"795c9068_4f2dcfbe","updated":"2026-08-31 14:48:33.000000000","message":"I had no idea that could be done! Is there any info I can look about this? Since it is already working here I would still commit this (if possible) just to have it available for users and then make a follow up patch where I make it modular as needed. Luckily it shouldn\u0027t be hard since the pvlan_sync is its own function","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7927c1fbff2f0440230397acf6d4294691cb8d41","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"d2759cd2_d7abc2cb","line":59,"in_reply_to":"892f1935_0f8b5533","updated":"2026-09-02 10:41:39.000000000","message":"I\u0027m in favor of keeping it in `OvnNbSynchronizer` and execute it or not depending on the presence of the pvlan driver.","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f43fc4426e4bf778a20272e062f14d298707ccb7","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"f1399ed0_5a28f3bb","line":59,"in_reply_to":"a7cf0b8c_016babaa","updated":"2026-09-01 16:43:07.000000000","message":"Agreed, I was just curious if there was a technical reason :) You can get inspired by Terry\u0027s EVPN db sync patch https://review.opendev.org/c/openstack/neutron/+/999198 that registers the db sync plugin.","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e7c62a2d1e83096bd02f0f6e65ffb192b5c7d0e5","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"e7464006_5c7b2c57","line":59,"in_reply_to":"d2759cd2_d7abc2cb","updated":"2026-09-02 11:05:03.000000000","message":"Well, now I realize, if you execute OVN db sync, by default it will execute all loaded plugins, right? That will include pvlan too. And if we have it as an external plugin, it could be called individually, right?","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a7c4a605ce629274b4b85e9c7e38aa15f57a823f","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"0875058a_ee0b6248","line":59,"in_reply_to":"e7464006_5c7b2c57","updated":"2026-09-02 14:22:23.000000000","message":"I\u0027m fine having it either - I just wondered as I like the interface plugin Slawek created (The NB and SB are split too as plugins IIUC). And I\u0027ve always viewed service plugins as kinda independent implementations.","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"26598288e7a74b40971a7eb7b8913ee3b7f321f4","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        \u0027neutron.services.ovn_l3.plugin.OVNL3RouterPlugin\u0027,"},{"line_number":57,"context_line":"        \u0027neutron.services.segments.plugin.Plugin\u0027,"},{"line_number":58,"context_line":"        \u0027port_forwarding\u0027,"},{"line_number":59,"context_line":"        \u0027pvlan\u0027,"},{"line_number":60,"context_line":"        \u0027qos\u0027"},{"line_number":61,"context_line":"    ]"},{"line_number":62,"context_line":"    _required_ml2_ext_drivers \u003d [\u0027qos\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"892f1935_0f8b5533","line":59,"in_reply_to":"f1399ed0_5a28f3bb","updated":"2026-09-02 09:24:15.000000000","message":"Originally when I was implementing plugins for ovn db sync it wasn\u0027t my intention to move everything in e.g. neutron to own plugins. It was more to allow other projects like ovn-octavia-provider or neutron-fwaas to have own plugin to sync own resources in the same way as neutron is doing that.\nOf course now I see that it could be even better to have plugins also in neutron for different resources, like for pvlan or evpn stuff. But I\u0027m fine with both ways of doing it here. It can always be refactored later.","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c691febf2aece02b4431c03c4de8033531fa9191","unresolved":true,"context_lines":[{"line_number":620,"context_line":"                comm_ok \u003d False"},{"line_number":621,"context_line":"                invalid_comms.append(community)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        if iso_ok and prm_ok and comm_ok:"},{"line_number":624,"context_line":"            LOG.debug(\"PVLAN PGs for network %s correct.\","},{"line_number":625,"context_line":"                      network_id)"},{"line_number":626,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"76419a3b_57b6d6bc","line":623,"updated":"2026-08-31 14:00:42.000000000","message":"We reach this line. So all ports are correct. But the pvlan_pg_drop PG was delete. That means this is not restored and pvlan_pg_drop won\u0027t be created nor the ports re-added to pvlan_pg_drop.\n\nAm I right?","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"e1146eb706bb84740c5f50435ae1a1ae52b2d75f","unresolved":true,"context_lines":[{"line_number":620,"context_line":"                comm_ok \u003d False"},{"line_number":621,"context_line":"                invalid_comms.append(community)"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        if iso_ok and prm_ok and comm_ok:"},{"line_number":624,"context_line":"            LOG.debug(\"PVLAN PGs for network %s correct.\","},{"line_number":625,"context_line":"                      network_id)"},{"line_number":626,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"321a4e6c_f52bcb6c","line":623,"in_reply_to":"76419a3b_57b6d6bc","updated":"2026-08-31 14:48:33.000000000","message":"pvlan_pg_drop is not created per network, so that\u0027s why it is handled before calling this whole _sanitize_pvlan_network function. L687 to L729. Ports are always re-added to pg_drop because that is handled in L670 (create_port function from the pvlan driver makes any needed changes in OVN NBDB to have that port in every PG)","commit_id":"19429611881affdd02bdd4a8e386d8f3c2c2aa6d"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_db_sync.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"4bb924496d33792710e671df5bdb362d36ecf87f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"from neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb import ovsdb_monitor"},{"line_number":47,"context_line":"from neutron.services.portforwarding.drivers.ovn.driver import \\"},{"line_number":48,"context_line":"    OVNPortForwarding as ovn_pf"},{"line_number":49,"context_line":"from neutron.objects import pvlan as pvlan_obj"},{"line_number":50,"context_line":"from neutron.services.pvlan.drivers.ovn import driver as pvlan_ovn"},{"line_number":51,"context_line":"from neutron.services.revisions import revision_plugin"},{"line_number":52,"context_line":"from neutron.services.segments import db as segments_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"d8c1ed6d_9162d67c","line":49,"updated":"2026-08-20 14:29:13.000000000","message":"pep8: H306: imports not in alphabetical order (neutron.services.portforwarding.drivers.ovn.driver.ovnportforwarding, neutron.objects.pvlan)","commit_id":"e56eab3e52f83c090047fbe3a0f1e0c1e12a3781"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4389fb96ef5d8e98ba6f6991871cb4b51bb879a8","unresolved":true,"context_lines":[{"line_number":2431,"context_line":"        prm_after \u003d self._get_pg(prm_name)"},{"line_number":2432,"context_line":"        # UUIDs should be the same (not recreated)"},{"line_number":2433,"context_line":"        self.assertEqual(iso_before.uuid, iso_after.uuid)"},{"line_number":2434,"context_line":"        self.assertEqual(prm_before.uuid, prm_after.uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d4c58090_3f0df034","line":2434,"updated":"2026-08-24 09:56:19.000000000","message":"I think you could also add test which will make sure that sync of PVLAN ACLs will not really touch any other ACLs nor PGs in the cluster, like e.g. the ones related to SGs","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"11b04357e8526003e1ee52923855ca4dc7c7d58b","unresolved":false,"context_lines":[{"line_number":2431,"context_line":"        prm_after \u003d self._get_pg(prm_name)"},{"line_number":2432,"context_line":"        # UUIDs should be the same (not recreated)"},{"line_number":2433,"context_line":"        self.assertEqual(iso_before.uuid, iso_after.uuid)"},{"line_number":2434,"context_line":"        self.assertEqual(prm_before.uuid, prm_after.uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"845710c9_116b6a4a","line":2434,"in_reply_to":"d4c58090_3f0df034","updated":"2026-08-25 15:55:14.000000000","message":"Done","commit_id":"27ac218ee8dbca22442f6d2749aff3f6b0c58737"}],"neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_db_sync.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"86a4e57002c93cddc18783fba0fc253c16bb10ee","unresolved":false,"context_lines":[{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        self.pvlan_driver \u003d mock.Mock()"},{"line_number":1661,"context_line":"        self.pvlan_driver._get_pg_name \u003d ("},{"line_number":1662,"context_line":"            pvlan_ovn.PVLANDriver._get_pg_name.__get__("},{"line_number":1663,"context_line":"                self.pvlan_driver))"},{"line_number":1664,"context_line":"        self.synchronizer.pvlan_driver \u003d self.pvlan_driver"},{"line_number":1665,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9185fb7a_beb8f998","line":1662,"updated":"2026-08-19 17:06:23.000000000","message":"pep8: E1120: No value for argument \u0027community\u0027 in method call (no-value-for-parameter)","commit_id":"503484e0b97dca232f853af89a6e55f81ad10543"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"86a4e57002c93cddc18783fba0fc253c16bb10ee","unresolved":false,"context_lines":[{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        self.pvlan_driver \u003d mock.Mock()"},{"line_number":1661,"context_line":"        self.pvlan_driver._get_pg_name \u003d ("},{"line_number":1662,"context_line":"            pvlan_ovn.PVLANDriver._get_pg_name.__get__("},{"line_number":1663,"context_line":"                self.pvlan_driver))"},{"line_number":1664,"context_line":"        self.synchronizer.pvlan_driver \u003d self.pvlan_driver"},{"line_number":1665,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d2230e46_be53073e","line":1662,"updated":"2026-08-19 17:06:23.000000000","message":"pep8: E1120: No value for argument \u0027network_id\u0027 in method call (no-value-for-parameter)","commit_id":"503484e0b97dca232f853af89a6e55f81ad10543"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"86a4e57002c93cddc18783fba0fc253c16bb10ee","unresolved":false,"context_lines":[{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        self.pvlan_driver \u003d mock.Mock()"},{"line_number":1661,"context_line":"        self.pvlan_driver._get_pg_name \u003d ("},{"line_number":1662,"context_line":"            pvlan_ovn.PVLANDriver._get_pg_name.__get__("},{"line_number":1663,"context_line":"                self.pvlan_driver))"},{"line_number":1664,"context_line":"        self.synchronizer.pvlan_driver \u003d self.pvlan_driver"},{"line_number":1665,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"6ab2c69f_79281a91","line":1662,"updated":"2026-08-19 17:06:23.000000000","message":"pep8: E1120: No value for argument \u0027pvlan_type\u0027 in method call (no-value-for-parameter)","commit_id":"503484e0b97dca232f853af89a6e55f81ad10543"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"86a4e57002c93cddc18783fba0fc253c16bb10ee","unresolved":false,"context_lines":[{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        self.pvlan_driver \u003d mock.Mock()"},{"line_number":1661,"context_line":"        self.pvlan_driver._get_pg_name \u003d ("},{"line_number":1662,"context_line":"            pvlan_ovn.PVLANDriver._get_pg_name.__get__("},{"line_number":1663,"context_line":"                self.pvlan_driver))"},{"line_number":1664,"context_line":"        self.synchronizer.pvlan_driver \u003d self.pvlan_driver"},{"line_number":1665,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"0f70141b_c9596e4f","line":1662,"updated":"2026-08-19 17:06:23.000000000","message":"pep8: E1120: No value for argument \u0027type\u0027 in method call (no-value-for-parameter)","commit_id":"503484e0b97dca232f853af89a6e55f81ad10543"}]}
