)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"604e6e183973e0ccf7cc022c22e6e0f4fa3bb6d3","unresolved":true,"context_lines":[{"line_number":15,"context_line":"are created on demand at priority 1012 when a port is assigned a"},{"line_number":16,"context_line":"community name, and removed when the last port leaves."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Unit and functional tests have been created with the assistance of"},{"line_number":19,"context_line":"claude-4.6-opus-high."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This commit is a follow-up of https://review.opendev.org/c/openstack/neutron/+/978798"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"46f3fcd6_1e3a1d65","line":19,"range":{"start_line":18,"start_character":0,"end_line":19,"end_character":21},"updated":"2026-06-03 10:48:13.000000000","message":"nit: better to add ``Assisted-By: claude-4.6-opus-high``","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2626791a131389aac2cf1cf6003c9720de57d0b4","unresolved":false,"context_lines":[{"line_number":15,"context_line":"are created on demand at priority 1012 when a port is assigned a"},{"line_number":16,"context_line":"community name, and removed when the last port leaves."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Unit and functional tests have been created with the assistance of"},{"line_number":19,"context_line":"claude-4.6-opus-high."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This commit is a follow-up of https://review.opendev.org/c/openstack/neutron/+/978798"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"a22c69ce_e379c135","line":19,"range":{"start_line":18,"start_character":0,"end_line":19,"end_character":21},"in_reply_to":"46f3fcd6_1e3a1d65","updated":"2026-06-03 13:05:46.000000000","message":"Done","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"d4e196f9800965ca525594cbb0540896a1f9bd8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"690c49f8_f750ff55","updated":"2026-05-06 15:02:24.000000000","message":"I found out there\u0027s something wrong with ACLs, bringing it back to WIP until it is fixed","commit_id":"9ac62ea0788bc98240dad7e0231194dd987b2fc2"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2bc614f0b3cac26d8eda94526d548f864977f34e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"cc8950e7_81007aea","updated":"2026-05-06 09:04:40.000000000","message":"recheck\nI don\u0027t see much relation between failures and the patchset:\nsetUpClass (tempest.api.compute.servers.test_server_actions.ServerActionsTestOtherA)","commit_id":"9ac62ea0788bc98240dad7e0231194dd987b2fc2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"834b26b242d7fb4ca43c278e2d7893e351c5081d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"31fe244e_f5c5837a","updated":"2026-06-03 09:32:33.000000000","message":"This looks good for me. I\u0027ve also tested it locally and works good from what I\u0027ve checked.\n\nAs follow-up patch we will need one more change to add documentation and release note. \n\nFor documentation I think that most important will be to have:\n1. how to enable and use this featue in general,\n2. description of internals, how it is implemented in OVN actually, with some examples,\n3. current limitations, like e.g. info that port which is in the network with enabled PVLAN but don\u0027t have pvlan_type set behaves like promiscuous port or info that ARPs works even between isolated and community ports as they are replied locally by OVN so ACLs don\u0027t block them","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"}],"neutron/services/pvlan/drivers/ovn/driver.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5f9bf6fea3edf2a80c3baaab1ee593ca6b2c2fd3","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _create_isolated_port_group():"},{"line_number":41,"context_line":"    to_match \u003d \"outport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ISOLATED_PORT_GROUP_NAME"},{"line_number":42,"context_line":"    from_match \u003d \"inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ISOLATED_PORT_GROUP_NAME"},{"line_number":43,"context_line":"    command \u003d ["},{"line_number":44,"context_line":"        \"OVN_Northbound\", {"}],"source_content_type":"text/x-python","patch_set":19,"id":"65aacdb3_499a4809","line":41,"range":{"start_line":41,"start_character":34,"end_line":41,"end_character":46},"updated":"2026-05-13 13:34:12.000000000","message":"I know that was in the PoC script initially but do we really need this condition? Wouldn\u0027t it work for all the traffic if match would be simply \"outport \u003d\u003d ISOLATED_PORT_GROUP_NAME\" ? Can you check it? And the same applies to all other places in this file too","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"487c963d49730d4f7f9c2e243f71ab1ba71c24a5","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _create_isolated_port_group():"},{"line_number":41,"context_line":"    to_match \u003d \"outport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ISOLATED_PORT_GROUP_NAME"},{"line_number":42,"context_line":"    from_match \u003d \"inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ISOLATED_PORT_GROUP_NAME"},{"line_number":43,"context_line":"    command \u003d ["},{"line_number":44,"context_line":"        \"OVN_Northbound\", {"}],"source_content_type":"text/x-python","patch_set":19,"id":"2f97ea4d_02b85e42","line":41,"range":{"start_line":41,"start_character":34,"end_line":41,"end_character":46},"in_reply_to":"65aacdb3_499a4809","updated":"2026-05-28 21:31:30.000000000","message":"Done","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5f9bf6fea3edf2a80c3baaab1ee593ca6b2c2fd3","unresolved":true,"context_lines":[{"line_number":87,"context_line":"    from_match \u003d \"inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % PROMISCUOUS_PORT_GROUP_NAME"},{"line_number":88,"context_line":"    iso_from_match \u003d \"inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ISOLATED_PORT_GROUP_NAME"},{"line_number":89,"context_line":"    iso_to_match \u003d \"outport \u003d\u003d @%s \u0026\u0026 inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ("},{"line_number":90,"context_line":"        ISOLATED_PORT_GROUP_NAME, PROMISCUOUS_PORT_GROUP_NAME)"},{"line_number":91,"context_line":"    command \u003d ["},{"line_number":92,"context_line":"        \"OVN_Northbound\", {"},{"line_number":93,"context_line":"            \"op\": \"wait\","}],"source_content_type":"text/x-python","patch_set":19,"id":"8081b29e_05762643","line":90,"updated":"2026-05-13 13:34:12.000000000","message":"is it ok to have only one group for all ports? Don\u0027t we need to have group \"per network\"? I think that in the spec it was mentioned that each PG will be \"for network\"","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"487c963d49730d4f7f9c2e243f71ab1ba71c24a5","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    from_match \u003d \"inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % PROMISCUOUS_PORT_GROUP_NAME"},{"line_number":88,"context_line":"    iso_from_match \u003d \"inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ISOLATED_PORT_GROUP_NAME"},{"line_number":89,"context_line":"    iso_to_match \u003d \"outport \u003d\u003d @%s \u0026\u0026 inport \u003d\u003d @%s \u0026\u0026 (ip || arp)\" % ("},{"line_number":90,"context_line":"        ISOLATED_PORT_GROUP_NAME, PROMISCUOUS_PORT_GROUP_NAME)"},{"line_number":91,"context_line":"    command \u003d ["},{"line_number":92,"context_line":"        \"OVN_Northbound\", {"},{"line_number":93,"context_line":"            \"op\": \"wait\","}],"source_content_type":"text/x-python","patch_set":19,"id":"0a0c5422_54bfc5c7","line":90,"in_reply_to":"8081b29e_05762643","updated":"2026-05-28 21:31:30.000000000","message":"Done","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5f9bf6fea3edf2a80c3baaab1ee593ca6b2c2fd3","unresolved":true,"context_lines":[{"line_number":259,"context_line":"            may_exist\u003dTrue))"},{"line_number":260,"context_line":"        txn.add(self.nb_ovn.pg_acl_add("},{"line_number":261,"context_line":"            **self.define_community_acl(pg_name, \"from-lport\"),"},{"line_number":262,"context_line":"            may_exist\u003dTrue))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def define_community_acl(self, pg_name, direction):"},{"line_number":265,"context_line":"        pg \u003d PROMISCUOUS_PORT_GROUP_NAME"}],"source_content_type":"text/x-python","patch_set":19,"id":"11724a74_8a1ff4d5","line":262,"updated":"2026-05-13 13:34:12.000000000","message":"don\u0027t we need to also add ACL for the \"promiscous\" group to allow ports which belongs there traffic to/from that newly created community PG?","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"487c963d49730d4f7f9c2e243f71ab1ba71c24a5","unresolved":true,"context_lines":[{"line_number":259,"context_line":"            may_exist\u003dTrue))"},{"line_number":260,"context_line":"        txn.add(self.nb_ovn.pg_acl_add("},{"line_number":261,"context_line":"            **self.define_community_acl(pg_name, \"from-lport\"),"},{"line_number":262,"context_line":"            may_exist\u003dTrue))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def define_community_acl(self, pg_name, direction):"},{"line_number":265,"context_line":"        pg \u003d PROMISCUOUS_PORT_GROUP_NAME"}],"source_content_type":"text/x-python","patch_set":19,"id":"38adec10_cfea6d75","line":262,"in_reply_to":"11724a74_8a1ff4d5","updated":"2026-05-28 21:31:30.000000000","message":"I managed it by having an exception on the ACL community match for the promiscous pg, let me know if it doesn\u0027t make sense to you","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"6d74c262345263a5032730a5ce14e7f0e6d753b5","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            may_exist\u003dTrue))"},{"line_number":260,"context_line":"        txn.add(self.nb_ovn.pg_acl_add("},{"line_number":261,"context_line":"            **self.define_community_acl(pg_name, \"from-lport\"),"},{"line_number":262,"context_line":"            may_exist\u003dTrue))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def define_community_acl(self, pg_name, direction):"},{"line_number":265,"context_line":"        pg \u003d PROMISCUOUS_PORT_GROUP_NAME"}],"source_content_type":"text/x-python","patch_set":19,"id":"5fa0dbb4_875cbd1b","line":262,"in_reply_to":"38adec10_cfea6d75","updated":"2026-06-02 21:33:58.000000000","message":"I reworked this and it should be more aligned with PoC now!","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5f9bf6fea3edf2a80c3baaab1ee593ca6b2c2fd3","unresolved":true,"context_lines":[{"line_number":262,"context_line":"            may_exist\u003dTrue))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def define_community_acl(self, pg_name, direction):"},{"line_number":265,"context_line":"        pg \u003d PROMISCUOUS_PORT_GROUP_NAME"},{"line_number":266,"context_line":"        if direction \u003d\u003d \"to-lport\":"},{"line_number":267,"context_line":"            match \u003d ("},{"line_number":268,"context_line":"                \"outport \u003d\u003d @%s \u0026\u0026 \""}],"source_content_type":"text/x-python","patch_set":19,"id":"80e8d117_757ee127","line":265,"updated":"2026-05-13 13:34:12.000000000","message":"do you really need that additional assignment?","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"487c963d49730d4f7f9c2e243f71ab1ba71c24a5","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            may_exist\u003dTrue))"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def define_community_acl(self, pg_name, direction):"},{"line_number":265,"context_line":"        pg \u003d PROMISCUOUS_PORT_GROUP_NAME"},{"line_number":266,"context_line":"        if direction \u003d\u003d \"to-lport\":"},{"line_number":267,"context_line":"            match \u003d ("},{"line_number":268,"context_line":"                \"outport \u003d\u003d @%s \u0026\u0026 \""}],"source_content_type":"text/x-python","patch_set":19,"id":"b8a8af98_642982ad","line":265,"in_reply_to":"80e8d117_757ee127","updated":"2026-05-28 21:31:30.000000000","message":"Done","commit_id":"9b0e86a3fa197bdab986a4ef5aa92610d71dd6f1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"845801bc4d5614fc15f8b3cebb19fd27b8505076","unresolved":true,"context_lines":[{"line_number":158,"context_line":"        driver \u003d PVLANDriver.create(mech_driver\u003dmech_driver)"},{"line_number":159,"context_line":"        if driver.is_loaded:"},{"line_number":160,"context_line":"            trigger.register_driver(driver)"},{"line_number":161,"context_line":"            mech_driver._pvlan_ovn_driver \u003d driver"},{"line_number":162,"context_line":"            registry.subscribe("},{"line_number":163,"context_line":"                _initialize_pvlan_port_groups,"},{"line_number":164,"context_line":"                resources.PROCESS, events.BEFORE_SPAWN)"}],"source_content_type":"text/x-python","patch_set":25,"id":"757bf288_23d6af81","line":161,"range":{"start_line":161,"start_character":12,"end_line":161,"end_character":50},"updated":"2026-05-20 10:19:37.000000000","message":"There is no need to set this in the mech_driver. We can have a property in the OVNClient:\n\n```\nclass OVNClient:\n\n    def __init__(self, nb_idl, sb_idl):\n        self._pvlan_driver \u003d None\n        \n    @property\n    def pvlan_driver(self):\n        if self._pvlan_driver is None:\n            self._pvlan_driver \u003d directory.get_plugin(\u0027PVLAN\u0027) # NOTE: use the defined constant in n-lib.plugins.constants\n        return self._pvlan_driver\n```","commit_id":"ec135d67eebef9b5bada5c230b56dce0153196f7"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"487c963d49730d4f7f9c2e243f71ab1ba71c24a5","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        driver \u003d PVLANDriver.create(mech_driver\u003dmech_driver)"},{"line_number":159,"context_line":"        if driver.is_loaded:"},{"line_number":160,"context_line":"            trigger.register_driver(driver)"},{"line_number":161,"context_line":"            mech_driver._pvlan_ovn_driver \u003d driver"},{"line_number":162,"context_line":"            registry.subscribe("},{"line_number":163,"context_line":"                _initialize_pvlan_port_groups,"},{"line_number":164,"context_line":"                resources.PROCESS, events.BEFORE_SPAWN)"}],"source_content_type":"text/x-python","patch_set":25,"id":"af4e9b9d_f6192729","line":161,"range":{"start_line":161,"start_character":12,"end_line":161,"end_character":50},"in_reply_to":"757bf288_23d6af81","updated":"2026-05-28 21:31:30.000000000","message":"Done","commit_id":"ec135d67eebef9b5bada5c230b56dce0153196f7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"845801bc4d5614fc15f8b3cebb19fd27b8505076","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        return not getattr("},{"line_number":212,"context_line":"            self.nb_ovn.get_port_group(pg_name), \u0027ports\u0027, None)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def sync_port_groups(self):"},{"line_number":215,"context_line":"        \"\"\"Re-populate empty port groups from the DB.\"\"\""},{"line_number":216,"context_line":"        pg_names \u003d {"},{"line_number":217,"context_line":"            pvlan_const.ISOLATED_TYPE: ISOLATED_PORT_GROUP_NAME,"}],"source_content_type":"text/x-python","patch_set":25,"id":"31cce842_cde6fb68","line":214,"range":{"start_line":214,"start_character":8,"end_line":214,"end_character":24},"updated":"2026-05-20 10:19:37.000000000","message":"What is this method doing? Why it needs to be executed every time the API starts? \nThis method will be executed from all API workers. Should this be in an OVN maintenance task?","commit_id":"ec135d67eebef9b5bada5c230b56dce0153196f7"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"487c963d49730d4f7f9c2e243f71ab1ba71c24a5","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        return not getattr("},{"line_number":212,"context_line":"            self.nb_ovn.get_port_group(pg_name), \u0027ports\u0027, None)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def sync_port_groups(self):"},{"line_number":215,"context_line":"        \"\"\"Re-populate empty port groups from the DB.\"\"\""},{"line_number":216,"context_line":"        pg_names \u003d {"},{"line_number":217,"context_line":"            pvlan_const.ISOLATED_TYPE: ISOLATED_PORT_GROUP_NAME,"}],"source_content_type":"text/x-python","patch_set":25,"id":"72f77eed_1f78f1c5","line":214,"range":{"start_line":214,"start_character":8,"end_line":214,"end_character":24},"in_reply_to":"31cce842_cde6fb68","updated":"2026-05-28 21:31:30.000000000","message":"We don\u0027t actually need that. I was using it to be able reset the pgs and acls everything I used systemctl restart, because I was getting inconsistencies when I started developing the driver.","commit_id":"ec135d67eebef9b5bada5c230b56dce0153196f7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"604e6e183973e0ccf7cc022c22e6e0f4fa3bb6d3","unresolved":true,"context_lines":[{"line_number":40,"context_line":"        driver \u003d PVLANDriver.create(mech_driver\u003dmech_driver)"},{"line_number":41,"context_line":"        if driver.is_loaded:"},{"line_number":42,"context_line":"            trigger.register_driver(driver)"},{"line_number":43,"context_line":"            registry.subscribe("},{"line_number":44,"context_line":"                _initialize_pvlan_pg_drop,"},{"line_number":45,"context_line":"                resources.PROCESS, events.BEFORE_SPAWN)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _initialize_pvlan_pg_drop(resource, event, trigger, payload\u003dNone):"},{"line_number":48,"context_line":"        \"\"\"Create pvlan_pg_drop Port Group."}],"source_content_type":"text/x-python","patch_set":37,"id":"0faaaa42_dd355f8a","line":45,"range":{"start_line":43,"start_character":0,"end_line":45,"end_character":55},"updated":"2026-06-03 10:48:13.000000000","message":"You should not do a subscription inside a method called by another event (AFTER_INIT).\n\nAlso you are registering a BEFORE_SPAWN event in the AFTER_INIT event.\n\nIMO:\n* The `PVLANPlugin.__init__`` ``registry.publish(PVLAN_PLUGIN, events.AFTER_INIT, self)`` is incorrect: this should be ``events.BEFORE_SPAWN``\n* Why don\u0027t you directly subscribe the `_initialize_pvlan_pg_drop` method to the (process, after_init) (not before_spawn) in L95? Same as the other subscription.","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2626791a131389aac2cf1cf6003c9720de57d0b4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        driver \u003d PVLANDriver.create(mech_driver\u003dmech_driver)"},{"line_number":41,"context_line":"        if driver.is_loaded:"},{"line_number":42,"context_line":"            trigger.register_driver(driver)"},{"line_number":43,"context_line":"            registry.subscribe("},{"line_number":44,"context_line":"                _initialize_pvlan_pg_drop,"},{"line_number":45,"context_line":"                resources.PROCESS, events.BEFORE_SPAWN)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _initialize_pvlan_pg_drop(resource, event, trigger, payload\u003dNone):"},{"line_number":48,"context_line":"        \"\"\"Create pvlan_pg_drop Port Group."}],"source_content_type":"text/x-python","patch_set":37,"id":"7f684e7f_0eb950af","line":45,"range":{"start_line":43,"start_character":0,"end_line":45,"end_character":55},"in_reply_to":"0faaaa42_dd355f8a","updated":"2026-06-03 13:05:46.000000000","message":"Done","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"834b26b242d7fb4ca43c278e2d7893e351c5081d","unresolved":true,"context_lines":[{"line_number":220,"context_line":"                            pvlan_const.PROMISCUOUS_TYPE):"},{"line_number":221,"context_line":"            pg_name \u003d self._get_pg_name(network_id, pvlan_type)"},{"line_number":222,"context_line":"        else:"},{"line_number":223,"context_line":"            return"},{"line_number":224,"context_line":"        txn.add(self.nb_ovn.pg_add_ports(pg_name, port_id))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _remove_port_from_pg(self, port_id, network_id, pvlan_type, txn,"}],"source_content_type":"text/x-python","patch_set":37,"id":"cda72197_cfdd1ef3","line":223,"updated":"2026-06-03 09:32:33.000000000","message":"nit: shouldn\u0027t we log here something about unknown/unsupported pvlan_type? Maybe even raise an exception in such case?","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2626791a131389aac2cf1cf6003c9720de57d0b4","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                            pvlan_const.PROMISCUOUS_TYPE):"},{"line_number":221,"context_line":"            pg_name \u003d self._get_pg_name(network_id, pvlan_type)"},{"line_number":222,"context_line":"        else:"},{"line_number":223,"context_line":"            return"},{"line_number":224,"context_line":"        txn.add(self.nb_ovn.pg_add_ports(pg_name, port_id))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _remove_port_from_pg(self, port_id, network_id, pvlan_type, txn,"}],"source_content_type":"text/x-python","patch_set":37,"id":"d3a7fa25_3167658d","line":223,"in_reply_to":"5c482980_c2169ddc","updated":"2026-06-03 13:05:46.000000000","message":"Done","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"604e6e183973e0ccf7cc022c22e6e0f4fa3bb6d3","unresolved":true,"context_lines":[{"line_number":220,"context_line":"                            pvlan_const.PROMISCUOUS_TYPE):"},{"line_number":221,"context_line":"            pg_name \u003d self._get_pg_name(network_id, pvlan_type)"},{"line_number":222,"context_line":"        else:"},{"line_number":223,"context_line":"            return"},{"line_number":224,"context_line":"        txn.add(self.nb_ovn.pg_add_ports(pg_name, port_id))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def _remove_port_from_pg(self, port_id, network_id, pvlan_type, txn,"}],"source_content_type":"text/x-python","patch_set":37,"id":"5c482980_c2169ddc","line":223,"in_reply_to":"cda72197_cfdd1ef3","updated":"2026-06-03 10:48:13.000000000","message":"Agree with this.","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"834b26b242d7fb4ca43c278e2d7893e351c5081d","unresolved":true,"context_lines":[{"line_number":230,"context_line":"            return"},{"line_number":231,"context_line":"        txn.add(self.nb_ovn.pg_del_ports(pg_name, port_id))"},{"line_number":232,"context_line":"        if pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE:"},{"line_number":233,"context_line":"            pg \u003d self.nb_ovn.get_port_group(pg_name)"},{"line_number":234,"context_line":"            if pg and len(pg.ports) \u003c\u003d 1:"},{"line_number":235,"context_line":"                promiscuous_pg \u003d self._get_pg_name("},{"line_number":236,"context_line":"                    network_id, pvlan_const.PROMISCUOUS_TYPE)"},{"line_number":237,"context_line":"                txn.add(self.nb_ovn.pg_acl_del(pg_name, if_exists\u003dTrue))"},{"line_number":238,"context_line":"                txn.add(self.nb_ovn.pg_del(pg_name))"},{"line_number":239,"context_line":"                txn.add(self.nb_ovn.pg_acl_del("},{"line_number":240,"context_line":"                    promiscuous_pg, direction\u003d\"from-lport\","},{"line_number":241,"context_line":"                    priority\u003dPROMISCUOUS_PRIORITY,"},{"line_number":242,"context_line":"                    match\u003d\"inport \u003d\u003d @%s\" % pg_name, if_exists\u003dTrue))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def _create_community(self, pg_name, network_id, txn):"},{"line_number":245,"context_line":"        promiscuous_pg \u003d self._get_pg_name("}],"source_content_type":"text/x-python","patch_set":37,"id":"e3b2d09e_a0c935d4","line":242,"range":{"start_line":233,"start_character":0,"end_line":242,"end_character":69},"updated":"2026-06-03 09:32:33.000000000","message":"nit: for creation of new community you have separate method below but when community is deleted you have code which handles that \"hidden\" here. I was actually going to write comment that I don\u0027t see where community cleanup is done after last port of the community is removed. But I tested it locally on devstack, saw that it works fine so I started looking again and then found it :)\n\nMaybe it would be easier to read if you would move that part to separate private method, like you have for _create_community already, wdyt?","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2626791a131389aac2cf1cf6003c9720de57d0b4","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            return"},{"line_number":231,"context_line":"        txn.add(self.nb_ovn.pg_del_ports(pg_name, port_id))"},{"line_number":232,"context_line":"        if pvlan_type \u003d\u003d pvlan_const.COMMUNITY_TYPE:"},{"line_number":233,"context_line":"            pg \u003d self.nb_ovn.get_port_group(pg_name)"},{"line_number":234,"context_line":"            if pg and len(pg.ports) \u003c\u003d 1:"},{"line_number":235,"context_line":"                promiscuous_pg \u003d self._get_pg_name("},{"line_number":236,"context_line":"                    network_id, pvlan_const.PROMISCUOUS_TYPE)"},{"line_number":237,"context_line":"                txn.add(self.nb_ovn.pg_acl_del(pg_name, if_exists\u003dTrue))"},{"line_number":238,"context_line":"                txn.add(self.nb_ovn.pg_del(pg_name))"},{"line_number":239,"context_line":"                txn.add(self.nb_ovn.pg_acl_del("},{"line_number":240,"context_line":"                    promiscuous_pg, direction\u003d\"from-lport\","},{"line_number":241,"context_line":"                    priority\u003dPROMISCUOUS_PRIORITY,"},{"line_number":242,"context_line":"                    match\u003d\"inport \u003d\u003d @%s\" % pg_name, if_exists\u003dTrue))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def _create_community(self, pg_name, network_id, txn):"},{"line_number":245,"context_line":"        promiscuous_pg \u003d self._get_pg_name("}],"source_content_type":"text/x-python","patch_set":37,"id":"a36f4bb6_b85df1d4","line":242,"range":{"start_line":233,"start_character":0,"end_line":242,"end_character":69},"in_reply_to":"e3b2d09e_a0c935d4","updated":"2026-06-03 13:05:46.000000000","message":"Done","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"604e6e183973e0ccf7cc022c22e6e0f4fa3bb6d3","unresolved":true,"context_lines":[{"line_number":271,"context_line":"        Called from OVNClient.create_port() so the port group membership"},{"line_number":272,"context_line":"        is set in the same transaction that creates the LSP."},{"line_number":273,"context_line":"        \"\"\""},{"line_number":274,"context_line":"        port_obj \u003d port_objects.Port.get_object(context, id\u003dport[\u0027id\u0027])"},{"line_number":275,"context_line":"        if not port_obj or not port_obj.pvlan_type:"},{"line_number":276,"context_line":"            return"},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"4b39d5ce_e33a44e7","line":274,"range":{"start_line":274,"start_character":8,"end_line":274,"end_character":71},"updated":"2026-06-03 10:48:13.000000000","message":"Do we need to retrieve the port again? We are passing `port` in the arguments.","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2626791a131389aac2cf1cf6003c9720de57d0b4","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        Called from OVNClient.create_port() so the port group membership"},{"line_number":272,"context_line":"        is set in the same transaction that creates the LSP."},{"line_number":273,"context_line":"        \"\"\""},{"line_number":274,"context_line":"        port_obj \u003d port_objects.Port.get_object(context, id\u003dport[\u0027id\u0027])"},{"line_number":275,"context_line":"        if not port_obj or not port_obj.pvlan_type:"},{"line_number":276,"context_line":"            return"},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"8a7ed016_09b38439","line":274,"range":{"start_line":274,"start_character":8,"end_line":274,"end_character":71},"in_reply_to":"4b39d5ce_e33a44e7","updated":"2026-06-03 13:05:46.000000000","message":"Done","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"}],"neutron/services/pvlan/pvlan_plugin.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"604e6e183973e0ccf7cc022c22e6e0f4fa3bb6d3","unresolved":true,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        if network.pvlan:"},{"line_number":205,"context_line":"            self._driver.create_network_resources(network_id)"},{"line_number":206,"context_line":"        else:"},{"line_number":207,"context_line":"            self._driver.delete_network_resources(network_id, context)"},{"line_number":208,"context_line":"        for port in port_object.Port.get_objects("},{"line_number":209,"context_line":"                context, network_id\u003dnetwork_id):"},{"line_number":210,"context_line":"            prev_pvlan_type \u003d port.pvlan_type"}],"source_content_type":"text/x-python","patch_set":37,"id":"a47bd487_44030550","line":207,"range":{"start_line":206,"start_character":8,"end_line":207,"end_character":70},"updated":"2026-06-03 10:48:13.000000000","message":"Here Claude found a possible race condition. When the pvlan flag is removed, we call `delete_network_resources`. This method will delete all the PGs.\n\nBut then we\u0027ll call `_driver.update_port` (L216). That will also try to delete the PG calling `_remove_port_from_pg`. You need to add `if_exists\u003dTrue` to the `pg_del_ports` call in `_remove_port_from_pg`, to avoid this race condition.","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0a0c92833a5cb3691ce294e7ff9c6a4038ee2f9c","unresolved":true,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        if network.pvlan:"},{"line_number":205,"context_line":"            self._driver.create_network_resources(network_id)"},{"line_number":206,"context_line":"        else:"},{"line_number":207,"context_line":"            self._driver.delete_network_resources(network_id, context)"},{"line_number":208,"context_line":"        for port in port_object.Port.get_objects("},{"line_number":209,"context_line":"                context, network_id\u003dnetwork_id):"},{"line_number":210,"context_line":"            prev_pvlan_type \u003d port.pvlan_type"}],"source_content_type":"text/x-python","patch_set":37,"id":"e5d1b79d_e44d243c","line":207,"range":{"start_line":206,"start_character":8,"end_line":207,"end_character":70},"in_reply_to":"861ef15a_ffbd6fb2","updated":"2026-06-03 14:08:40.000000000","message":"This comment is not addressed.","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"2626791a131389aac2cf1cf6003c9720de57d0b4","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        if network.pvlan:"},{"line_number":205,"context_line":"            self._driver.create_network_resources(network_id)"},{"line_number":206,"context_line":"        else:"},{"line_number":207,"context_line":"            self._driver.delete_network_resources(network_id, context)"},{"line_number":208,"context_line":"        for port in port_object.Port.get_objects("},{"line_number":209,"context_line":"                context, network_id\u003dnetwork_id):"},{"line_number":210,"context_line":"            prev_pvlan_type \u003d port.pvlan_type"}],"source_content_type":"text/x-python","patch_set":37,"id":"861ef15a_ffbd6fb2","line":207,"range":{"start_line":206,"start_character":8,"end_line":207,"end_character":70},"in_reply_to":"a47bd487_44030550","updated":"2026-06-03 13:05:46.000000000","message":"Done","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b4638d7859698935c80bb2132db7bae992852db9","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        if network.pvlan:"},{"line_number":205,"context_line":"            self._driver.create_network_resources(network_id)"},{"line_number":206,"context_line":"        else:"},{"line_number":207,"context_line":"            self._driver.delete_network_resources(network_id, context)"},{"line_number":208,"context_line":"        for port in port_object.Port.get_objects("},{"line_number":209,"context_line":"                context, network_id\u003dnetwork_id):"},{"line_number":210,"context_line":"            prev_pvlan_type \u003d port.pvlan_type"}],"source_content_type":"text/x-python","patch_set":37,"id":"4a6f98a6_da9ca8de","line":207,"range":{"start_line":206,"start_character":8,"end_line":207,"end_character":70},"in_reply_to":"e5d1b79d_e44d243c","updated":"2026-06-03 14:13:55.000000000","message":"No, my bad:  txn.add(self.nb_ovn.pg_del_ports(pg_name, port_id, if_exists\u003dTrue))\nIt is there.","commit_id":"15e9ed04b559e5cdeedaaf323f0dcc9fef9f9dc6"}]}
